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 能够向系统管理员发送通知

相关文章
相关标签/搜索