CentOS7下使用Sentinel实现Redis集群高可用
Sentinel是Redis官方提供的一种高可用方案(除了Sentinel,Redis Cluster是另一种方案),它可以自动监控Redis master/slave的运行状态,如果发现master无法访问了,就会启动failover把其中一台可以访问的slave切换为master。
(1).Sentinel(哨兵)的作用
检测Master状态,如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave 。当Master-Slave切换后,master-redis.conf、slave-redis.conf和sentinel.conf的内容都会发生改变,即master-redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。
(2).Sentinel(哨兵)的工作原理
支持Sentinel的Redis客户端(例如Java的Jedis)会在连接Redis服务器的时候向Sentinel询问master的ip,并且会在收到master切换的pub/sub事件后自动重新连接到新的master。
(3).实验环境
youxi1 192.168.1.6 Master,Sentinel1
youxi2 192.168.1.7 Slave,Sentinel2
youxi3 192.168.1.8 Slave,Sentinel3
(4).实验
1)首先所有服务器都安装Redis,启动并设置开机自启
详细查看:CentOS7下yum安装Redis
2)修改Master服务器youxi1的配置文件
1 2 3 | [root@youxi1 ~]# vim /etc/redis.conf bind 0.0.0.0 //第69行,设置监听地址。0.0.0.0表示监听所有地址 protected -mode no //第88行,关闭安全模式,允许外网访问 |
如果防火墙是开启状态,记得添加端口号
1 2 3 | [root@youxi1 ~]# firewall-cmd --permanent --zone= public --add-port=6379/tcp && firewall-cmd --reload success success |
3)修改Slave1服务器youxi2的配置文件
1 2 3 4 | [root@youxi2 ~]# vim /etc/redis.conf bind 0.0.0.0 //第69行,设置监听地址。0.0.0.0表示监听所有地址 protected -mode no //第88行,关闭安全模式,允许外网访问 replicaof 192.168.1.6 6379 //第286行,设置master的IP地址和端口号 |
如果防火墙是开启状态,记得添加端口号
1 2 3 | [root@youxi1 ~]# firewall-cmd --permanent --zone= public --add-port=6379/tcp && firewall-cmd --reload success success |
4)修改Slave2服务器youxi3的配置文件
1 2 3 4 | [root@youxi3 ~]# vim /etc/redis.conf bind 0.0.0.0 //第69行,设置监听地址。0.0.0.0表示监听所有地址 protected -mode no //第88行,关闭安全模式,允许外网访问 replicaof 192.168.1.6 6379 //第286行,设置master的IP地址和端口号 |
如果防火墙是开启状态,记得添加端口号
1 2 3 | [root@youxi3 ~]# firewall-cmd --permanent --zone= public --add-port=6379/tcp && firewall-cmd --reload success success |
5)配置Sentinel(哨兵)
三台主机都进行配置,或一台配好发送给另外两台
1 2 3 4 5 6 7 8 | [root@youxi1 ~]# vim /etc/redis-sentinel.conf protected -mode no //第17行,取消安全模式,允许外网访问 port 26379 //第21行,检查一下端口号 daemonize yes //第26行,改为yes,后台运行守护进程 sentinel monitor mymaster 192.168.1.6 6379 2 //第84行,mymaster是集群名称;192.168.1.6是主服务器IP地址;2是投票值,2台哨兵无法连接master,则认为master挂了,为避免脑裂请使用奇数 sentinel down-after-milliseconds mymaster 10000 //第113行 sentinel parallel-syncs mymaster 1 //第121行 sentinel failover-timeout mymaster 60000 //第146行,failover超时时间,单位毫秒 |
说明:
down-after-milliseconds:sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒。
parallel-syncs:在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。
所有服务器都如此配置,然后重启redis,启动redis-sentinel并设置开机自启。
1 2 3 4 5 6 7 8 9 10 11 | [root@youxi1 ~]# systemctl restart redis && systemctl start redis-sentinel [root@youxi1 ~]# systemctl enable redis-sentinel Created symlink from /etc/systemd/system/multi-user.target.wants/redis-sentinel.service to /usr/lib/systemd/system/redis-sentinel.service. [root@youxi2 ~]# systemctl restart redis && systemctl start redis-sentinel [root@youxi2 ~]# systemctl enable redis-sentinel Created symlink from /etc/systemd/system/multi-user.target.wants/redis-sentinel.service to /usr/lib/systemd/system/redis-sentinel.service. [root@youxi3 ~]# systemctl restart redis && systemctl start redis-sentinel [root@youxi3 ~]# systemctl enable redis-sentinel Created symlink from /etc/systemd/system/multi-user.target.wants/redis-sentinel.service to /usr/lib/systemd/system/redis-sentinel.service. |
如果防火墙是开启状态,记得添加端口号
1 | firewall-cmd --permanent --zone= public --add-port=26379/tcp && firewall-cmd --reload |
6)查看主从服务器的状态
主服务器youxi1状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@youxi1 ~]# redis-cli 127.0.0.1:6379> info replication # Replication role:master //本服务器的角色 connected_slaves:2 //连接的从服务器数量 slave0:ip=192.168.1.7,port=6379,state=online,offset=546,lag=0 //从服务器状态 slave1:ip=192.168.1.8,port=6379,state=online,offset=546,lag=0 master_replid:d3839b055eb0705dda0b2782d587e0d0f4a3177c master_replid2:0000000000000000000000000000000000000000 master_repl_offset:546 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:546 |
从服务器youxi2状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [root@youxi2 ~]# redis-cli 127.0.0.1:6379> info replication # Replication role:slave //本服务器的角色 master_host:192.168.1.6 //主服务器的IP地址 master_port:6379 //主服务器的端口号 master_link_status:up //主从连接状态 master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:658 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:d3839b055eb0705dda0b2782d587e0d0f4a3177c master_replid2:0000000000000000000000000000000000000000 master_repl_offset:658 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:71 repl_backlog_histlen:588 |
从服务器youxi3状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [root@youxi3 ~]# redis-cli 127.0.0.1:6379> info replication # Replication role:slave //本服务器的角色 master_host:192.168.1.6 //主服务器的IP地址 master_port:6379 //主服务器的端口号 master_link_status:up //主从连接状态 master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_repl_offset:686 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:d3839b055eb0705dda0b2782d587e0d0f4a3177c master_replid2:0000000000000000000000000000000000000000 master_repl_offset:686 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:281 repl_backlog_histlen:406 |
7)模拟Master宕机,测试
停掉youxi1的Redis
1 | [root@youxi1 ~]# systemctl stop redis |
到youxi2上查看状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [root@youxi2 ~]# redis-cli 127.0.0.1:6379> info replication # Replication role:slave master_host:192.168.1.8 //可以看到Master服务器变成来192.168.1.8 master_port:6379 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_repl_offset:86480 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:24fe501f3d7f77e790bc82d9c80e6c920522137e master_replid2:b74fb4029bf6e6a4acb09748dfe63317192cc322 master_repl_offset:86480 second_repl_offset:49216 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:6589 repl_backlog_histlen:79892 |
此时在打开youxi1的Redis,查看状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [root@youxi1 ~]# systemctl start redis [root@youxi1 ~]# redis-cli 127.0.0.1:6379> info replication # Replication role:slave //角色变成来slave master_host:192.168.1.8 master_port:6379 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_repl_offset:110509 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:24fe501f3d7f77e790bc82d9c80e6c920522137e master_replid2:0000000000000000000000000000000000000000 master_repl_offset:110509 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:106486 repl_backlog_histlen:4024 |
8)查看Sentinel状态
查看Sentinel需要远程26379端口号,即访问Sentinel而不是Redis,例如使用现在的从服务器youxi1访问现在的主服务器youxi3
1 2 3 4 5 6 7 8 9 | [root@youxi1 ~]# redis-cli -h 192.168.1.8 -p 26379 192.168.1.8: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.1.8:6379,slaves=2,sentinels=3 |
注意:之后的使用就是连接Sentinel了。
(5).扩展:Redis主观下线和客观下线
主观下线:Subjectively Down,简称SDOWN,指的是当前Sentinel实例对某个redis服务器做出的下线判断。
客观下线:Objectively Down, 简称ODOWN,指的是多个Sentinel实例在对Master Server做出SDOWN判断,并且通过SENTINEL is-master-down-by-addr命令互相交流之后,得出的Master Server下线判断,然后开启failover。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性