1、主从复制存在的问题
(1)主节点出现故障时,整个故障的迁移过程需要人工干预
(2)主节点写能力受到单机限制
(3)主节点存储能力受到单机限制
2、redis sentinel概述
Redis sentinel是redis2.8版本推出的监控redis主从复制的一套分布式架构,redis sentinel中包含若干个sentinel节点和redis数据节点,每个sentinel节点会对数据节点和其余的sentinel节点进行监控,当发现节点不可达时,会对节点做下线标识。如果标识的是主节点时会和其他的sentinel节点进行协商,当大多数sentinel都认为主节点不可达时,会选举一个sentinel节点来完成自动故障转移工作。
3、redis sentinel的作用
(1)监控
(2)主节点故障转移
(3)将故障转移结果通知给应用方
(4)配置提供者
4、redis sentinel安装部署
(1)部署规划
角色 |
IP地址 |
端口 |
主机内存大小 |
主机cpu |
Redis master |
192.168.16.128 |
6379 |
16g |
4v |
Redis slave1 |
192.168.16.129 |
6379 |
16g |
4v |
Redis master |
192.168.16.130 |
6379 |
16g |
4v |
Redis master |
192.168.16.128 |
26379 |
16g |
4v |
Redis master |
192.168.16.129 |
26379 |
16g |
4v |
Redis master |
192.168.16.130 |
26379 |
16g |
4v |
(2)redis节点的安装配置
Redis节点的安装配置启动同正常单节点的redis安装配置启动一致,具体的配置可根据自己需求配置。但是需要在redis从节点执行命令”slaveof 192.168.16.128 6379”或将此命令加入redis配置文件中,以建立主从同步。
使用yum安装的redis3.6版本在主从复制时需要通过认证或者关闭保护模式(在配置文件中添加” protected-mode no”),否则主从同步会出现问题。
(3)sentinel节点的安装配置
安装完redis后,redis sentinel默认会安装,使用yum安装的redis默认会在”/etc/redis”目录下生成配置文件,编译安装的redis需要手动创建配置文件。
Redis sentinel的主要配置文件内容如下:
#sentinel监听的端口,默认为6379
port 26379
#启动后在后台运行
daemonize yes
#工作目录
dir /tmp
# 监控的主节点,判断主节点失败至少需要两个sentinel节点同意
sentinel monitor mymaster 192.168.16.129 6379 2
# 多久(单位毫秒)收不到master回应则认为master不可用
sentinel down-after-milliseconds mymaster 30000
# 发生主备切换时,最多有多少个slave对新的master同步
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间
sentinel failover-timeout mymaster 180000
# 日志存放目录
logfile /var/log/redis/sentinel.log
# 如果redis主节点添加了密码,监控主节点时需要认证(默认是注释掉的)
sentinel auth-pass
# 故障转移时调用脚本路径(默认是注释掉的)
sentinel notification-script mymaster /var/redis/notify.sh
# 故障转移后,调用脚本的路径(默认注释掉的,可支持redis定义好的参数)
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
redis sentinel也可支持通过动态的设置参数配置,需要登录redis sentinel api进行设置。设置的命令为:sentintl set
(4)启动redis sentinel
Redis sentinel配置完成后分别启动三个Redis sentinel节点,有两种方法进行启动,启动方法如下:
启动方法一:redis-sentinel redis-sentinel.conf
启动方法二:redis-server redis-sentinel.conf --sentinel
# 分别启动三个redis sentinel节点
]# redis-sentinel /etc/redis-sentinel.conf
# 查看启动后监听端口是否成功
]# lsof -i :26379
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
redis-sen 52852 root 4u IPv6 95541 0t0 TCP *:26379 (LISTEN)
redis-sen 52852 root 5u IPv4 95542 0t0 TCP *:26379 (LISTEN)
(5)查看状态
]# redis-cli -h 127.0.0.1 -p 26379 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=mymaster,status=ok,address=192.168.16.128:6379,slaves=2,sentinels=3
(6)监控多套redis主节点
如果部署了多套redis主从节点,使用redis sentinel监控redis 主节点时不需要同时部署多套redis sentinel,在同一套sentinel中通过制定多个mastername来区分不同的节点即可完成多套redis主从节点的监控。
1、sentinel对redis的定时监控任务
1)每隔10秒,每隔sentinel节点会想主节点和从节点发送info命令获取最新的拓扑结构,从节点的信息是通过主节点获取的(命令”info replication”执行结果中显示的信息)。
2)每隔2秒每个sentinel节点会向redis数据节点的”_sentinel_:hello”频道发送该sentinel节点对主节点的判断以及当前sentinel节点的信息。每个sentinel节点也会订阅该频道来了解其他sentinel节点对主节点的判断。
3)每隔一秒,每个sentinel节点会向主节点、从节点及其他sentinel节点发送一条ping命令做一次心跳检测,确认节点是否可达。
2、redis主管下线
当sentinel发送ping命令超过”down-after-milliseconds”时没有进行回复,sentinel节点就会对该节点做失败判定。
3、客观下线
当sentinel主观下线的是主节点时,该sentinel节点会通过”sentinel is-master-down-by-addr”命令向其他sentinel节点询问对主节点的判断,当超过”quorum”个数时,sentinel节点认为主节点有问题,这时sentinel节点会做出客观下线的决定。
4、redis sentinel leader节点的选举
Sentinel对redis主节点客观下线后,需要在sentinel节点中选举出一个leader完成故障的转移。选举流程如下:
1)确认主节点主观下线时,向其他sentinel节点发送”sentinel is-master-down-by-addr”命令,要求将自己设置为主节点。
2)收到命令的sentinel节点,如果没有同意其他节点的”sentinel is-master-down-by-addr”命令,将同意该请求。
3)如果该sentinel节点发现自己票数大于max(quorum,num(sentinels)/2+1),该节点将成为leader。
4)如果此次没有选举出leader,将进入下一轮选举。
5、故障转移
选举出leader节点后,leader节点负责故障转移,故障转移的过程如下:
1)在从节点列表中选举出一个节点作为新的主节点
2)对选出来的从节点执行”slaveof no one”命令,让选出的从节点成为主节点
3)让其他的从节点从新的主节点复制,复制规则和”parallel-syncs”参数有关
4)将原来的主节点更新为从节点,等待恢复后让他从新的主节点复制。
1、redis sentinel 常用操作命令
(1)查看监控的主节点的状态信息
Redis sentinel有自己专属的API,查看相关信息时需要登录sentinel API(登录本地API命令” redis-cli -h 127.0.0.1 -p 26379”),或者直接在登录命令后加操作命令操作。登录操作时,命令没有不全功能。
命令:sentinel master
127.0.0.1:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "192.168.16.128"
(2)展示指定主节点的状态信息
命令:sentinel master
127.0.0.1:26379> sentinel master mymaster
1) "name"
2) "mymaster"
3) "ip"
4) "192.168.16.128"
(3)查看指定主节点的从节点的状态信息
命令:sentinel slaves
#会将所有的从节点依次列出来
127.0.0.1:26379> sentinel slaves mymaster
1) 1) "name"
2) "192.168.16.133:6379"
3) "ip"
4) "192.168.16.133"
(4)展示指定的mastername的sentinel节点集合
命令:sentinel sentinels
# 不会显示当前sentinel节点的集合,并将其他的sentinel节点依次列出
127.0.0.1:26379> sentinel sentinels mymaster
1) 1) "name"
2) "bf1a96e79aaf8be19cf7be613ab9363e961e2221"
3) "ip"
4) "192.168.16.128"
(5)返回指定mastername主节点的IP地址和端口
命令:sentinel get-master-addr-by-name
127.0.0.1:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.16.128"
2) "6379"
(6)对主节点的配置进行重置
命令:sentinel reset
当前sentinel节点对符合通配符风格主节点的配置进行重置,包括清除主节点的相关状态,重新发现从节点和sentinel节点。
(7)对指定的主节点进行强制的故障转移
命令:sentinel failover
# 对主节点mymaster进行强制故障转移
127.0.0.1:26379> sentinel failover mymaster
OK
# 查看转移后的主节点已经变为192.168.16.133
127.0.0.1:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "192.168.16.133"
(8)检测当前可达的sentinel节点总数是否达到
命令:sentinel ckquorum
(9)将sentinel节点的配置强制刷到磁盘
命令:sentinel flushconfig
(10)取消当前sentinel节点对指定mastername主节点的监控
命令:sentinel remove
127.0.0.1:26379> sentinel remove mymaster
OK
# 取消后查看当前节点监控的主节点
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:0
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
(11)通过命令方式完成sentinel对master主节点的监控
命令:sentinel monitor
# 重新监控主节点192.168.17.133
127.0.0.1:26379> sentinel monitor mymaster 192.168.16.133 6379 2
OK
# 再次查看时有监控到了主节点192.168.17.133
127.0.0.1:26379> 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=mymaster,status=ok,address=192.168.16.133:6379,slaves=2,sentinels=3
2、节点的下线
Redis使用的过程中,有些时候,由于节点所在的机器原因或者节点自身的原因,需要对节点下线,节点的下线也分为永久下线和临时下线。
(1)对主节点下线
通过任意一个sentinel的api执行命令”sentinel failover”将从节点晋升为主节点,在将原来的主节点下线。
如果要将指定的从节点晋升为主节点,先将其他的从节点的”slave-priority”配置为0,在执行”sentinel failover”命令,晋升完成后再讲”slave-priority”该回原值。
(2)对从节点及sentinel节点下线
可直接对其进行下线。但是下线后redis依然会对这些下线节点进行监控。这是由redis设计思路决定的。
3、节点的上线
(1)添加从节点
添加从节点只需在配置文件中添加”slaveof masterip masterport”启动从节点即可,或从节点启动后执行命令”slaveof masterip masterport”即可。
(2)添加sentinel节点
在sentinel节点配置文件汇总添加相关的配置,直接启动sentinel节点即可。