Consul - 故障轉移事件



在本章中,我們將學習Consul中的故障轉移事件。這將藉助以下功能完成:

  • 單叢集故障
  • Jepsen 測試
  • 多叢集故障
  • 拍攝快照

讓我們詳細瞭解一下這些內容。

單叢集故障

在單叢集故障中,放置在其中一個數據中心中的叢集開始出現故障。在每種情況下,務必確保在發生故障轉移時,系統不僅可以防止故障轉移,還可以擁有一個可以依賴的備份。為了防止Consul故障轉移事件,我們將使用稱為Consul-alerts的內容。主要專案可以在以下位置找到:https://github.com/AcalephStorage/consul-alerts

Consul-alerts是一個高可用守護程序,用於根據Consul健康檢查傳送通知和提醒。此專案在localhost:9000上執行守護程序和API,並連線到本地consul代理(localhost:8500)以及預設資料中心(dc1)。

有兩種方法可以開始使用該專案。第一種方法是透過GO安裝它。對於已安裝和配置GO的使用者,可以按照以下步驟操作:

$ go get github.com/AcalephStorage/consul-alerts
$ go install
$ consul-alerts start

最後一個命令可以輕鬆地用於覆蓋consul-alert的預設埠、資料中心選項、consul-acl令牌等。該命令也可以按如下所示編寫:

$ consul-alerts start --alert-addr = localhost:9000 --consul-addr = localhost:8500
--consul-dc = dc1 --consul-acl-token = ""

第二種方法涉及使用者使用Docker。這兩種方法在不同的場景中都同樣有用。為了在Docker上使用Consul-alerts,讓我們使用以下命令從Docker Hub拉取映象。

$ docker pull acaleph/consul-alerts

Consul-Alerts

在Docker方法中,我們可以考慮以下三個選項:

  • 使用容器本身內建的Consul代理。
  • 使用在另一個Docker容器上執行的Consul代理。
  • 使用Consul-alerts連結到遠端Consul例項。

現在讓我們詳細討論一下這些內容。

使用容器本身內建的Consul代理

讓我們使用以下命令啟動consul代理:

$ docker run -ti \
   --rm -p 9000:9000 \
   --hostname consul-alerts \
   --name consul-alerts \  
   --entrypoint = /bin/consul \
   acaleph/consul-alerts \
   agent -data-dir /data -server -bootstrap -client = 0.0.0.0

在這裡,我們正在覆蓋如標誌--entrypoint所述的Consul的入口點。同時,我們透過使用-p標誌、資料目錄/data(使用標誌-data-dir)並使用0.0.0.0作為客戶端來引導客戶端。

Entrypoint

在新終端視窗中,讓我們啟動consul-alerts選項。

$ docker exec -ti consul-alerts /bin/consul-alerts start --alertaddr = 0.0.0.0:9000
--log-level = info --watch-events --watch-checks

在這裡,在上述步驟中,我們正在執行consul-alerts以在互動模式下啟動。警報地址埠被指定為9000。監視檢查consul代理是否已啟用以及consul檢查。

Alerts Option

我們可以清楚地看到,consul警報已輕鬆啟動,並且它已透過新增consul代理註冊了一個新的健康檢查。資料中心被視為dc1,可以根據使用者進行更改。

使用在另一個Docker容器上執行的Consul代理

在這裡,您可以使用任何型別的consul映象在Docker容器上執行。使用consul-alerts映象,我們可以輕鬆地將consul容器與consul-alerts容器連結起來。這是使用--link標誌完成的。

注意 - 在使用以下命令之前,請確保consul容器已在另一個終端上執行。

$ docker run -ti \
   -p 9000:9000 \
   --hostname consul-alerts \
   --name consul-alerts \
   --link consul:consul \
   acaleph/consul-alerts start \
   --consul-addr=consul:8500 \
   --log-level = info --watch-events --watch-checks

使用Consul-alerts連結到遠端Consul例項

在這裡,我們應該使用以下命令使用Consul-alerts連結到遠端consul例項。

$ docker run -ti \
   -p 9000:9000 \
   --hostname consul-alerts \
   --name consul-alerts \
   acaleph/consul-alerts start \
   --consul-addr = remote-consul-server.domain.tdl:8500 \
   --log-level = info --watch-events --watch-checks

Jepsen 測試

Jespen是一個用於測試任何系統中的部分容錯和網路的工具。它透過在系統上建立一些隨機操作來測試系統。Jepsen是用Clojure編寫的。不幸的是,對於演示,Jepsen測試需要大量叢集形成以及資料庫系統,因此不在此處討論範圍之內。

Jepsen的工作原理是在五個不同的主機上設定要測試的資料儲存。它為要測試的資料儲存建立一個客戶端,並將五個節點中的每一個節點指向以傳送請求。它還建立了一系列特殊的客戶端,稱為“Nemesis”,這些客戶端會在叢集中造成破壞,例如,使用iptables切斷節點之間的連結。然後,它繼續對不同的節點併發地發出請求,同時交替地對網路進行分割槽和修復。

在測試執行結束時,它會修復叢集,等待叢集恢復,然後驗證系統的中間狀態和最終狀態是否符合預期。

有關Jepsen測試的更多資訊,請檢視此處

多叢集故障

在多叢集故障轉移事件期間,部署在多個數據中心的叢集無法支援為客戶提供的服務。Consul使我們能夠確保當出現此類情況之一時,Consul具有幫助您在這種情況中啟用服務的功能。

為此,我們將檢視一個專案,該專案幫助我們啟用將Consul從一個叢集複製到多個叢集。該專案為我們提供了一種使用consul-replicate守護程序跨多個Consul資料中心複製K/V對的方法。您可以在以下位置檢視此HashiCorp專案:https://github.com/hashicorp/consul-replicate。嘗試此專案的一些先決條件包括:

  • Golang
  • Docker
  • Consul
  • Git

讓我們從以下命令開始:

注意 - 在執行以下命令之前,請確保您已在機器上正確安裝和配置了Git。

$ git clone - https://github.com/hashicorp/consul-replicate.git

輸出將如以下螢幕截圖所示。

Git Clone

$ cd consul-replicate
$ make

輸出將如以下螢幕截圖所示。

Replicate

如果您在構建二進位制檔案時遇到一些問題,您也可以嘗試使用以下命令手動拉取Docker映象:

$ docker pull library/golang:1.7.4

上述命令將建立bin/consul-replicate,可以將其作為二進位制檔案呼叫。下表顯示了它涵蓋的完整子命令列表:

選項 描述
auth 基本身份驗證使用者名稱(以及可選密碼),用冒號分隔。沒有預設值。
consul* 要查詢的consul例項的位置(可以是IP地址或FQDN)以及埠。
max-stale 查詢的最大陳舊性。如果指定,Consule將把工作分配給所有伺服器,而不僅僅是領導者。預設值為0(無)。
ssl 在與Consul通訊時使用HTTPS。需要將consule伺服器配置為服務安全連線。預設值為false。
ssl-verify 透過SSL連線時驗證證書。這需要使用-ssl。預設值為true。
syslog 將日誌輸出傳送到syslog(除了stdout和stderr)。預設值為false
syslog-facility 傳送到syslog時要使用的工具。這需要使用-syslog。預設值為LOCAL
token Consul API令牌。沒有預設值。
prefix* 包括源字首,以及目標字首選項,用冒號(:)分隔。此選項是累加的,可以為要複製的多個字首多次指定。
exclude 複製期間要排除的字首。此選項是累加的,可以為要排除的多個字首多次指定。
wait 複製前等待穩定性的最小值(:最大值),用冒號(:)分隔。如果省略可選的最大值,則假定為所需最小值的4倍。沒有預設值。
retry 如果Consule在與API通訊時返回錯誤,則等待的時間量。預設值為5秒。
config 磁碟上配置檔案或配置檔案目錄的路徑,相對於當前工作目錄。在CLI上指定的的值優先於配置檔案中指定的的值。沒有預設值。
log-level 輸出的日誌級別。這適用於stdout/stderr日誌記錄以及syslog日誌記錄(如果啟用)。有效值為“debug”、“info”、“warn”和“err”。預設值為“warn”。
once 執行Consule Replicate一次並退出(與預設的守護程式行為相反)。(僅限CLI)
version 輸出版本資訊並退出。(僅限CLI)

拍攝快照

快照是在發生備份時管理Consul叢集的重要組成部分。預設情況下,Consul為我們提供了一種儲存Consul叢集快照的方法。Consul為我們提供了四個單獨的子命令,我們可以使用它們來使用consul建立快照,它們是:

  • Consul snapshot save
  • Consul snapshot agent
  • Consul snapshot inspect
  • Consul snapshot restore

讓我們詳細瞭解一下這些內容。

Consul Snapshot Save

此命令設定為檢索Consul伺服器狀態的原子時間點快照,包括鍵/值條目、服務目錄、準備好的查詢、會話和ACL。快照將儲存到提到的檔名中。

$ consul snapshot save <name-of-the-file>.snap

輸出將如以下螢幕截圖所示。

Snapshot Save

要檢查當前目錄中檔案的存在,請透過在當前目錄中執行它來檢查它。對於非領導者節點,請執行以下命令:

$ consul snapshot save -stale <name-of-file>.snap

Consul Snapshot Agent

此子命令啟動一個程序,該程序會拍攝 Consul 伺服器狀態的快照並將其儲存在本地,或者將其推送到可選的遠端儲存服務。

Snapshot Agent

Consul 快照檢查

它用於檢查 Consul 伺服器狀態的某個時間點的快照,其中包括鍵/值條目、服務目錄、已準備好的查詢、會話和 ACL。該命令可以按如下方式執行:

注意 - 請記住,以下命令只能在儲存快照的目錄中執行。

$ consul snapshot save <name-of-the-file>.snap

輸出將如以下螢幕截圖所示。

Snapshot Inspect

Consul 快照恢復

快照恢復命令用於恢復 Consul 伺服器狀態的某個時間點的快照,其中包括鍵/值條目、服務目錄、已準備好的查詢、會話和 ACL。快照從儲存的備份檔案讀取。

注意 - 請記住,以下命令只能在儲存快照的目錄中執行。

$ consul snapshot restore <name-of-the-file>.snap

輸出將如以下螢幕截圖所示。

Snapshot Restore

如果您正在使用 AWS 上的 Consul,此專案可能可以幫助您節省一些時間:https://github.com/pshima/consul-snapshot

廣告

© . All rights reserved.