Redis主备自动切换
Sentinel(哨兵)是用于监控redis集群中Master状态的工具.
一、Sentinel作用
1、Master状态检测
2、如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave;
3、Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换;
二、Sentinel工作方式
1、每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令
2、如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
3、如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
4、当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线
5、在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令
6、当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
7、若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。 若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
主观下线和客观下线
主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis服务器做出的下线判断;
客观下线:Objectively Down, 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,然后开启failover.
SDOWN适合于Master和Slave,只要一个 Sentinel 发现Master进入了ODOWN, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对下线的主服务器执行自动故障迁移操作。
ODOWN只适用于Master,对于Slave的 Redis 实例,Sentinel 在将它们判断为下线前不需要进行协商, 所以Slave的 Sentinel 永远不会达到ODOWN。
三、Sentinel配置实现主备自动切换
Sentinel中只需要在各节点(包括Master节点)中配置sentinel monitor为master的信息即可,不需要再配置slave的信息。在每一个redis节点中的Sentinel.conf文件中。
slave的sentinel.conf配置:
port 26379
#master2
sentinel monitor master2 192.168.15.129 6379 1 ---master地址 名字为哨名的名字,不同服务器上可以取得不一样
sentinel down-after-milliseconds master2 5000
sentinel failover-timeout master2 900000
#sentinel can-failover master2 yes
sentinel parallel-syncs master2 2
Master机器上sentinel.conf配置
属性 |
值 |
描述 |
port |
16379 |
监视哨端口 |
daemonize |
yes |
启动的进程为后台进程 |
logfile |
“/opt/oracle/redis-2.8.19/logs/sentinel.log” |
日志文件 |
sentinel monitor <master-name> <ip> <redis-port> <quorum> |
sentinel monitor mymaster 127.0.0.1 6379 1 |
IP和端口为Master的IP地址和端口,mymaster为集群名称,可以修改为想要的名称,客户端访问时需要这个名称 |
sentinel down-after-milliseconds <master-name> 30000 |
sentinel down-after-milliseconds mymaster 30000 |
master-name为一个统一的集群名称 |
sentinel failover-timeout <master-name> 180000 |
sentinel failover-timeout mymaster 180000 |
|
sentinel parallel-syncs <master-name> <numslaves> |
sentinel parallel-syncs mymaster 1 |
Slave机器上sentinel配置
slave上的sentinel配置与Master上的配置相同,只需要将master-name修改即可
启动顺序如下:
1、redis-server redis.conf 启动Master主机;
2、redis-server redis.conf 启动Slave主机 ;
3、redis-sentinel sentinel.conf 启动Master主机上的监视哨;
4、redis-sentinel sentinel.conf 启动Slave主机上的监视哨
注意:首次启动时,必须先启动Master
若Master已经被判定为下线,Sentinel已经选择了新的Master,也已经将old Master改成Slave,但是还没有将其改成new Master。若此时重启old Master,则Redis集群将处于无Master状态,此时只能手动修改配置文件,然后重新启动集群
四、示例如下:
master:192.168.15.129,
slave :192.168.15.128
分别启动master和slave的redis服务和sentinel服务
[root@localhostsrc]#./redis-server../redis.conf
[root@localhostsrc]#./redis-sentinel../sentinel-test.conf
然后根据以下场景切换主备,切换成功,当测试都通过时,才算是配置完成
测试主备切换场景:
主:129,备:128,sen:128,129
关闭129的redis和sen,看是否能够切换到128上面,在128上面删除数据,启动129的redis和sen,看是否数据会同步,再关闭128的redis和sen,看是否会切换为129
运行如下命令,连接客户端查看Slave状态:./redis-cli -h IP -p Port
最新文章
- Ubuntu下使用SVN
- Java项目——模拟电话薄联系人增删改查
- Python中文乱码的处理
- Android进阶笔记16:ListView篇之ListView刷新显示(全局 和 局部)
- Android之实战篇(三)
- js 如何判断鼠标点击事件还是js代码调用
- iOS swift的xcworkspace多项目管理(架构思想)
- extends和implements的区别
- 人工智能(AI)库TensorFlow 踩坑日记之一
- String的坑
- 虚拟机linux系统明明已经安装了ubuntu,但是每次重新进入就又是选择安装界面
- 011 pandas的常见操作
- APP中的图片如何长按可以下载并保存图片到相册出错处理
- Windows 不能复制文件到远程服务器的解决办法
- opengl-glsl
- Fundamental theorem of arithmetic 为什么1不是质数
- Struts2 漏洞系列之S2-001分析
- win下gosublime配置ctag
- Scala 经典的模式匹配和尾递归
- 【Python学习】字符编码