1.環境介紹
叢集機器 redis服務 哨兵(sentinel) 節點描述
虛擬機器:192.168.20.105 安裝redis服務,連接埠6379 安裝sentinel服務,連接埠26379 主節點
虛擬機器:192.168.20.29 安裝redis服務,連接埠6379 安裝sentinel服務,連接埠26379 從節點
虛擬機器:192.168.20.108 安裝redis服務,連接埠6379 安裝sentinel服務,連接埠26379 從節點
即:3個redis服務,三個sentinel服務,192.168.20.105 為主節點,實現按照上篇文章介紹配置好主從關係。
2.相關啟動命令
cd到/usr/redis/bin目錄可以執行以下命令:
redis-server /usr/redis/etc/redis.conf#啟動redis服務
./redis-sentinel /usr/redis/etc/sentinel.conf#啟動sentinel哨兵服務
./redis-cli -p 6379 -a 123456#開啟本機redis用戶端串連,串連上之後可執行set、get、keys *等命令
ps -ef|grep redis#查看redis狀態
3.設定檔
虛擬機器:192.168.20.105
redis.conf設定檔:
[plain] view plain copy daemonize yes#後台啟動 pidfile "/var/run/redis.pid" port 6379 timeout 0 tcp-keepalive 0 loglevel notice logfile "" databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename "dump.rdb" dir "/usr/redis/data" masterauth "123456"#如果做故障切換,不論主從節點都要填寫密碼且要保持一致 slave-serve-stale-data yes slave-read-only yes repl-disable-tcp-nodelay no slave-priority 98 requirepass "123456"#當前redis密碼 appendonly yes # appendfsync always appendfsync everysec # appendfsync no no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes # Generated by CONFIG REWRITE sentinel.conf設定檔:
[plain] view plain copy port 26379 sentinel monitor mymaster 192.168.20.105 6379 2#2表示在sentinel叢集中只要有兩個節點檢測到redis主節點出故障就進行切換,單sentinel節點無效(自己測試發現的) sentinel down-after-milliseconds mymaster 3000#如果3s內mymaster無響應,則認為mymaster宕機了 sentinel failover-timeout mymaster 10000#如果10秒後,mysater仍沒活過來,則啟動failover sentinel auth-pass mymaster 123456#redis主節點密碼 sentinel config-epoch mymaster 89 daemonize yes dir "/usr/redis/bin"#指定工作目錄 sentinel known-slave mymaster 192.168.20.29 6379#sentinel自動產生的 sentinel known-slave mymaster 192.168.20.108 6379#sentinel自動產生的 sentinel known-sentinel mymaster 192.168.20.108 26379 695a7bf69bf7c0bdacb3a01ea262319cfca85de9#sentinel自動產生的 # Generated by CONFIG REWRITE sentinel known-sentinel mymaster 192.168.20.29 26379 b1fba42ff8b363b2aea5c52e5dfa2c1ae52869e9#sentinel自動產生的
虛擬機器:192.168.20.29
redis.conf設定檔:
[plain] view plain copy daemonize yes pidfile "/var/run/redis.pid" port 6379 timeout 0 tcp-keepalive 0 loglevel notice logfile "" databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename "dump.rdb" dir "/usr/redis/data" masterauth "123456"#主節點密碼 slave-serve-stale-data yes slave-read-only yes repl-disable-tcp-nodelay no slave-priority 98 requirepass "123456" appendonly yes # appendfsync always appendfsync everysec # appendfsync no no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes # Generated by CONFIG REWRITE slaveof 192.168.20.105 6379#配置主節點資訊 sentinel.conf設定檔(基本與主節點一樣,請注意對比):
[plain] view plain copy port 26379 sentinel monitor mymaster 192.168.20.105 6379 2 sentinel down-after-milliseconds mymaster 3000 sentinel failover-timeout mymaster 10000 sentinel auth-pass mymaster 123456 sentinel config-epoch mymaster 89 daemonize yes dir "/usr/redis/bin" sentinel known-slave mymaster 192.168.20.108 6379 sentinel known-slave mymaster 192.168.20.29 6379 sentinel known-sentinel mymaster 192.168.20.108 26379 695a7bf69bf7c0bdacb3a01ea262319cfca85de9 # Generated by CONFIG REWRITE sentinel known-sentinel mymaster 192.168.20.105 26379 a8d94fbe0f1120278136c84a612ea84d57d2501c
虛擬機器:192.168.20.108
redis.conf設定檔:
[plain] view plain copy daemonize yes pidfile "/var/run/redis.pid" port 6379 timeout 0 tcp-keepalive 0 loglevel notice logfile "" databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename "dump.rdb" dir "/usr/redis/data" masterauth "123456" slave-serve-stale-data yes slave-read-only yes repl-disable-tcp-nodelay no slave-priority 100 requirepass "123456" appendonly yes # appendfsync always appendfsync everysec # appendfsync no no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes # Generated by CONFIG REWRITE slaveof 192.168.20.105 6379 sentinel.conf設定檔(基本與主節點一樣,請注意對比):
[plain] view plain copy port 26379 sentinel monitor mymaster 192.168.20.105 6379 2 sentinel down-after-milliseconds mymaster 3000 sentinel failover-timeout mymaster 10000 sentinel auth-pass mymaster 123456 sentinel config-epoch mymaster 89 daemonize yes dir "/usr/redis/bin" sentinel known-slave mymaster 192.168.20.108 6379 sentinel known-slave mymaster 192.168.20.29 6379 sentinel known-sentinel mymaster 192.168.20.105 26379 a8d94fbe0f1120278136c84a612ea84d57d2501c # Generated by CONFIG REWRITE sentinel known-sentinel mymaster 192.168.20.29 26379 b1fba42ff8b363b2aea5c52e5dfa2c1ae52869e9
4.sentinel支援叢集(廢話)
即使有一些sentinel進程宕掉了,依然可以進行redis叢集的主備切換;
如果只有一個sentinel進程,如果這個進程運行出錯,或者是網路堵塞,那麼將無法實現redis叢集的主備切換(單點問題);
如果有多個sentinel,redis的用戶端可以隨意地串連任意一個sentinel來獲得關於redis叢集中的資訊。 5.補充說明
以上設定檔除加了注釋的地方外,其他地方基本都是redis自動產生的,只要注意一下加註釋的點即可。
可能在配置過程中會出現故障不能切換的問題,極大可能是因為在原主節點設定檔中沒有配置主節點密碼,因為sentinel不會自動給主節點設定檔加上新的主節點密碼。
Redis目前的複製是非同步,只保證最終一致性,而不是強一致性(主從資料庫的更新還是分先後,先主後從)。要是一致性要求高的應用,目前還是讀寫都在主庫上。
如果想要一句話講清楚sentinel實現redis切換的原理那就是:sentinel心跳檢測到主節點出現異常後,通過修改redis.conf設定檔的形式實現redis主從節點之間的故障切換。