redis sentinel
目标:主从架构高可用,即当master节点宕机挂掉,选举一个slave来晋升master来保证服务的可用性~
redis sentinel主要实现了手动进行主从切换需要执行命令的步骤,由redis sentinel 来实现~
redis sentinel 不是代理模式,本身不存储数据,直接使用redis sentinel 无法使用set get 命令~
搭建 redis sentinel
- 首先搭建好一组主从复制组,并且启动,查看之前的教程~ https://blog.csdn.net/u012129607/article/details/82845773
以6379端口作为master节点,6380、6381为slave节点
启动redis-server
6380配置示例:
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
logfile "/var/logs/redis-6380.log"
dir /usr/local/var/db/redis/
slaveof 127.0.0.1 6379
然后
sed 's/6380/6381/' /usr/local/etc/redis-6380.conf >/usr/local/etc/redis-6381.conf
sudo redis-server /usr/local/etc/redis-6379.conf
sudo redis-server /usr/local/etc/redis-6380.conf
sudo redis-server /usr/local/etc/redis-6381.conf
可以看到主从架构搭建完成
2. 搭建sentinel 环境
配置示例:
26379节点配置:(redis-sentinel.conf 配置文件和redis.conf 同级,到自己的安装目录里去找 )
cat redis-sentinel.conf |grep -v "#" |sed '/^$/d' > redis-sentinel-26379.conf
port 26379
dir "/data/logs/redis"
logfile "/data/logs/redis/redis-sentinel-26379.log"
sendtinel monitor mymaster 127.0.0.1 6379 2 (2标识至少几台机器发现master有问题时才启用故障转义)
sentinel down-after-milliseconds mymaster 30000 (发生故障,ping多少秒不通然后启用故障转移)
sentinel parallel-syncs mymaster 1 (并发还是串行的,slave向新的master同步时,同时进行最多几个,默认是1 这样可以减轻master的压力)
sentinel failover-timeout mymaster 180000
生成slave节点配置信息
sed 's/26379/26380/' redis-sentinel-26379.conf >redis-sentinel-26380.conf
sed 's/26379/26381/' redis-sentinel-26379.conf >redis-sentinel-26381.conf
启动:
sudo redis-sentinel redis-sentinel-26379.conf
sudo redis-sentinel redis-sentinel-26380.conf
sudo redis-sentinel redis-sentinel-26381.conf
查看日志:
cat /data/logs/redis/redis-sentinel-26379.log 可以看到日志信息
使用命令行查看配置信息
redis-cli -h 127.0.0.1 -p 26379 INFO Sentinel (注意这里使用的是sentinel 的端口)
可以看到有两个slave,sentinels有3个~~
至此,搭建完毕!
测试redis-sentinel 选举,自动切节点领导者选举过程:
ps aux |grep redis
sudo kill -9 24598
redis-cli -h 127.0.0.1 -p 26379 INFO Sentinel
cat /data/logs/redis/redis-sentinel-26379.log 查看日志
查看信息
redis-cli -h 127.0.0.1 -p 26379
127.0.0.1:26379> sentinel masters 查看主节点信息
127.0.0.1:26379> sentinel masters #可以看到主节点已经变成6380
1) 1) "name"
2) "mymaster"
3) "ip"
4) "127.0.0.1"
5) "port"
6) "6380"
7) "runid"
8) "128eed92ea229894fb1116132968f1f614e1beb7"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "744"
19) "last-ping-reply"
20) "744"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "7929"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "490871"
29) "config-epoch"
30) "1"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
127.0.0.1:26379> sentinel slaves mymaster 查看从节点信息
日志信息查看
无感知已经把master节点从 63798转移为6380~
查看整个集群是否有故障节点可以在 redis-cli -p6380 info replication 可以看到现在有几个从节点信息判断整个主从是否正常~
或者redis-cli -p 26379 SENTINEL slaves mymaster 可以查看mymaster 中从节点的信息,通过查看master-link-status的状态来获取集群是否有异常节点
Sentinel 领导者选举算法(Raft协议) http://weizijun.cn/2015/04/30/Raft协议实战之Redis Sentinel的选举Leader源码解析/
- 多个sentinel发现并确认master有问题
- 选举出一个sentinel作为master
- 选出一个slave作为master
- 通知其他slvae成为新的master的slave
- 通知客户端主从变化
- 等待老的master复活成为新的master的slave
如何选举slave
- 选择slave-priority(slave节点优先级配置)最高的slave节点,(默认都是一样的)例如:如果我们有两台slave 在两台机器上,一台配置较高,我们希望当master挂掉优先选配置高的,就可以配置该值为slave中最高的。如果存在最高则返回,不存在继续
- 选择复制偏移量最大的节点(复制得最完整,与master节点的数据一致性更高),如果存在则返回,不存在继续
- 如果以上两个条件都不满足,选runId最小的(启动最早的)
其他事项
sentinel在内部有3个定时任务
- 每10秒每个sentinel会对master和slave执行info命令
- 每2秒每个sentinel通过master节点的channel交换信息(pub/sub)
- 每1秒每个sentinel对其他sentinel和redis节点执行ping操作(相互监控)
这里可能会有一个问题,如果集群中节点数过多时,会发生(黑洞现象,加机器性能不再提升,反而下降,因为内部相互通信产生大量的网络IO,会影响性能)
sentinel slave节点为保证数据一致性,一般要设置为不允许写操作,所以客户端操作时,必须要确保修改和操作key的时候使用的是master节点!!!这里需要客户端自己完成这个操作。比如php可以使用predis库,python 也有from redis.sentinel import Sentinel 库