主從複製的問題 當master節點發生故障時,需要手動進行故障轉移 寫能力與存儲能力受限,寫能力和存儲能力都依賴於master節點 當master節點發生故障時,需要手動進行故障轉移 寫能力與存儲能力受限,寫能力和存儲能力都依賴於master節點 Redis Sentinel架構 在主從複製的基礎上 ...
-
當master節點發生故障時,需要手動進行故障轉移
-
寫能力與存儲能力受限,寫能力和存儲能力都依賴於master節點
Redis Sentinel架構
在主從複製的基礎上,新增多個Redis Sentinel節點,這些Sentinel不存儲任何的數據。這些Sentinel節點會完成Redis的故障判斷並故障轉移的處理,然後通知客戶端。一套Redis Sentinel集群可以監控多套Redis主從,每一套Redis主從通過master-name作為標識。
客戶端不直接連接Redis服務,而連接Redis Sentinel。在Redis Sentinel中清楚哪個節點是master節點。
故障轉移流程
-
多個Sentinel發現並確認master有問題
-
-
選出一個slave作為master
-
通知其餘slave成為新的master的slave
-
通知客戶端主從發生的變化
-
等待老的master複活成為新master的slave
Redis Sentinel的相關配置
配置 | 含義 |
---|---|
port ${port} | sentinel的埠號 |
dir "/redisDataPath" | redis的工作目錄 |
logfile "${port}.log" | redis的日誌文件 |
sentinel monitor mymaster 127.0.0.1 7000 2 | 名稱為mymaster的主從 masterIP=127.0.0.1 masterPort=7000 2個sentinel發現這個master有問題後執行故障轉移 |
sentinel down-after-milliseconds mymaster 30000 | 每個sentinel在連續ping 30000ms不通後認為有問題 |
sentinel parallel-syncs mymaster 1 | 在故障轉移時,該名稱為mymaster的集群中 同一時間點只允許1個節點進行複製 |
sentinel failover-timeout mymaster 180000 | 故障轉移的超時時間 |
Redis Sentinel的安裝與配置
1.配置開啟主從節點
-
redis-7000.conf
port 7000
daemonize yes
pidfile /var/run/redis-7000.pid
logfile "7000.log"
dir /redisDataPath
-
redis-7001.conf
port 7001
daemonize yes
pidfile /var/run/redis-7001.pid
logfile "7001.log"
dir /redisDataPath
slaveof 127.0.0.1 7000
-
redis-7002.conf
port 7002
daemonize yes
pidfile /var/run/redis-7002.pid
logfile "7002.log"
dir /redisDataPath
slaveof 127.0.0.1 7000
2.配置開啟sentinel監控主節點(sentinel是特殊的redis)
-
redis-26379.conf(redis sentinel的預設埠是26379)
port 26379
daemonize yes
dir "/redisDataPath"
logfile "26379.log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
-
redis-26380.conf
port 26380
daemonize yes
dir "/redisDataPath"
logfile "26380.log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
-
redis-26381.conf
port 26381
daemonize yes
dir "/redisDataPath"
logfile "26381.log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
客戶端接入基本原理
-
客戶端需要所有的sentinel節點以及對應的masterName
-
客戶端會遍歷所有的sentinel節點,獲取一個可用的sentinel節點
-
向可用的sentinel調用 sentinel get-master-addr-by-name masterName, 可用的sentinel將返回master節點信息。
-
客戶端連接該master節點,調用role或者role replication,確認該節點是master節點。
-
如果master發生故障轉移,sentinel是能夠感知,並通過發佈訂閱模型將最新的master信息告知客戶端
Set<String> sentinelSet = new HashSet<String>() {{
add("127.0.0.1:26379");
add("127.0.0.1:26380");
add("127.0.0.1:26381");
}};
JedisPoolConfig poolConfig = new JedisPoolConfig();
String masterName = "myMaster";
int timeout = 30_000; //jedis連接sentinel的超時時間
JedisSentinelPool sentinelPool = new JedisSentinelPool(
masterName , sentinelSet , poolConfig , timeout);
Jedis jedis = sentinelPool.getResource();
jedis.close();
三個定時任務
-
每10秒每個sentinel對master和slave執行info
-
發現slave節點
-
確認主從關係
-
-
每2秒每個sentinel通過mster節點的channel交換信息(pub/sub)
-
通過__sentinel__:hello頻道交互
-
交互對節點的“看法”和自身信息
-
-
每1秒每個sentinel對其他sentinel和redis執行ping
主觀下線與客觀下線
-
主觀下線:每個sentinel節點對Redis節點失敗的看法。
-
sentinel down-after-milliseconds masterName timeout
-
每個sentinel節點每秒會對Redis節點進行ping,當連續timeout毫秒之後還沒有得到PONG,則sentinel認為redis下線。
-
-
客觀下線:所有sentinel節點對Redis節點失敗達成共識。
-
sentinel monitor masterName ip port quorum
-
大於等於quorum個sentinel主觀認為Redis節點失敗下線
-
通過sentinel is-master-down-by-addr提出自己認為Redis master下線
領導者選舉
-
原因:只有sentinel節點完成故障轉移
-
選舉:通過 sentinel is-master-down-by-addr 命令都希望成為領導者
-
每個主觀下線的sentinel節點向其他sentinel節點發送命令,要求將它設置為領導者
-
收到命令的Sentinel節點如果沒有同意其他Sentinel節點發送的命令,那麼將同意該請求,否則拒絕。
-
如果該Sentinel節點發現自己的票數已經超過Sentinel集合半數且超過quorum,那麼將它成為領導者
-
如果此過程有多個Sentinel節點成為了領導者,那麼將等待一段時間重新進行選舉
-
故障轉移(Sentinel領導者節點完成之後)
-
從slave節點中選出一個“合適的”節點作為新的master節點
-
選擇slave-priority(slave節點優先順序)最高的slave節點,如果存在則返回,不存在則繼續
-
選擇複製偏移量最大的slave節點(複製的最完整性),如果存在則返回,不存在則繼續
-
選擇runId最小的slave節點
-
-
對上面的slave節點執行slave no one命令讓其成為master節點
-
向其餘的slave節點發送命令,讓它們成為新master節點的slave節點,複製規則和parallel-syncs參數有關。
-
更新對原來master節點配置為slave,並保持對其“關註”,當其恢復後命令它去複製新的master節點
節點運維(上線與下線)
生產節點下線可能原因
-
機器下線:過保等情況
-
機器性能不足:例如CPU、記憶體、磁碟、網路等
1.主節點
##節點下線
##手動進行故障轉移
sentinel failover ${masterName}
##跳過主觀下線、客觀下線與領導者選舉,領導者即為當前連接的sentinel節點
##節點上線
config set slave-priority num #調大新增節點的優先順序
sentinel failover ${masterName}
2.從節點
需要區分是臨時下線還是永久下線。例如需要做一些配置、AOF、RDB等方面的清理工作。
當上線時候,執行slaveof masterIp masterPort即可
3.Sentinel節點
需要區分是臨時下線還是永久下線。例如需要做一些配置的清理工作。