redis實現HA(High Available)的兩種實現方式-Sentinel與Keepalived

來源:互聯網
上載者:User
Sentinel

先來說說Sentinel,Sentinel是redis內建的一種實現HA的方式,如果在實際應用中這種方式用的比較少,比較流行的還是KeepAlived。
Redis 的 Sentinel 系統用於管理多個 Redis 伺服器(instance), 該系統執行以下三個任務:
● 監控(Monitoring): Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常。
● 提醒(Notification): 當被監控的某個 Redis 伺服器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程式發送通知。
● 自動故障遷移(Automatic failover): 當一個主伺服器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主伺服器的其中一個從伺服器升級為新的主伺服器, 並讓失效主伺服器的其他從伺服器改為複製新的主伺服器; 當用戶端試圖串連失效的主伺服器時, 叢集也會向用戶端返回新主伺服器的地址, 使得叢集可以使用新主伺服器代替失效伺服器。
Redis Sentinel 是一個分布式系統, 你可以在一個架構中運行多個 Sentinel 進程(progress), 這些進程使用流言協議(gossip protocols)來接收關於主伺服器是否下線的資訊, 並使用投票協議(agreement protocols)來決定是否執行自動故障遷移, 以及選擇哪個從伺服器作為新的主伺服器。
雖然 Redis Sentinel 釋出為一個單獨的可執行檔 redis-sentinel , 但實際上它只是一個運行在特殊模式下的 Redis 伺服器, 你可以在啟動一個普通 Redis 伺服器時通過給定 –sentinel 選項來啟動 Redis Sentinel 。 擷取Sentinel

對於 redis-sentinel 程式, 你可以用以下命令來啟動 Sentinel 系統:

redis-sentinel /path/to/sentinel.conf

對於 redis-server 程式, 你可以用以下命令來啟動一個運行在 Sentinel 模式下的 Redis 伺服器:

redis-server /path/to/sentinel.conf --sentinel

兩種方法都可以啟動一個 Sentinel 執行個體。
啟動 Sentinel 執行個體必須指定相應的設定檔, 系統會使用設定檔來儲存 Sentinel 的目前狀態, 並在 Sentinel 重啟時通過載入設定檔來進行狀態還原。
如果啟動 Sentinel 時沒有指定相應的設定檔, 或者指定的設定檔不可寫(not writable), 那麼 Sentinel 會拒絕啟動。
Redis 源碼中包含了一個名為 sentinel.conf 的檔案, 這個檔案是一個帶有詳細注釋的 Sentinel 設定檔樣本。
運行一個 Sentinel 所需的最少配置如下所示:

sentinel monitor mymaster 127.0.0.1 6379 2sentinel down-after-milliseconds mymaster 60000sentinel failover-timeout mymaster 180000sentinel parallel-syncs mymaster 1sentinel monitor resque 192.168.1.3 6380 4sentinel down-after-milliseconds resque 10000sentinel failover-timeout resque 180000sentinel parallel-syncs resque 5

第一行配置指示 Sentinel 去監視一個名為 mymaster 的主伺服器, 這個主伺服器的 IP 位址為 127.0.0.1 , 連接埠號碼為 6379 , 而將這個主伺服器判斷為失效至少需要 2 個 Sentinel 同意 (只要同意 Sentinel 的數量不達標,自動故障遷移就不會執行)。
不過要注意, 無論你設定要多少個 Sentinel 同意才能判斷一個伺服器失效, 一個 Sentinel 都需要獲得系統中多數(majority) Sentinel 的支援, 才能發起一次自動故障遷移, 並預留一個給定的配置紀元 (configuration Epoch ,一個配置紀元就是一個新主伺服器配置的版本號碼)。
換句話說, 在只有少數(minority) Sentinel 進程正常運作的情況下, Sentinel 是不能執行自動故障遷移的。
其他選項的基本格式如下:
sentinel <選項的名字> <主伺服器的名字> <選項的值>
各個選項的功能如下:
● down-after-milliseconds 選項指定了 Sentinel 認為伺服器已經斷線所需的毫秒數。
如果伺服器在給定的毫秒數之內, 沒有返回 Sentinel 發送的 PING 命令的回複, 或者返回一個錯誤, 那麼 Sentinel 將這個伺服器標記為主觀下線(subjectively down,簡稱 SDOWN )。
不過只有一個 Sentinel 將伺服器標記為主觀下線並不一定會引起伺服器的自動故障遷移: 只有在足夠數量的 Sentinel 都將一個伺服器標記為主觀下線之後, 伺服器才會被標記為客觀下線(objectively down, 簡稱 ODOWN ), 這時自動故障遷移才會執行。
將伺服器標記為客觀下線所需的 Sentinel 數量由對主伺服器的配置決定。
● parallel-syncs 選項指定了在執行容錯移轉時, 最多可以有多少個從伺服器同時對新的主伺服器進行同步, 這個數字越小, 完成容錯移轉所需的時間就越長。
如果從伺服器被設定為允許使用到期資料集(參見對 redis.conf 檔案中對 slave-serve-stale-data 選項的說明), 那麼你可能不希望所有從伺服器都在同一時間向新的主伺服器發送同步請求, 因為儘管複製過程的絕大部分步驟都不會阻塞從伺服器, 但從伺服器在載入主伺服器發來的 RDB 檔案時, 仍然會造成從伺服器在一段時間內不能處理命令請求: 如果全部從伺服器一起對新的主伺服器進行同步, 那麼就可能會造成所有從伺服器在短時間內全部停用情況出現。
你可以通過將這個值設為 1 來保證每次只有一個從伺服器處於不能處理命令請求的狀態。
本文檔剩餘的內容將對 Sentinel 系統的其他選項進行介紹, 樣本設定檔 sentinel.conf 也對相關的選項進行了完整的注釋。 主觀下線和客觀下線

前面說過, Redis 的 Sentinel 中關於下線(down)有兩個不同的概念:
● 主觀下線(Subjectively Down, 簡稱 SDOWN)指的是單個 Sentinel 執行個體對伺服器做出的下線判斷。
● 客觀下線(Objectively Down, 簡稱 ODOWN)指的是多個 Sentinel 執行個體在對同一個伺服器做出 SDOWN 判斷, 並且通過 SENTINEL is-master-down-by-addr 命令互相交流之後, 得出的伺服器下線判斷。 (一個 Sentinel 可以通過向另一個 Sentinel 發送 SENTINEL is-master-down-by-addr 命令來詢問對方是否認為給定的伺服器已下線。)
如果一個伺服器沒有在 master-down-after-milliseconds 選項所指定的時間內, 對向它發送 PING 命令的 Sentinel 返回一個有效回複(valid reply), 那麼 Sentinel 就會將這個伺服器標記為主觀下線。
伺服器對 PING 命令的有效回複可以是以下三種回複的其中一種:
● 返回 +PONG 。
● 返回 -LOADING 錯誤。
● 返回 -MASTERDOWN 錯誤。
如果伺服器返回除以上三種回複之外的其他回複, 又或者在指定時間內沒有回複 PING 命令, 那麼 Sentinel 認為伺服器返回的回複無效(non-valid)。
注意, 一個伺服器必須在 master-down-after-milliseconds 毫秒內, 一直返回無效回複才會被 Sentinel 標記為主觀下線。
舉個例子, 如果 master-down-after-milliseconds 選項的值為 30000 毫秒(30 秒), 那麼只要伺服器能在每 29 秒之內返回至少一次有效回複, 這個伺服器就仍然會被認為是處於正常狀態的。
從主觀下線狀態切換到客觀下線狀態並沒有使用嚴格的法定人數演算法(strong quorum algorithm), 而是使用了流言協議: 如果 Sentinel 在給定的時間範圍內, 從其他 Sentinel 那裡接收到了足夠數量的主伺服器下線報告, 那麼 Sentinel 就會將主伺服器的狀態從主觀下線改變為客觀下線。 如果之後其他 Sentinel 不再報告主伺服器已下線, 那麼客觀下線狀態就會被移除。
客觀下線條件只適用於主伺服器: 對於任何其他類型的 Redis 執行個體, Sentinel 在將它們判斷為下線前不需要進行協商, 所以從伺服器或者其他 Sentinel 永遠不會達到客觀下線條件。
只要一個 Sentinel 發現某個主伺服器進入了客觀下線狀態, 這個 Sentinel 就可能會被其他 Sentinel 推選出, 並對失效的主伺服器執行自動故障遷移操作。 每個Sentinel需要定期執行的任務

● 每個 Sentinel 以每秒鐘一次的頻率向它所知的主伺服器、從伺服器以及其他 Sentinel 執行個體發送一個 PING 命令。
● 如果一個執行個體(instance)距離最後一次有效回複 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 那麼這個執行個體會被 Sentinel 標記為主觀下線。 一個有效回複可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。
● 如果一個主伺服器被標記為主觀下線, 那麼正在監視這個主伺服器的所有 Sentinel 要以每秒一次的頻率確認主伺服器的確進入了主觀下線狀態。
● 如果一個主伺服器被標記為主觀下線, 並且有足夠數量的 Sentinel (至少要達到設定檔指定的數量)在指定的時間範圍內同意這一判斷, 那麼這個主伺服器被標記為客觀下線。
● 在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有主伺服器和從伺服器發送 INFO 命令。 當一個主伺服器被 Sentinel 標記為客觀下線時, Sentinel 向下線主伺服器的所有從伺服器發送 INFO 命令的頻率會從 10 秒一次改為每秒一次。
● 當沒有足夠數量的 Sentinel 同意主伺服器已經下線, 主伺服器的客觀下線狀態就會被移除。 當主伺服器重新向 Sentinel 的 PING命令返回有效回複時, 主伺服器的主管下線狀態就會被移除。 自動探索Sentinel和從伺服器

一個 Sentinel 可以與其他多個 Sentinel 進行串連, 各個 Sentinel 之間可以互相檢查對方的可用性, 並進行資訊交換。
你無須為啟動並執行每個 Sentinel 分別設定其他 Sentinel 的地址, 因為 Sentinel 可以通過發布與訂閱功能來自動探索正在監視相同主伺服器的其他 Sentinel , 這一功能是通過向頻道 sentinel:hello 發送資訊來實現的。
與此類似, 你也不必手動列出主伺服器屬下的所有從伺服器, 因為 Sentinel 可以通過詢問主伺服器來獲得所有從伺服器的資訊。
● 每個 Sentinel 會以每兩秒一次的頻率, 通過發布與訂閱功能, 向被它監視的所有主伺服器和從伺服器的 sentinel:hello 頻道發送一條資訊, 資訊中包含了 Sentinel 的 IP 位址、連接埠號碼和運行 ID (runid)。
● 每個 Sentinel 都訂閱了被它監視的所有主伺服器和從伺服器的 sentinel:hello 頻道, 尋找之前未出現過的 sentinel (looking for unknown sentinels)。 當一個 Sentinel 發現一個新的 Sentinel 時, 它會將新的 Sentinel 添加到一個列表中, 這個列表儲存了 Sentinel 已知的, 監視同一個主伺服器的所有其他 Sentinel 。
● Sentinel 發送的資訊中還包括完整的主伺服器當前配置(configuration)。 如果一個 Sentinel 包含的主伺服器配置比另一個 Sentinel 發送的配置要舊, 那麼這個 Sentinel 會立即升級到新配置上。
● 在將一個新 Sentinel 添加到監視主伺服器的列表上面之前, Sentinel 會先檢查列表中是否已經包含了和要添加的 Sentinel 擁有相同運行 ID 或者相同地址(包括 IP 位址和連接埠號碼)的 Sentinel , 如果是的話, Sentinel 會先移除列表中已有的那些擁有相同運行 ID 或者相同地址的 Sentinel , 然後再添加新 Sentinel 。 Sentinel API

在預設情況下, Sentinel 使用 TCP 通訊埠 26379 (普通 Redis 伺服器使用的是 6379 )。
Sentinel 接受 Redis 協議格式的命令請求, 所以你可以使用 redis-cli 或者任何其他 Redis 用戶端來與 Sentinel 進行通訊。
有兩種方式可以和 Sentinel 進行通訊:
● 第一種方法是通過直接發送命令來查詢被監視 Redis 伺服器的目前狀態, 以及 Sentinel 所知道的關於其他 Sentinel 的資訊, 諸如此類。
● 另一種方法是使用發布與訂閱功能, 通過接收 Sentinel 發送的通知: 當執行容錯移轉操作, 或者某個被監視的伺服器被判斷為主觀下線或者客觀下線時, Sentinel 就會發送相應的資訊。
Sentinel 命令
以下列出的是 Sentinel 接受的命令:
● PING :返回 PONG 。
● SENTINEL masters :列出所有被監視的主伺服器,以及這些主伺服器的目前狀態。
● SENTINEL slaves :列出給定主伺服器的所有從伺服器,以及這些從伺服器的目前狀態。
● SENTINEL get-master-addr-by-name : 返回給定名字的主伺服器的 IP 位址和連接埠號碼。 如果這個主伺服器正在執行容錯移轉操作, 或者針對這個主伺服器的容錯移轉操作已經完成, 那麼這個命令返回新的主伺服器的 IP 位址和連接埠號碼。
● SENTINEL reset : 重設所有名字和給定模式 pattern 相匹配的主伺服器。 pattern 參數是一個 Glob 風格的模式。 重設操作清楚主伺服器目前的所有狀態, 包括正在執行中的容錯移轉, 並移除目前已經發現和關聯的, 主伺服器的所有從伺服器和 Sentinel 。
● SENTINEL failover : 當主伺服器失效時, 在不詢問其他 Sentinel 意見的情況下, 強制開始一次自動故障遷移 (不過發起容錯移轉的 Sentinel 會向其他 Sentinel 發送一個新的配置,其他 Sentinel 會根據這個配置進行相應的更新)。
發布與訂閱資訊
用戶端可以將 Sentinel 看作是一個只提供了訂閱功能的 Redis 伺服器: 你不可以使用 PUBLISH 命令向這個伺服器發送資訊, 但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通過訂閱給定的頻道來擷取相應的事件提醒。
一個頻道能夠接收和這個頻道的名字相同的事件。 比如說, 名為 +sdown 的頻道就可以接收所有執行個體進入主觀下線(SDOWN)狀態的事件。
通過執行 PSUBSCRIBE * 命令可以接收所有事件資訊。
以下列出的是用戶端可以通過訂閱來獲得的頻道和資訊的格式: 第一個英文單詞是頻道/事件的名字, 其餘的是資料的格式。
注意, 當格式中包含 instance details 字樣時, 表示頻道所返回的資訊中包含了以下用於識別目標執行個體的內容:

<instance-type> <name> <ip> <port> @ <master-name> <master-ip> <master-port>

@ 字元之後的內容用於指定主伺服器, 這些內容是可選的, 它們僅在 @ 字元之前的內容指定的執行個體不是主伺服器時使用。
● +reset-master :主伺服器已被重設。
● +slave :一個新的從伺服器已經被 Sentinel 識別並關聯。
● +failover-state-reconf-slaves :容錯移轉狀態切換到了 reconf-slaves 狀態。
● +failover-detected :另一個 Sentinel 開始了一次容錯移轉操作,或者一個從伺服器轉換成了主伺服器。
● +slave-reconf-sent :領頭(leader)的 Sentinel 向執行個體發送了 SLAVEOF 命令,為執行個體設定新的主伺服器。
● +slave-reconf-inprog :執行個體正在將自己設定為指定主伺服器的從伺服器,但相應的同步過程仍未完成。
● +slave-reconf-done :從伺服器已經成功完成對新主伺服器的同步。
● -dup-sentinel :對給定主伺服器進行監視的一個或多個 Sentinel 已經因為重複出現而被移除 —— 當 Sentinel 執行個體重啟的時候,就會出現這種情況。
● +sentinel :一個監視給定主伺服器的新 Sentinel 已經被識別並添加。
● +sdown :給定的執行個體現在處於主觀下線狀態。
● -sdown :給定的執行個體已經不再處於主觀下線狀態。
● +odown :給定的執行個體現在處於客觀下線狀態。
● -odown :給定的執行個體已經不再處於客觀下線狀態。
● +new-epoch :當前的紀元(epoch)已經被更新。
● +try-failover :一個新的故障遷移操作正在執行中,等待被大多數 Sentinel 選中(waiting to be elected by the majority)。
● +elected-leader :贏得指定紀元的選舉,可以進行故障遷移操作了。
● +failover-state-select-slave :容錯移轉操作現在處於 select-slave 狀態 —— Sentinel 正在尋找可以升級為主伺服器的從伺服器。
● no-good-slave :Sentinel 操作未能找到適合進行升級的從伺服器。Sentinel 會在一段時間之後再次嘗試尋找合適的從伺服器來進行升級,又或者直接放棄執行容錯移轉操作。
● selected-slave :Sentinel 順利找到適合進行升級的從伺服器。
● failover-state-send-slaveof-noone :Sentinel 正在將指定的從伺服器升級為主伺服器,等待升級功能完成。
● failover-end-for-timeout :容錯移轉因為逾時而中止,不過最終所有從伺服器都會開始複製新的主伺服器(slaves will eventually be configured to replicate with the new master anyway)。
● failover-end :容錯移轉操作順利完成。所有從伺服器都開始複製新的主伺服器了。
● +switch-master :配置變更,主伺服器的 IP 和地址已經改變。 這是絕大多數外部使用者都關心的資訊。
● +tilt :進入 tilt 模式。
● -tilt :退出 tilt 模式。 容錯移轉

一次容錯移轉操作由以下步驟組成:
● 發現主伺服器已經進入客觀下線狀態。
● 對我們的當前紀元進行自增(詳情請參考 Raft leader election ), 並嘗試在這個紀元中當選。
● 如果當選失敗, 那麼在設定的故障遷移逾時時間的兩倍之後, 重新嘗試當選。 如果當選成功, 那麼執行以下步驟。
● 選出一個從伺服器,並將它升級為主伺服器。
● 向被選中的從伺服器發送 SLAVEOF NO ONE 命令,讓它轉變為主伺服器。
● 通過發布與訂閱功能, 將更新後的配置傳播給所有其他 Sentinel , 其他 Sentinel 對它們自己的配置進行更新。
● 向已下線主伺服器的從伺服器發送 SLAVEOF 命令, 讓它們去複製新的主伺服器。
● 當所有從伺服器都已經開始複製新的主伺服器時, 領頭 Sentinel 終止這次故障遷移操作。
每當一個 Redis 執行個體被重新設定(reconfigured) —— 無論是被設定成主伺服器、從伺服器、又或者被設定成其他主伺服器的從伺服器 —— Sentinel 都會向被重新設定的執行個體發送一個 CONFIG REWRITE 命令, 從而確保這些配置會持久化在硬碟裡。
Sentinel 使用以下規則來選擇新的主伺服器:
● 在失效主伺服器屬下的從伺服器當中, 那些被標記為主觀下線、已斷線、或者最後一次回複 PING 命令的時間大於五秒鐘的從伺服器都會被淘汰。
● 在失效主伺服器屬下的從伺服器當中, 那些與失效主伺服器串連斷開的時間長度超過 down-after 選項指定的時間長度十倍的從伺服器都會被淘汰。
● 在經曆了以上兩輪淘汰之後剩下來的從伺服器中, 我們選出複製位移量(replication offset)最大的那個從伺服器作為新的主伺服器; 如果複製位移量不可用, 或者從伺服器的複製位移量相同, 那麼帶有最小運行 ID 的那個從伺服器成為新的主伺服器。
Sentinel 自動故障遷移的一致性特質
Sentinel 自動故障遷移使用 Raft 演算法來選舉領頭(leader) Sentinel , 從而確保在一個給定的紀元(epoch)裡, 只有一個領頭產生。
這表示在同一個紀元中, 不會有兩個 Sentinel 同時被選中為領頭, 並且各個 Sentinel 在同一個紀元中只會對一個領頭進行投票。
更高的配置紀元總是優於較低的紀元, 因此每個 Sentinel 都會主動使用更新的紀元來代替自己的配置。
簡單來說, 我們可以將 Sentinel 配置看作是一個帶有版本號碼的狀態。 一個狀態會以最後寫入者勝出(last-write-wins)的方式(也即是,最新的配置總是勝出)傳播至所有其他 Sentinel 。
舉個例子, 當出現網路分割(network partitions)時, 一個 Sentinel 可能會包含了較舊的配置, 而當這個 Sentinel 接到其他 Sentinel 發來的版本更新的配置時, Sentinel 就會對自己的配置進行更新。
如果要在網路分割出現的情況下仍然保持一致性, 那麼應該使用 min-slaves-to-write 選項, 讓主伺服器在串連的從執行個體少於給定數量時停止執行寫操作, 與此同時, 應該在每個運行 Redis 主伺服器或從伺服器的機器上運行 Redis Sentinel 進程。
Sentinel 狀態的持久化
Sentinel 的狀態會被持久化在 Sentinel 設定檔裡面。
每當 Sentinel 接收到一個新的配置, 或者當領頭 Sentinel 為主伺服器建立一個新的配置時, 這個配置會與配置紀元一起被儲存到磁碟裡面。
這意味著停止和重啟 Sentinel 進程都是安全的。
Sentinel 在非故障遷移的情況下對執行個體進行重新設定
即使沒有自動故障遷移操作在進行, Sentinel 總會嘗試將當前的配置設定到被監視的執行個體上面。 特別是:
● 根據當前的配置, 如果一個從伺服器被宣告為主伺服器, 那麼它會代替原有的主伺服器, 成為新的主伺服器, 並且成為原有主伺服器的所有從伺服器的複製對象。
● 那些串連了錯誤主伺服器的從伺服器會被重新設定, 使得這些從伺服器會去複製正確的主伺服器。
不過, 在以上這些條件滿足之後, Sentinel 在對執行個體進行重新設定之前仍然會等待一段足夠長的時間, 確保可以接收到其他 Sentinel 發來的配置更新, 從而避免自身因為儲存了到期的配置而對執行個體進行了不必要的重新設定。 TILT模式

Redis Sentinel 嚴重依賴電腦的時間功能: 比如說, 為了判斷一個執行個體是否可用, Sentinel 會記錄這個執行個體最後一次相應 PING 命令的時間, 並將這個時間和目前時間進行對比, 從而知道這個執行個體有多長時間沒有和 Sentinel 進行任何成功通訊。
不過, 一旦電腦的時間功能出現故障, 或者電腦非常忙碌, 又或者進程因為某些原因而被阻塞時, Sentinel 可能也會跟著出現故障。
TILT 模式是一種特殊的保護模式: 當 Sentinel 發現系統有些不對勁時, Sentinel 就會進入 TILT 模式。
因為 Sentinel 的時間中斷器預設每秒執行 10 次, 所以我們預期時間中斷器的兩次執行之間的間隔為 100 毫秒左右。 Sentinel 的做法是, 記錄上一次時間中斷器執行時的時間, 並將它和這一次時間中斷器執行的時間進行對比:
● 如果兩次調用時間之間的差距為負值, 或者非常大(超過 2 秒鐘), 那麼 Sentinel 進入 TILT 模式。
● 如果 Sentinel 已經進入 TILT 模式, 那麼 Sentinel 延遲退出 TILT 模式的時間。
當 Sentinel 進入 TILT 模式時, 它仍然會繼續監視所有目標, 但是:
● 它不再執行任何操作,比如容錯移轉。
● 當有執行個體向這個 Sentinel 發送 SENTINEL is-master-down-by-addr 命令時, Sentinel 返回負值: 因為這個 Sentinel 所進行的下線判斷已經不再準確。
如果 TILT 可以正常維持 30 秒鐘, 那麼 Sentinel 退出 TILT 模式。 Keepalived

KeepAlived也能實現Redis的HA,當Master宕機之後Slave會接管服務,同時關閉replication功能,當Master恢複之後,從Slave同步資料,資料同步完成之後關閉Replication,Master和Slave各自恢複身份。 KeepAlived工作原理

keepalived可提供vrrp以及health-check功能,可以只用它提供雙機浮動的vip(vrrp虛擬路由功能),這樣可以簡單實現一個雙機熱備高可用功能。
keepalived是一個類似於layer3, 4 & 5交換器制的軟體,也就是我們平時說的第3層、第4層和第5層交換。Keepalived的作用是檢測網頁伺服器的狀態。 Layer3,4&5工作在IP/TCP協議棧的IP層,TCP層,及應用程式層,原理分別如下:
  Layer3:Keepalived使用Layer3的方式工作式時,Keepalived會定期向伺服器群中的伺服器
  發送一個ICMP的資料包(既我們平時用的Ping程式),如果發現某台服務的IP地址沒有啟用,Keepalived便報告這台伺服器失效,並將它從伺服器群中剔除,這種情況的典型例子是某台伺服器被非法關機。Layer3的方式是以伺服器的IP地址是否有效作為伺服器工作正常與否的標準。在本文中將採用這種方式。
  Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP連接埠的狀態來決定伺服器工作正常與否。如web server的服務連接埠一般是80,如果Keepalived檢測到80連接埠沒有啟動,則Keepalived將把這台伺服器從伺服器群中剔除。
  Layer5:Layer5就是工作在具體的應用程式層了,比Layer3,Layer4要複雜一點,在網路上佔用的頻寬也要大一些。Keepalived將根據使用者的設定檢查伺服器程式的運行是否正常,如果與使用者的設定不相符,則Keepalived將把伺服器從伺服器群中剔除。
vip即虛擬ip,是附在主機網卡上的,即對主機網卡進行虛擬,此IP仍然是佔用了此網段的某個IP。 KeepAlived作用

 Keepalived在這裡主要用作RealServer的健康狀態檢查以及LoadBalance主機和BackUP主機之間failover的實現。keepalived簡介  keepalived是一個類似於layer3, 4 & 5交換器制的軟體,也就是我們平時說的第3層、第4層和第5層交換。Keepalived的作用是檢測web伺服器的狀態,如果有一台web伺服器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動將web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的只是修複故障的web伺服器。 注意事項

需要在Master與Slave上都開啟本地化策略,否則在互相自動切換的過程中,未開啟本地化的一方會將另一方的資料清空,造成資料完全丟失。 安裝KeepAlived

先下載KeepAlived,最新版本是1.3.5[root@singlenode software]#

wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz--2017-05-02 16:30:23--  http://www.keepalived.org/software/keepalived-1.3.5.tar.gzResolving www.keepalived.org... 37.59.63.157, 2001:41d0:8:7a9d::1Connecting to www.keepalived.org|37.59.63.157|:80... connected.HTTP request sent, awaiting response... 200 OKLength: 683183 (667K) [application/x-gzip]Saving to: “keepalived-1.3.5.tar.gzâ€100%[===========================================================================================>] 683,183     21.6K/s   in 27s     
2017-05-02 16:30:58 (24.7 KB/s) - “keepalived-1.3.5.tar.gz†saved [683183/683183][root@singlenode software]# cp -r keepalived-1.3.5 /usr/local/[root@singlenode keepalived-1.3.5]# ./configure --prefix=/data/keepalivedconfigure: error:   !!! OpenSSL is not properly installed on your system. !!!  !!! Can not include OpenSSL headers files.            !!!

需要依賴openssl

[root@singlenode keepalived-1.3.5]# yum install openssl-develLoaded plugins: fastestmirror, refresh-packagekit, securityLoading mirror speeds from cached hostfile * base: ftp.sjtu.edu.cn * extras: mirrors.tuna.tsinghua.edu.cn * updates: mirrors.tuna.tsinghua.edu.cnSetting up Install ProcessResolving Dependencies--> Running transaction check---> Package openssl-devel.x86_64 0:1.0.1e-57.el6 will be installed--> Processing Dependency: openssl = 1.0.1e-57.el6 for package: openssl-devel-1.0.1e-57.el6.x86_64--> Processing Dependency: zlib-devel for package: openssl-devel-1.0.1e-57.el6.x86_64--> Processing Dependency: krb5-devel for package: openssl-devel-1.0.1e-57.el6.x86_64--> Running transaction check---> Package krb5-devel.x86_64 0:1.10.3-65.el6 will be installed--> Processing Dependency: libkadm5(x86-64) = 1.10.3-65.el6 for package: krb5-devel-1.10.3-65.el6.x86_64--> Processing Dependency: krb5-libs = 1.10.3-65.el6 for package: krb5-devel-1.10.3-65.el6.x86_64--> Processing Dependency: libselinux-devel for package: krb5-devel-1.10.3-65.el6.x86_64--> Processing Dependency: libcom_err-devel for package: krb5-devel-1.10.3-65.el6.x86_64--> Processing Dependency: keyutils-libs-devel for package: krb5-devel-1.10.3-65.el6.x86_64---> Package openssl.x86_64 0:1.0.1e-15.el6 will be updated---> Package openssl.x86_64 0:1.0.1e-57.el6 will be an update---> Package zlib-devel.x86_64 0:1.2.3-29.el6 will be installed--> Running transaction check---> Package keyutils-libs-devel.x86_64 0:1.4-5.el6 will be installed--> Processing Dependency: keyutils-libs = 1.4-5.el6 for package: keyutils-libs-devel-1.4-5.el6.x86_64---> Package krb5-libs.x86_64 0:1.10.3-10.el6_4.6 will be updated---> Package krb5-libs.x86_64 0:1.10.3-65.el6 will be an update---> Package libcom_err-devel.x86_64 0:1.41.12-23.el6 will be installed--> Processing Dependency: libcom_err = 1.41.12-23.el6 for package: libcom_err-devel-1.41.12-23.el6.x86_64---> Package libkadm5.x86_64 0:1.10.3-65.el6 will be installed---> Package libselinux-devel.x86_64 0:2.0.94-7.el6 will be installed--> Processing Dependency: libselinux = 2.0.94-7.el6 for package: libselinux-devel-2.0.94-7.el6.x86_64--> Processing Dependency: libsepol-devel >= 2.0.32-1 for package: libselinux-devel-2.0.94-7.el6.x86_64--> Processing Dependency: pkgconfig(libsepol) for package: libselinux-devel-2.0.94-7.el6.x86_64--> Running transaction check---> Package keyutils-libs.x86_64 0:1.4-4.el6 will be updated---> Package keyutils-libs.x86_64 0:1.4-5.el6 will be an update---> Package libcom_err.x86_64 0:1.41.12-18.el6 will be updated--> Processing Dependency: libcom_err = 1.41.12-18.el6 for package: e2fsprogs-libs-1.41.12-18.el6.x86_64--> Processing Dependency: libcom_err = 1.41.12-18.el6 for package: libss-1.41.12-18.el6.x86_64--> Processing Dependency: libcom_err = 1.41.12-18.el6 for package: e2fsprogs-1.41.12-18.el6.x86_64---> Package libcom_err.x86_64 0:1.41.12-23.el6 will be an update---> Package libselinux.x86_64 0:2.0.94-5.3.el6_4.1 will be updated--> Processing Dependency: libselinux = 2.0.94-5.3.el6_4.1 for package: libselinux-python-2.0.94-5.3.el6_4.1.x86_64--> Processing Dependency: libselinux = 2.0.94-5.3.el6_4.1 for package: libselinux-utils-2.0.94-5.3.el6_4.1.x86_64---> Package libselinux.x86_64 0:2.0.94-7.el6 will be an update---> Package libsepol-devel.x86_64 0:2.0.41-4.el6 will be installed--> Running transaction check---> Package e2fsprogs.x86_64 0:1.41.12-18.el6 will be updated---> Package e2fsprogs.x86_64 0:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.