一端口转发
如果在一个主机里面, 安装了两个 redis 实例, 可以在项目里面配置 IP 端口, 用 iptables 转发
iptables -t nat -A PREROUTING -p tcp --dport 6379 -j REDIRECT --to-ports 7379
当发生切换的时候, 触发了脚本, 执行语句端口可以马上转发带正确的 redis 上面参数的含义:
脚本配置:
脚本实例:
- #!/bin/bash
- iptables -t nat -I PREROUTING -p tcp --dport 6379 -j REDIRECT --to-ports $7
这样在项目配置就可以直接使用 6379, 有什么切换交给 iptables 转发 IP 转发也可以用这种方法实现不能这样实现的原因是, sentinel 和 redis 都是由不同的容器实现除非用宿主机安装的办法, 不然由 sentinel 执行的脚本根本不能控制到宿主机的 iptables 来选择 redis
二修改 HOST 文件
这种方法和第一种少有不同就不是从网络上面改了项目里面的配置可以直接用主机名不过这种方法的缺陷是只能改 IP, 就是说使用的端口号要一致, 每次故障只切换 IP, 不切换端口
echo "192.168.20.26 redis" >> /etc/hosts
这种方法不能实现的原因是, sentinel 和项目执行容器独立, 由 sentinel 执行的脚本动不了 apache 的 host 文件, 除非 sentinel 和 apache 共享 host 文件这非常麻烦而且, 每个 sentinel 有执行一次, 就需要和 sentinel 一样数量的 apache 容器
脚本示例:
- #!/bin/bash
- sed -i 's/$4/$6/g' /etc/hosts
三用第三方代理 haproxy
用这种方法的话, 就不管 sentinel 怎么切换, haproxy 只需检测到可读写的 redis 交给项目就行, 而且项目里面配置指向 haproxy 的 IP
上图可知 haproxy 是通过交互发现 master 可用, slave 都切换为 downhaproxy 是利用轮询检测
项目的配置:
四插曲
这里是 sentinel 检测 redis 如果 3 个 redis,mater 挂了, 另外一个 slave 顶上如果 master 重启了, 却没有加入集群
问题就在这里, 1 的状态都知道 2 是 master,2 确不知道有 1 这个 slave 那就是 1 和 2 没有通讯了
1 初始状态:
2 初始 master:
3 关掉 1,
42 切换为 master:
5master 状态:
6 重启 1 的状态:
1 启动之后, 马上变为 master, 但是没有 slave, 后面切换回 slave, 他的 master 是 2. 就是说 1 是 master,23 都是 slave,1 的状态可以看到 23 的存在 1 挂了, 2 就是 master,3 还是 slave1 重启了就应该是 slave,1 的状态也说他的 master 是 2, 但是 2 说他只有 3 这一个 slave
7 查看 sentinel 的切换日志:
第一行, 说明检测到 1 已经挂了
第二行, 移除挂了这个状态, 即是 1 已经恢复
第三行, 把 1 转变为 slave,master 为 2.
这个日志说明出问题不在 sentinel, 因为他已经完成了使命
8 查看 1 的日志:
这个日志说明 1 想去连接, 但是认证失败
9 我们去改 redis 的配置:
10 检查后一切正常
来源: https://www.cnblogs.com/hodge01/p/8650025.html