redis高可用实现
通过配置redis主从复制和sentinel进行故障自动切换,来保证redis的高可用
redis主从复制流程
主从第一次进行全量复制:
slave连接master,发送psync命令
master节点收到slave的sync命令,执行bgsave命令,生成RDB快照,后续执行的写指令会存储在buffer中
master节点将RDB快照发送给slave节点
slave节点收到传输过来的RDB快照,开始同步数据
master发送完RDB文件后,开始向slave发送存储在buffer中的写指令,slave节点及时同步写指令
此后,master,slave节点间实时的进行增量同步
redis sentinel(哨兵)流程
如果仅是采用主从复制,当master节点挂掉时,只能手动将slave节点切换成master节点,无法做到故障的自动切换
redis的一种高可用方式,用来监控redis节点状态,通过部署哨兵可以实现故障自动切换
应用服务第一次会连接redis的哨兵,来确定redis master节点,后续直接访问redis master节点
当master节点挂掉时,哨兵会从slave节点重新选举出一个master节点,并将新master节点信息发送给应用服务
应用服务会自动切换,连接新master节点
一般来说,sentinel节点跟redis节点部署在一台主机上,sentinel节点的主从和redis节点的主从保持一致
主机列表
ip | hostname | 角色 |
---|---|---|
172.25.230.47 | systest-server1 | master |
172.25.230.52 | systest-server3 | slave1 |
172.25.230.53 | systest-server2 | slave2 |
部署信息
redis版本:6.0.19
redis端口:16379
sentinel端口:26379
集群配置为一主二从
redis安装
在三台服务器上安装配置redis
安装过程参考:https://opszzfwordpress.club/post/109.html
配置redis主从
配置从库服务器172.25.230.52和172.25.230.53,连接到主库172.25.230.47上:
redis配置文件:
]# vim /redis/redis/16379.conf replicaof 172.25.230.47 16379 ##连接redis主库172.25.230.47 masterauth 123456 ##redis主库密码
临时配置方式
登录redis,执行:
/redis/redis/bin/redis-cli -p 16379
127.0.0.1:16379> slaveof 172.25.230.47 16379 127.0.0.1:16379> config rewrite
重启redis
在3台上查看主从状态:info replication
172.25.230.47(主库)
172.25.230.52(从库)
172.25.230.53(从库)
role:角色名称,有master和slave
connected_slaves:连接的从库数量
slave0,slave1:连接的从库相关信息
redis主从优先级配置
参数:slave-priority
在切换时,根据优先级重新选举主节点,一般来说,优先级越小提升为master的可能性越大,设置为0则表示永远不会被提升为master
永久设置,写在redis配置文件中:
slave-priority 100
临时设置,登录redis设置:
127.0.0.1:16379> config set slave-priority 100 OK 127.0.0.1:16379> config get slave-priority 1) "slave-priority" 2) "100"
配置redis哨兵
master节点:172.25.230.47
]# vim /redis/redis/sentinel.conf ##关闭保护模式 protected-mode no ##指定sentinel端口 port 26379 ##设置sentinel为后台运行 daemonize yes ##sentinel日志路径 logfile "/redis/redis/log/redis_sentinel.log" ##sentinel的pid文件路径 pidfile "/redis/redis/redis_sentinel.pid" #sentinel监控主节点172.25.230.47及端口16379,当1个哨兵判定主节点故障时,进行故障转移 sentinel monitor mymaster 172.25.230.47 16379 2 ##判断主节点故障的时间,如果超过此设置的时间,则进行故障转移默认30000ms,即30s sentinel down-after-milliseconds mymaster 30000 ##故障转移(failover)时间超过多少,判定为转移失败,单位ms,设置为120000ms,即120s sentinel failover-timeout mymaster 120000 ##如果redis配置了requirepass,即连接密码,那么需设置主从连接认证密码,否则切换会失败,需要与requirepass中设置的密码一致 sentinel auth-pass mymaster 123456 ##redis发生故障切换时,同步新master的slave节点个数,一般来说,这个数值越小,切换的速度就会越慢 sentinel parallel-syncs mymaster 1
slave节点:172.25.230.52,172.25.230.55
protected-mode no port 26379 daemonize yes logfile "/redis/redis/log/redis_sentinel.log" pidfile "/redis/redis/redis_sentinel.pid" sentinel monitor mymaster 172.25.230.47 16379 2 sentinel down-after-milliseconds mymaster 30000 sentinel failover-timeout mymaster 120000 sentinel auth-pass mymaster 123456 sentinel parallel-syncs mymaster 1
启动redis sentinel
分别在172.25.230.47;172.25.230.52;172.25.230.53上启动sentinel
/redis/redis/bin/redis-server /redis/redis/sentinel.conf --sentinel
进程情况
172.25.230.47
172.25.230.52
172.25.230.53
哨兵情况
172.25.230.47
info sentinel
172.25.230.52
info sentinel
172.25.230.53
info sentinel
连接情况
172.25.230.47
172.25.230.52
172.25.230.53
模拟redis主从切换
切换master节点
关闭主节点172.25.230.47的redis进程
/redis/redis/bin/redis-cli -a 123456 -p 16379 shutdown
登录172.25.230.52:
查看主从情况
info replication
查看哨兵情况,发现master节点已变成172.25.230.52:
info sentinel
查看sentinel配置文件,master节点已变成172.25.230.52:
redis master节点已切换到172.25.230.52上
将redis master节点切回到172.25.230.47上
启动原主节点172.25.230.47的redis服务:
/redis/redis/bin/redis-server /redis/redis/16379.conf
等待172.25.230.47加入redis集群中
将172.25.230.52的master节点下线:
/redis/redis/bin/redis-cli -h 172.25.230.52 -p 26379 sentinel failover mymaster
172.25.230.52:切换后的sentinel主节点
26379:新sentinel主节点端口
mymaster:新sentinel主节点名称
查看master节点是否已回切
info replication
info sentinel
查看sentinel配置文件
redis master节点已回切
一般来说,redis sentinel发生切换后,会给应用或客户端返回新的master节点信息,这就需要应用配置监听所有的redis sentinel节点
应用配置redis sentinel,以SpringBoot为例:
http://www.manongjc.com/detail/16-zticzdlrnhvaegd.html#google_vignett