38人参与 • 2025-08-04 • Redis
主从架构和mysql的主从复制一样,无法实现master和slave角色的自动切换,即当master出现故障时, 不能实现自动的将一个slave节点提升为新的master节点,即主从复制无法实现自动的故障转移功能,如果想实现转移,则需要手动修改配置,才能将 slave 服务器提升新的master节点.此外只有一个主节点支持写操作,所以业务量很大时会导致redis服务性能达到瓶颈
需要解决的主从复制以下存在的问题:
生产环境如果要使用此功能建议使用redis的2.8版本以上版本
sentinel 故障转移
专门的sentinel 服务进程是用于监控redis集群中master工作的状态,当master主服务器发生故障的时候,可以实现master和slave的角色的自动切换,从而实现系统的高可用性
sentinel是一个分布式系统,即需要在多个节点上各自同时运行一个sentinel进程,sentienl 进程通过流言协议(gossip protocols)来接收关于master是否下线状态,并使用投票协议(agreement protocols)来决定是否执行自动故障转移,并选择合适的slave作为新的master
每个sentinel进程会向其它sentinel、master、slave定时发送消息,来确认对方是否存活,如果发现某个节点在指定配置时间内未得到响应,则会认为此节点已离线,即为主观宕机subjective down,简称为 sdown
如果哨兵集群中的多数sentinel进程认为master存在sdown,共同利用 is-master-down-by-addr 命令,互相通知后,则认为客观宕机objectively down, 简称 odown
接下来利用投票算法,从所有slave节点中,选一台合适的slave将之提升为新master节点,然后自动修改其它slave相关配置,指向新的master节点,最终实现故障转移failover
redis sentinel中的sentinel节点个数应该为大于等于3且最好为奇数
客户端初始化时连接的是sentinel节点集合,不再是具体的redis节点,即 sentinel只是配置中心不是代理。
redis sentinel 节点与普通 redis 没有区别,要实现读写分离依赖于客户端程序
sentinel 机制类似于mysql中的mha功能,只解决master和slave角色的自动故障转移问题,但单个 master 的性能瓶颈问题并没有解决
redis 3.0 之前版本中,生产环境一般使用哨兵模式较多,redis 3.0后推出redis cluster功能,可以支持更大规模的高并发环境
sentinel中的三个定时任务
每10 秒每个sentinel 对master和slave执行info
发现slave节点
确认主从关系
每2秒每个sentinel通过master节点的channel交换信息(pub/sub)
通过sentinel__:hello频道交互
交互对节点的“看法”和自身信息
每1秒每个sentinel对其他sentinel和redis执行ping
哨兵需要先实现主从复制
哨兵的前提是已经实现了redis的主从复制
注意: master 的配置文件中masterauth 和 slave 都必须相同
先通过一键编译脚本在三台主机上安装好redis,搭建一主两从
主机ip | 节点 |
---|---|
10.0.0.100 | 主 |
10.0.0.101 | 从 |
10.0.0.102 | 从 |
# 修改所有主从节点配置文件 [root@ubuntu2204 ~]#vim /apps/redis/etc/redis.conf bind 0.0.0.0 masterauth 123456 requirepass 123456 # 修改所有从节点配置文件 [root@ubuntu2204 ~]#vim /apps/redis/etc/redis.conf replicaof 10.0.0.100 6379 # 所有主从节点执行 重启redis服务 [root@ubuntu2204 ~]#systemctl restart redis # 查看主从节点状态 [root@ubuntu2204 ~]#redis-cli -a 123456 info replication
sentinel 配置
sentinel实际上是一个特殊的redis服务器,有些redis指令支持,但很多指令并不支持.默认监听在 26379/tcp端口.
哨兵服务可以和redis服务器分开部署在不同主机,但为了节约成本一般会部署在一起
所有redis节点使用相同的以下示例的配置文件
# 在源码目录有sentinel.conf,复制到安装目录即可 [root@ubuntu2204 ~]#cp /usr/local/src/redis-7.2.6/sentinel.conf /apps/redis/etc/ [root@ubuntu2204 ~]#ll /apps/redis/etc/ [root@ubuntu2204 ~]#chown redis.redis /apps/redis/etc/sentinel.conf [root@ubuntu2204 ~]#ll /apps/redis/etc/ # 修改配置文件 [root@ubuntu2204 ~]#vim /apps/redis/etc/sentinel.conf protected-mode no port 26379 daemonize no pidfile /apps/redis/run/redis-sentinel.pid logfile "/apps/redis/log/redis-sentinel.log" dir /apps/redis/data/sentinel #mymaster是集群的名称,此行指定当前mymaster集群中master服务器的地址和端口 #2为法定人数限制(quorum),即有几个sentinel认为master down了就进行故障转移,一般此值是所有sentinel节点(一般总数是>=3的 奇数,如:3,5,7等)的一半以上的整数值,比如,总数是3,即3/2=1.5,取整为2,是master的odown客观下线的依据 sentinel monitor mymaster 10.0.0.100 6379 2 # mymaster集群中master的密码,注意此行要在上面行的下面 sentinel auth-pass mymaster 123456 # 判断mymaster集群中所有节点的主观下线(sdown)的时间,单位:毫秒,建议3000 sentinel down-after-milliseconds mymaster 3000 # #发生故障转移后,可以同时向新master同步数据的slave的数量,数字越小总同步时间越长,但可以减轻新master的负载压力 sentinel parallel-syncs mymaster 1 # 所有slaves指向新的master所需的超时时间,单位:毫秒 sentinel failover-timeout mymaster 180000 acllog-max-len 128 # 禁止修改脚本 sentinel deny-scripts-reconfig yes sentinel resolve-hostnames no sentinel announce-hostnames no
# 修改一个节点,其他节点直接scp [root@ubuntu2204 ~]#scp /apps/redis/etc/sentinel.conf 10.0.0.101:/apps/redis/etc/ [root@ubuntu2204 ~]#scp /apps/redis/etc/sentinel.conf 10.0.0.102:/apps/redis/etc/ # 修改scp后的两个sentinel.conf文件的权限 [root@ubuntu2204 ~]#chown redis.redis /apps/redis/etc/sentinel.conf # 验证三个哨兵服务器的配置 [root@ubuntu2204 ~]#grep -ev '^#|^$' /apps/redis/etc/sentinel.conf protected-mode no port 26379 daemonize no pidfile /apps/redis/run/redis-sentinel.pid loglevel notice logfile "/apps/redis/log/redis-sentinel.log" dir /apps/redis/data/sentinel sentinel monitor mymaster 10.0.0.100 6379 2 sentinel auth-pass mymaster 123456 sentinel down-after-milliseconds mymaster 30000 acllog-max-len 128 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes sentinel resolve-hostnames no sentinel announce-hostnames no sentinel master-reboot-down-after-period mymaster 0
# 生成service文件 [root@ubuntu2204 ~]#vim /lib/systemd/system/redis-sentinel.service [unit] description=redis sentinel after=network.target [service] execstart=/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf --supervised systemd execstop=/bin/kill -s quit $mainpid type=notify user=redis group=redis runtimedirectory=redis runtimedirectorymode=0755 [install] wantedby=multi-user.target [root@ubuntu2204 ~]#systemctl daemon-reload [root@ubuntu2204 ~]#systemctl enable --now redis-sentinel.service [root@ubuntu2204 ~]#systemctl status redis-sentinel.service 注意: 1. 确保权限是redis 2. redis sentinel 配置 daemonize yes 与 --supervised systemd 冲突,导致 systemd 无法管理服务进程,应将 daemonize 改为 no 3. --supervised systemd:表示 redis sentinel 由 systemd 管理进程生命周期,redis 不能自己后台运行
# 查看哨兵服务端口状态 [root@ubuntu2204 run]#ss -nlt # 查看哨兵日志 [root@ubuntu2204 ~]#tail -f /apps/redis/log/redis-sentinel.log # 当前sentinel状态 [root@ubuntu2204 ~]#redis-cli -p 26379 info sentinel # 在sentinel状态中尤其是最后一行,涉及到masterip是多少,有几个slave,有几个sentinels,必须是符合全部服务器数量 # 两个slave,三个sentinel服务器,如果sentinels值不符合,检查myid可能冲突 master0:name=mymaster,status=ok,address=10.0.0.100:6379,slaves=2,sentinels=3 # 查看 redis 各节点状态 [root@ubuntu2204 ~]#redis-cli -a 123456 info replication
# 停止 master 节点 [root@ubuntu2204 ~]#systemctl stop redis # 变成101 [root@ubuntu2204 ~]#redis-cli -p 26379 info sentinel master0:name=mymaster,status=ok,address=10.0.0.101:6379,slaves=2,sentinels=3 # 故障转移后从节点redis.conf中的replicaof行的master ip会被修改 [root@ubuntu2204 ~]#grep replicaof /apps/redis/etc/redis.conf # master-replica replication. use replicaof to make a redis instance a copy of # replicaof <masterip> <masterport> replicaof 10.0.0.101 6379 # 哨兵配置文件的sentinel monitor ip 同样也会被修改 [root@ubuntu2204 ~]#grep 'sentinel monitor' /apps/redis/etc/sentinel.conf # sentinel monitor <master-name> <ip> <redis-port> <quorum> sentinel monitor mymaster 10.0.0.101 6379 2 # 验证 redis 各节点状态 [root@ubuntu2204 ~]#redis-cli -a 123456 info replication [root@ubuntu2204 ~]#redis-cli -p 26379 info sentinel
# 启动redis [root@ubuntu2204 ~]#systemctl start redis # 观察状态 [root@ubuntu2204 ~]#grep replicaof /apps/redis/etc/redis.conf [root@ubuntu2204 ~]#redis-cli -a 123456 info replication [root@ubuntu2204 ~]#redis-cli -p 26379 info sentinel
在sentinel主机手动触发故障切换
[root@ubuntu2204 ~]#vim /apps/redis/etc/redis.conf replica-priority 80 # 或者动态修改 [root@ubuntu2204 ~]#redis-cli -a 123456 127.0.0.1:6379> config get replica-priority 127.0.0.1:6379> config set replica-priority 60 127.0.0.1:6379> config get replica-priority # 原主节点自动变成从节点 [root@ubuntu2204 ~]#redis-cli -p 26379 127.0.0.1:26379> sentinel failover mymaster ok 127.0.0.1:26379>
redis 官方支持多种开发语言的客户端: https://redis.io/clients
到此这篇关于redis哨兵sentinel的具体使用的文章就介绍到这了,更多相关redis哨兵sentinel内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论