1. 程式人生 > >Redis高可用之Sentinel哨兵/

Redis高可用之Sentinel哨兵/

一,單例項模式

當系統中只有一臺 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 配置檔案修改:
  1. port 8000
  2. daemonize yes
  3. bind 0.0.0.0
  4. pidfile /var/run/redis-8000.pid
  5. logfile /var/log/redis/redis-8000
  • redis-slave配置檔案修改
  1. port 8000
  2. daemonize yes
  3. bind 0.0.0.0
  4. pidfile /var/run/redis-8000.pid
  5. logfile /var/log/redis/redis-800.log
  6. 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