一主兩從,集羣起始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
做用
工做方式
主觀下線和客觀下線
主觀下線: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 能夠向系統管理員發送通知