我们有提到反客为主,不过那时候是用命令手动实现的,那么有没有办法自动实现呢?带着问题,我们来到这篇,那么当然有了。

开篇

哨兵模式:反客为主的自动版,能够后台检测主机是否故障,如果故障了,根据投票数,自动将从库变成主库

哨兵模式的实现

步骤:
1.先创建一个sentinel.conf文件(哨兵配置文件,名字绝对不能打错)
2.进行哨兵配置,填写内容
3.启动配置

sentinel.conf配置
我们还是在myredis目录下进行创建,输入以下命令

sentinel monitor mymaster 127.0.0.1 6379 1

这段代码含义:
sentinel:哨兵
monitor:监视器
mymaster :自己随便取名,我这就叫mymaster
127.0.0.1 6379:是我这里的主服务器,你可以根据自己的情况自动修改
1:址少有多少个哨兵统一迁移的数量,这里可以根据你的实际情况填写

sentinel.conf启动

启动命令:

redis-sentinel sentinel.conf

Desktop Manager Redis 连接哨兵 redis客户端连接哨兵_redis


测试前提:

我们老规矩,默认主机是6379,从机6380、6381

Desktop Manager Redis 连接哨兵 redis客户端连接哨兵_服务器_02


如何实现看哨兵的功能呢?

我们先把主服务器关闭,然后看看哨兵的变化,以及哪一台服务器自动从 从服务器变成了主服务器实现步骤:

1.关闭主服务器6379

Desktop Manager Redis 连接哨兵 redis客户端连接哨兵_服务器_03

2.静静等待结果

Desktop Manager Redis 连接哨兵 redis客户端连接哨兵_数据库_04


3.可能遇到的问题

如果你用info replication 一直查看不到状态改变,或者有提示【206:X 14 Mar 2022 11:19:12.883 # +failover-state-select-slave master mymaster 127.0.0.1 6379

3206:X 14 Mar 2022 11:19:12.967 # -failover-abort-no-good-slave master mymaster 127.0.0.1 6379

3206:X 14 Mar 2022 11:19:13.040 # Next failover delay: I will not start a failover before Mon Mar 14 11:25:13 2022


可能需要有以下原因:
1.未打开26379的端口防护墙
解决如下:

firewall-cmd --zone=public --add-port=6379/tcp --permanent
service firewalld restart

2.哨兵监视器未设置主机的访问密码
在sentinel monitor下面加上这一句

sentinel auth-pass mymaster 123456

再次重新启动下配置文件,或者原来的步骤重新开始

到这我们算成功了一小步。此刻我们来看原来设置sentinel.conf文件,发现它变了样子

sentinel monitor mymaster 127.0.0.1 6380 1
sentinel auth-pass mymaster 123456
# Generated by CONFIG REWRITE
protected-mode no
port 26379
user default on nopass sanitize-payload ~* &* +@all
dir "/root/microservice/myredis"
sentinel myid 15a8a11a6c571369834a5cb9aebabda405ea4d42
sentinel config-epoch mymaster 9
sentinel leader-epoch mymaster 9
sentinel current-epoch 9
sentinel known-replica mymaster 127.0.0.1 6379
sentinel known-replica mymaster 127.0.0.1 6381

它新增了很多东西

有没有思考过一个问题:6379主机挂了之后,哨兵会自动选择一个从机来作为主机,那么如果6379重新恢复后,它是否能重新成为主机?还是?

带着疑问我们来测试下,恢复6379
恢复步骤

redis-server redis6379.conf

启动链接

redis-cli -p 6379 -a 123456

查看状态

info replication

发现它已经变成了6380的从机了。也就是说主机挂了之后,再次恢复,不再是主机了,只能变成新主机的从机

如果你不好理解上面的话语,举个简单例子:宋代老皇帝被俘虏,新皇帝即位,即使老皇帝回来了,它也不再是皇帝了,得向新皇帝称臣。明白否?

Desktop Manager Redis 连接哨兵 redis客户端连接哨兵_服务器_05


故障恢复机制:

多个从服务器将其转成主服务器,选择条件依次为:

1.选择优先级靠前的

优先级在redis.conf中默认:replica-priority 100 值越小优先级越高

2.选择偏移量最大的

偏移量是指获得原主机数据最全的

3.选择runid最小的服务器

每个redis实例启动后都会随机生成一个40位的runid

挑选出来的新服务器之后sentinel向源服务器的从服务器发送slave of 新主服务器命令,复制新的master

当已下线的服务重新上显示,sentinel会向其发送slaveof命令,让其成为新主的从

Desktop Manager Redis 连接哨兵 redis客户端连接哨兵_数据库_06