Redis高可用之Sentinel哨兵/
阿新 • • 發佈:2019-01-08
一,單例項模式
當系統中只有一臺 redis 執行時,一旦該 redis 掛了,會導致整個系統無法執行。
二,主從模式
由於單臺 redis 出現單點故障,就會導致整個系統不可用,所以想到的辦法自然 就是備份。當一臺 redis 出現問題了,另一臺 redis 可以繼續提供服務。
三,自動故障轉移機制
- 雖然上面 redis 做了備份,看上去很完美。但由於 redis 目前只支援主從複製 備份(不支援主主複製),當主 redis 掛了,從 redis 只能提供讀服務,無法 提供寫服務。所以,還得想辦法,當主redis掛了,讓從redis升級成為主redis。
- 這就需要自動故障轉移,redissentinel 帶有這個功能,當一個主 redis 不能 提供服務時,redissentinel 可以將一個從 redis 升級為主 redis,並對其他從 redis 進行配置,讓他們使用新的主 redis 進行復製備份。
- Redis-Sentinel 是 Redis 官方推薦的高可用性(HA)解決方案,當用 Redis 做 Master-slave 的高可用方案時,假如 master 宕機了,Redis 本身(包括 它的很多客戶端)都沒有實現自動進行主備切換,而 Redis-sentinel 本身也 是一個獨立執行的程序,它能監控多個 master-slave 叢集,發現 master 宕 機後能進行自動切換。它的主要功能有以下幾點
- 實時地監控 redis 是否按照預期良好地執行;
- 如果發現某個 redis 節點執行出現狀況,能夠通知另外一個程序(例如它的 客戶端);
- 能夠進行自動切換。當一個 master 節點不可用時,能夠選舉出 master 的多 個 slave(如果有超過一個 slave 的話)中的一個來作為新的 master,其他 的 slave 節點會將它所追隨的 master 的地址改為被提升為 master 的 slave 的新地址。
四,redis的主從複製部署
4.1環境描述 這裡使用三臺伺服器,每臺伺服器上開啟一個 redis-server 和 redis-sentinel 服 務,redis-server 埠為 8000,redis-sentinel 的埠為 6800,修改預設埠是 安全的第一步。
redis-server | 說明 |
192.168.200.155:8000 | redis-master |
192.168.200.153:8000 | redis-slaveA |
192.168.200.154:8000 | redis-slaveB |
4 .2redis-server端的部署
#三臺伺服器上都進行如下編譯安裝 [[email protected]-master ~]# yum -y install gcc gcc-c++ make automake auto conf [[email protected]-master ~]# tar xf redis-4.0.10.tar.gz -C /usr/src/ [[email protected]-master redis-4.0.10]# make MALLOC=jemalloc [[email protected]-master redis-4.0.10]# make PREFIX=/usr/local/redis inst all [[email protected]-master redis-4.0.10]# mkdir -p /usr/local/redis/conf [[email protected]-master redis-4.0.10]# cp redis.conf /usr/local/redis/conf/ [[email protected] redis-4.0.10]# cp sentinel.conf /usr/local/redis/conf/
4.3redis.conf配置檔案修改
- redis-master 配置檔案修改:
- port 8000
- daemonize yes
- bind 0.0.0.0
- pidfile /var/run/redis-8000.pid
- logfile /var/log/redis/redis-8000
- redis-slave配置檔案修改
- port 8000
- daemonize yes
- bind 0.0.0.0
- pidfile /var/run/redis-8000.pid
- logfile /var/log/redis/redis-800.log
- slaveof 192.168.200.155 8000
4 .4redis-server的啟動
#先啟動redis-master再啟動兩個從 #在redis-master中 [[email protected]-master conf]# redis-server /usr/local/redis/conf/redis.conf [[email protected] redis]# netstat -antup | grep 8000 tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN #檢視redis-slave的日誌,同步是否成功 [[email protected]-slave conf]# cd /data/redis/ [[email protected]-slave redis]# ls dump.rdb redis.log redis.pid [[email protected]-slave redis]# tail -f redis8000.log 1138:S 09 Jan 01:01:14.604 * Connecting to MASTER 192.168.200.155:8000 1138:S 09 Jan 01:01:14.604 * MASTER <-> SLAVE sync started 1138:S 09 Jan 01:01:14.605 * Non blocking connect for SYNC fired the event. 1138:S 09 Jan 01:01:14.605 * Master replied to PING, replication can continue... 1138:S 09 Jan 01:01:14.606 * Partial resynchronization not possible (no cached master) 1138:S 09 Jan 01:01:14.607 * Full resync from master: 3e4ce8ce160d9ddfcb4caff6d1a345af8e8ed768:0 1138:S 09 Jan 01:01:14.682 * MASTER <-> SLAVE sync: receiving 1081 bytes from master 1138:S 09 Jan 01:01:14.683 * MASTER <-> SLAVE sync: Flushing old data 1138:S 09 Jan 01:01:14.683 * MASTER <-> SLAVE sync: Loading DB in memory 1138:S 09 Jan 01:01:14.703 * MASTER <-> SLAVE sync: Finished with success #通過命令檢視主從複製情況,redis-master [[email protected]-master ~]# redis-cli -p 8000 info replication # Replication role:master #主機主機 connected_slaves:2 #有兩個從 slave0:ip=192.168.200.153,port=8000,state=online,offset=252, lag=0slave1:ip=192.168.200.154,port=8000,state=online,offset=252, lag=1master_replid:3e4ce8ce160d9ddfcb4caff6d1a345af8e8ed768 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:252 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:252
4 .5進行redis同步測試
#redis-master 上執行 [[email protected]-master ~]# redis-cli -p 8000 set aaa 111 OK [[email protected]-master ~]# redis-cli -p 8000 get aaa "111" #redis-slave 上執行 [[email protected]-slaveA redis]# redis-cli -p 8000 get aaa "111" [[email protected]-slaveB redis]# redis-cli -p 8000 get aaa "111"
五,redis的高可用部署(redis-sentinel)
(1)修改sentinel.conf配置檔案
#修改配置檔案以下行 [[email protected]-master ~]# cat -n /usr/local/redis/conf/sentinel.conf | sed -n '21p;69p;98p;106p;131p' #修改成如下內容 21 port 6800 69 sentinel monitor master8000 192.168.155.170 8000 2 98 sentinel down-after-milliseconds master8000 5000 106 sentinel parallel-syncs master8000 1 131 sentinel failover-timeout master8000 15000 #再在 sentinel.conf 的最後追加以下四句話 [[email protected] ~]# tail -4 /usr/local/redis/conf/sentinel.conf daemonize yes #守護程序模式 logfile "/data/redis/sentinel.log" pidfile "/data/redis/sentinel.pid" protected-mode no
配置檔案說明:
- sentinelmonitor master8000192.168.200.132 8000 2
master8000:監控的主節點名字(隨便寫)
192.168.200.132 8000 :主節點的 IP 和埠
2:一共有兩臺 Sentinel 發現有問題就會發生故障轉移
- sentineldown-after-milliseconds master80005000(5 秒)
當 master8000 節點宕機後多久進行檢查
- sentinelparallel-syncs master8000 1
設定 sentinel 併發還是序列, 1 代表每次只能複製一個,可以減輕 master 壓力
- sentinelfailover-timeout master8000 15000(15 秒)
表示故障轉移的超時時間
(2)啟動 redis-sentinel
#三臺都啟動 [[email protected] ~]# redis-sentinel /usr/local/redis/conf/sentinel.conf & #啟動以後,檢視 sentinel 資訊 [[email protected]-master conf]# redis-cli -p 6800 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=master8000,status=ok,address=192.168.200.155:80 00,slaves=2,sentinels=3
(3)進行 redis-master的宕機測試
我們宕掉 redis-master 的 redis-server 服務,然後檢視 sentinel 日誌
#停掉redis-master [[email protected]-master conf]# redis-cli -p 8000 shutdown #檢視redis-sentinel日誌 [[email protected]-slaveA conf]# cat /data/redis/sentinel.log 1378:X 09 Jan 02:24:02.941 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 1378:X 09 Jan 02:24:02.941 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1378, just started 1378:X 09 Jan 02:24:02.941 # Configuration loaded 1379:X 09 Jan 02:24:03.101 * Increased maximum number of open files to 10032 (it was originally set to 1024). 1379:X 09 Jan 02:24:03.118 * Running mode=sentinel, port=6800. 1379:X 09 Jan 02:24:03.118 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.1379:X 09 Jan 02:24:03.126 # Sentinel ID is 22d1715f75800793aa36aac2be51a3d459b79d03 1379:X 09 Jan 02:24:03.126 # +monitor master master8000 192.168.200.155 8000 quorum 2 1379:X 09 Jan 02:24:03.127 * +slave slave 192.168.200.154:8000 192.168.200.154 8000 @ master8000 192.168.200.155 8000 1379:X 09 Jan 02:24:03.130 * +slave slave 192.168.200.153:8000 192.168.200.153 8000 @ master8000 192.168.200.155 8000 1379:X 09 Jan 02:24:03.867 * +sentinel sentinel 19e89e777d0b42b112b977b952e1af32a2be9e34 192.168.200.155 6800 @ master8000 192.168.200 .155 80001379:X 09 Jan 02:24:04.207 * +sentinel sentinel f10eded807a9810fc2e43ff90704c80b0d08e796 192.168.200.154 6800 @ master8000 192.168.200 .155 80001379:X 09 Jan 02:33:29.875 # +sdown master master8000 192.168.200.155 8000 1379:X 09 Jan 02:33:30.003 # +new-epoch 1 1379:X 09 Jan 02:33:30.005 # +vote-for-leader f10eded807a9810fc2e43ff90704c80b0d08e796 1 1379:X 09 Jan 02:33:30.948 # +odown master master8000 192.168.200.155 8000 #quorum 3/2 1379:X 09 Jan 02:33:30.948 # Next failover delay: I will not start a failover before Wed Jan 9 02:34:00 2019 1379:X 09 Jan 02:33:31.107 # +config-update-from sentinel f10eded807a9810fc2e43ff90704c80b0d08e796 192.168.200.154 6800 @ master8000 1 92.168.200.155 80001379:X 09 Jan 02:33:31.107 # +switch-master master8000 192.168.200.155 8000 192.168.200.153 8000 1379:X 09 Jan 02:33:31.107 * +slave slave 192.168.200.154:8000 192.168.200.154 8000 @ master8000 192.168.200.153 8000 1379:X 09 Jan 02:33:31.107 * +slave slave 192.168.200.155:8000 192.168.200.155 8000 @ master8000 192.168.200.153 8000 1379:X 09 Jan 02:33:36.119 # +sdown slave 192.168.200.155:8000 192.168.200.155 8000 @ master8000 192.168.200.153 8000 #檢視sentinel資訊 [[email protected]-master conf]# redis-cli -p 6800 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=master8000,status=ok,address=192.168.200.153:80 #切換192.168.200.153 為主了 #啟動 redis-master 然後再停掉 192.168.200.153 的 redis-server [[email protected]-slaveA ~]# redis-cli -p 8000 shutdown #檢視 sentinel 資訊 [[email protected]-master conf]# redis-cli -p 6800 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=master8000,status=ok,address=192.168.200.154:8000,slaves=2,sentinels=3 #恢復到192.168.200.154