Sentinel實現Redis高可用

實現目標:

一主兩從,集羣起始VIP在master上邊,若是當前master掛了,sentinel自動選出一個slave當選master,並把VIP漂移到這臺機器,而後把另外一臺slave指向的master改成此機器,並同步此機器的數據,實現高可用node

實操

環境說明redis

IP redis角色 安裝的軟件
172.16.1.216 master redis,redis-sentinel
172.16.1.223 slave redis.redis-sentinel
172.16.1.215 slave redis,redis-sentinel

 

 

 

VIP:172.16.1.227bash

安裝Redis服務器

三臺機器安裝redisapp

[root@redis-1 ~]# wget -c http://download.redis.io/releases/redis-3.0.7.tar.gz     
[root@redis-1 ~]# tar zxf redis-3.0.7.tar.gz     
[root@redis-1 ~]# cd redis-3.0.7     
[root@redis-1 ~]# make     
    
[root@redis-1 ~]# \cp redis-3.0.7/src/redis-benchmark /usr/local/sbin/     
[root@redis-1 ~]# \cp redis-3.0.7/src/redis-check-aof /usr/local/sbin/     
[root@redis-1 ~]# \cp redis-3.0.7/src/redis-check-dump /usr/local/sbin/     
[root@redis-1 ~]# \cp redis-3.0.7/src/redis-cli /usr/local/sbin/     
[root@redis-1 ~]# \cp redis-3.0.7/src/redis-sentinel /usr/local/sbin/     
[root@redis-1 ~]# \cp redis-3.0.7/src/redis-server /usr/local/sbin/     
[root@redis-1 ~]# mkdir /etc/redis     
[root@redis-1 ~]# mkdir -p /data/redis/

172.16.1.216 master配置文件less

[root@redis-1 ~]# grep -v "^#" /etc/redis/redis.conf  | grep -v  "^$"
daemonize yes
pidfile "/var/run/redis.pid"
port 3717
tcp-backlog 511
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/data/redis/redis.log"
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 "/data/redis"
masterauth "123456"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
requirepass "123456"
maxmemory 256mb
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
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
hll-sparse-max-bytes 3000
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

172.16.1.223 slave1 配置文件tcp

daemonize yes
pidfile /var/run/redis.pid
port 3717
tcp-backlog 511
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/data/redis/redis.log"
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 /data/redis
slaveof 172.16.1.216 3717  #slave就是比主 多了這一個選項,slave須要指定master的IP的端口
masterauth 123456
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
requirepass 123456
maxmemory 256mb
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
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
hll-sparse-max-bytes 3000
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

172.16.1.215 slave2的配置文件oop

daemonize yes
pidfile /var/run/redis.pid
port 3717
tcp-backlog 511
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/data/redis/redis.log"
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 /data/redis
slaveof 172.16.1.216 3717  #slave就是比主 多了這一個選項,slave須要指定master的IP的端口
masterauth 123456
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
requirepass 123456
maxmemory 256mb
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
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
hll-sparse-max-bytes 3000
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

三臺sentinel配置文件相同測試

port 23717     
dir /tmp     
#監視一個名爲mymaster的master,master爲172.16.1.216,端口號爲3717,而將這個master判斷爲失效,至少須要2個sentinel贊成(只要贊成 Sentinel 的數量不達標,自動故障遷移就不會執行)不過要注意, 不管你設置要多少個 Sentinel 贊成才能判斷一個服務器失效, 一個 Sentinel 都須要得到系統中多數(majority) Sentinel 的支持, 才能發起一次自動故障遷移 
sentinel monitor mymaster 172.16.1.216 3717 2    
 #指定了 Sentinel 認爲服務器已經斷線所需的毫秒數
sentinel down-after-milliseconds mymaster 30000  
#指定了在執行故障轉移時, 最多能夠有多少個從服務器同時對新的主服務器進行同步, 這個數字越小, 完成故障轉移所需的時間就越長     
sentinel parallel-syncs mymaster 1 
sentinel failover-timeout mymaster 180000 #故障轉移的超時時間  
sentinel client-reconfig-script piaoyi_vip.sh   /etc/redis/script/piaoyi_vip.sh
#這個參數配置執行腳本,sentinel在作failover的時候會執行這個腳本,而且傳遞6個參數<master-name><role><state><from-ip><from-port><to-ip><to-port>,其中<to-ip>是新主redis的IP地址,能夠在這個腳本里作VIP漂移操做

piaoyi_vip.sh腳本內容ui

#!/bin/bash
MASTER_IP=$6  #第六個參數是新主redis的ip地址
LOCAL_IP='172.16.1.216'  #其餘兩個服務器上爲172.16.1.223,172.16.1.215
VIP='172.16.1.217'
NETMASK='16'
INTERFACE='eth0'
if [ ${MASTER_IP} = ${LOCAL_IP} ];then   #若是master的IP是本身機器的IP,那麼就將VIP綁定到本機  
    /sbin/ip  addr  add ${VIP}/${NETMASK}  dev ${INTERFACE}  #將VIP綁定到該服務器上
    /sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
    exit 0
else 
   /sbin/ip  addr del  ${VIP}/${NETMASK}  dev ${INTERFACE}   #將VIP從該服務器上刪除
   exit 0
fi
exit 1  #若是返回1,sentinel會一直執行這個腳本

啓動服務

三臺機器啓動redis
redis-server /etc/redis/redis.conf
三臺機器啓動sentinel
redis-sentinel  /etc/redis/redis-sentinel
master上先綁定VIP
/sbin/ip  addr add 172.16.1.217/16 dev eth0
/sbin/arping -q   -c 3 -A 172.16.1.217 -I eth0 

鏈接任意sentinel服務能夠獲知當前主redis服務信息

[root@redis-1 ~]# redis-cli -p 23717 -a 123456 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=172.16.1.216:3717,slaves=2,sentinels=3

測試:

把master停掉,登陸到另一臺機器,查看sentinel狀態,並查看VIP是否漂移新的master機器上

[root@redis-1 ~]# killall redis-server #停master

 

[root@redis-3 ~]# redis-cli -p 23717 -a 123456 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=172.16.1.215:3717,slaves=2,sentinels=3  #172.16.1.215已經提高爲新的master

查看VIP已經漂移到172.16.1.215上

[root@redis-2 ~]# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether fa:48:ae:43:e6:00 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.215/22 brd 172.16.3.255 scope global eth0
    inet 172.16.1.217/16 scope global secondary eth0
    inet6 fe80::f848:aeff:fe43:e600/64 scope link
       valid_lft forever preferred_lft forever

登陸到172.16.1.223查看 redis狀態,已經指向新的master

[root@redis-2 redis]# redis-cli -p 3717 -a 123456 info replication
# Replication
role:slave
master_host:172.16.1.215 #已經指向新的master
master_port:3717
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:1185986
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

Sentinel介紹

做用

  1. Master狀態檢測
  2. 若是Master異常,則會進行Master-Slave切換,將其中一個Slave做爲Master,將以前的Master做爲Slave
  3. Master-Slave切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換

工做方式

  1. 每一個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其餘Sentinel 實例發送一個 PING 命令
  2. 若是一個實例(instance)距離最後一次有效回覆 PING 命令的時間超過down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記爲主觀下線。
  3. 若是一個Master被標記爲主觀下線,則正在監視這個Master的全部Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。
  4. 當有足夠數量的 Sentinel(大於等於配置文件指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記爲客觀下線
  5. 在通常狀況下, 每一個 Sentinel 會以每 10 秒一次的頻率向它已知的全部Master,Slave發送 INFO 命令
  6. 當Master被 Sentinel 標記爲客觀下線時,Sentinel 向下線的 Master 的全部 Slave 發送 INFO 命令的頻率會從 10 秒一次改成每秒一次
  7. 若沒有足夠數量的 Sentinel 贊成 Master 已經下線, Master 的客觀下線狀態就會被移除。若 Master 從新向 Sentinel 的 PING 命令返回有效回覆, Master 的主觀下線狀態就會被移除

主觀下線和客觀下線

主觀下線:Subjectively Down,簡稱 SDOWN,指的是當前 Sentinel 實例對

某個redis服務器作出的下線判斷。

客觀下線:Objectively Down, 簡稱 ODOWN,指的是多個 Sentinel 實例在

對Master Server作出 SDOWN 判斷,而且經過 SENTINEL is-master-downby-

addr 命令互相交流以後,得出的Master Server下線判斷,而後開啓

failover.

通俗來說就是:

redis的sentinel系統用來管理多個redis服務器,能夠實現一個功能上實現HA的

集羣。該系統主要執行三個任務:

①監控( Monitoring ): Redis Sentinel實時監控主服務器和從服務器運行狀

態。

②提醒(notification): 當被監控的某個 Redis 服務器出現問題時, Redis

Sentinel 能夠向系統管理員發送通知

相關文章
相關標籤/搜索