redis架構之哨兵模式
阿新 • • 發佈:2018-12-12
簡介
- 哨兵模式(sentinel) 主從複製中反客為主的自動版。哨兵(Sentinel) 是一個分散式系統,你可以在一個架構中執行多個哨兵(sentinel) 程序,這些程序使用流言協議(gossipprotocols)來接收關於Master主伺服器是否下線的資訊,並使用投票協議(Agreement Protocols)來決定是否執行自動故障遷移,以及選擇哪個Slave作為新的Master。
- 每個哨兵(Sentinel)程序會向其它哨兵(Sentinel)、Master、Slave定時傳送訊息,以確認對方是否”活”著,如果發現對方在指定配置時間(可配置的)內未得到迴應,則暫時認為對方已掉線,也就是所謂的”主觀認為宕機” ,英文名稱:Subjective Down,簡稱SDOWN。有主觀宕機,肯定就有客觀宕機。
- 當“哨兵群”中的多數Sentinel程序在對Master主伺服器做出 SDOWN 的判斷,並且通過 SENTINEL is-master-down-by-addr 命令互相交流之後,得出的Master Server下線判斷,這種方式就是“客觀宕機”,英文名稱是:Objectively Down, 簡稱 ODOWN。通過一定的vote演算法,從剩下的slave從伺服器節點中,選一臺提升為Master伺服器節點,然後自動修改相關配置,並開啟故障轉移(failover)。
- 哨兵(sentinel) 雖然有一個單獨的可執行檔案 redis-sentinel ,但實際上它只是一個執行在特殊模式下的 Redis 伺服器,你可以在啟動一個普通 Redis 伺服器時通過給定 --sentinel 選項來啟動哨兵(sentinel)。
哨兵程序的作用
- 監控(monitoring):哨兵會不斷的檢查master,和slave是否運作正常。
- 提醒(notification):當被檢測的某個節點出現問題時,哨兵可以通過api像管理員或者其他應用傳送通知。
- 自動故障遷移(automatic failover):當一個master不能正常工作時,哨兵會開啟一次故障遷移操作,它將失效的master的其中一個slave升級為新的master,並讓失效的master的其他slave改為複製新的master;當客戶端試圖連線失效的Master時,叢集也會向客戶端返回新Master的地址,使得叢集可以使用現在的Master替換失效Master。Master和Slave伺服器切換後,Master的redis.conf、Slave的redis.conf和sentinel.conf的配置檔案的內容都會發生相應的改變,即,Master主伺服器的redis.conf配置檔案中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換。
哨兵程序的工作方式
- 每個哨兵程序以每秒鐘一次的頻率向整個叢集的中的mater主伺服器、Slave從伺服器和其他哨兵程序傳送一個Ping命令。
- 如果一個例項(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個例項會被 Sentinel(哨兵)程序標記為主觀下線(SDOWN)。
- 如果一個Master主伺服器被標記為主觀下線(SDOWN),則正在監視這個Master主伺服器的所有 Sentinel(哨兵)程序要以每秒一次的頻率確認Master主伺服器的確進入了主觀下線狀態。
- 當有足夠數量的 Sentinel(哨兵)程序(大於等於配置檔案指定的值)在指定的時間範圍內確認Master主伺服器進入了主觀下線狀態(SDOWN), 則Master主伺服器會被標記為客觀下線(ODOWN)。
- 在一般情況下, 每個 Sentinel(哨兵)程序會以每 10 秒一次的頻率向叢集中的所有Master主伺服器、Slave從伺服器傳送 INFO 命令。
- 當Master主伺服器被 Sentinel(哨兵)程序標記為客觀下線(ODOWN)時,Sentinel(哨兵)程序向下線的 Master主伺服器的所有 Slave從伺服器傳送 INFO 命令的頻率會從 10 秒一次改為每秒一次。
- 沒有足夠數量的 Sentinel(哨兵)程序同意 Master主伺服器下線, Master主伺服器的客觀下線狀態就會被移除。若 Master主伺服器重新向 Sentinel(哨兵)程序傳送 PING 命令返回有效回覆,Master主伺服器的主觀下線狀態就會被移除。
配置哨兵模式
- 環境
- Master主伺服器配置資訊:IP:192.168.127.128, Port:6379,OS:Linux
- Slave從伺服器的配置資訊:IP:192.168.127.129 Port:6379,OS:Linux
- 在Slave從伺服器上安裝了一個哨兵程序(Sentinel),在Master伺服器也安裝了一個哨兵程序(Sentinel)。
由於兩個Redis伺服器都是安裝在Linux作業系統上,而且這兩個Redis伺服器會在Master主伺服器發生故障的時候會進行切換,必須保證兩個Redis伺服器的埠號已經增加進了防火牆,或者把兩個Linux作業系統的防火牆關閉,否則會提示Master-link-Status:down,沒有連線上Master主伺服器。解決辦法有兩個:第一個辦法是關閉兩個Linux作業系統的防火牆;第二個辦法是把各個Redis服務的埠號增加到防火牆裡面,允許通過該埠號進行通訊。可以先使用命令 【firewall-cmd --query-port=6379/tcp】,如果結果是 No,那就繼續執行以下命令【firewall-cmd --add-port=6379/tcp】,命令執行後,返回Success,表示增加成功。這樣兩個Linux系統上的Redis伺服器就可以順利切換,執行哨兵模式的操作。
- 配置(沒有更改的配置項就是用預設值)
- Master config (redis.conf)
1.1、### NETWORK 設定:
bind 192.168.127.128 //繫結IP地址,可以通過ifconfig 獲取Ip地址(在Linux系統下)
port 6379 //保持預設值,也可以修改
timeout 30 //Client 端空閒斷開連線的時間
1.2、### GENERAL 設定:
daemonize yes //預設值是no,把值修改為yes,以後臺模式執行
logfile /root/application/program/redis-tool/logs/redis.log //日誌檔案的位置
1.3、### SNAPSHOTTING 設定:
dir /root/application/program/redis-tool/datas //SNAPSHOTTING檔案的路徑
1.4、### APPEND ONLY MODE 設定:
appendonly yes //預設值是No,意思是不使用AOF增量持久化的方式,使用RDB全量持久化的方式。把No值改成Yes,使用AOF增量持久化的方式
appendfsync always
- Slave config(redis.conf)
2.1、### NETWORK 設定:
bind 192.168.127.129 //繫結IP地址,可以通過ifconfig 獲取Ip地址(在Linux系統下)
port 6379 //保持預設值,也可以修改
timeout 30 //Client 端空閒斷開連線的時間
2.2、### GENERAL 設定:
daemonize yes //預設值是no,把值修改為yes,以後臺模式執行
logfile /root/application/program/redis/logs/redis.log //日誌檔案的位置
2.3、### SNAPSHOTTING 設定:
dir /root/application/program/redis/datas //SNAPSHOTTING檔案的路徑
2.4、### REPLICATION 設定:
slaveof 192.168.127.128 6379 //主伺服器的Ip地址和Port埠號
slave-serve-stale-data no //如果slave 無法與master 同步,設定成slave不可讀,方便監控指令碼發現問題。
2.5、### APPEND ONLY MODE 設定:
appendonly yes //預設值是No,意思是不使用AOF增量持久化的方式,使用RDB全量持久化的方式。把No值改成Yes,使用AOF增量持久化的方式
appendfsync always
- Sentinel config (sentinel.conf 192.168.127.129 Slave從伺服器)
3.1、 ### Port 設定:
port 26379 //哨兵埠號保持不變,可以修改,但是我沒有修改
3.2、### dir 設定:
dir /root/application/program/redis/sentinel/ //哨兵程式的日誌路徑
3.3、### Sentinel Monitor 設定:
sentinel monitor mymaster 192.168.127.129 6379 1 //哨兵監控主master的地址
3.4、### Down-After-Milliseconds 設定:
sentinel down-after-milliseconds mymaster 5000 //檢測主伺服器宕機的時間間隔
//哨兵程式每5秒檢測一次Master是否正常
3.5、### Parallel-Syncs 設定:
sentinel parallel-syncs mymaster 1 //同步的個數
3.5、### Failover-Timeout 設定:
sentinel failover-timeout mymaster 60000
3.5、### 啟動:redis-sentinel
redis-server sentinel.conf --sentinel & //(&有這可以Ctrl +C退到命令列,沒有這個就直接退出哨兵程序)
redis-sentinel /path/to/sentinel.conf & //對於 redis-sentinel 程式, 你可以用以下命令來啟動 Sentinel 系統
3.6、### 關閉:redis-sentinel
pkill redis-server //這個會關掉Redis伺服器和Sentinel(哨兵)程序
kill 程序號 //可以關掉指定程序號的程序
- Master 伺服器的配置詳情
- Slave 從伺服器的配置詳情
- 啟動哨兵程序,開始對Master主伺服器進行監控
哨兵模式優缺點
- 優點:
- 基於主從模式,所有主從的優點,哨兵模式同樣具備;
- 主從可以切換,故障可以轉移,系統可用性更好;
- 主從模式的升級,系統更健壯,可用性更高。
- 缺點: Redis較難支援線上擴容,在叢集容量達到上限時線上擴容會變得很複雜。為避免問題一般在上線時必須確保有足夠大的空間,對資源造成浪費。
結束
-無論是主從模式,還是哨兵模式,這兩個模式都有一個問題,不能水平擴容,不能動態的增、刪節點,限制了哨兵模式的廣泛應用,並且這兩個模式的高可用特性都會受到Master主節點記憶體的限制。實現哨兵模式的配置比較繁瑣。 redis在3.x以後的版本中提供了更為強大的叢集模式,Cluster叢集模式。