Redis 哨兵机制
蹲在角落数蚂蚁 人气:0一、为什么 Redis 集群中要有哨兵机制
Redis 主从复制有一个缺点,当 master 宕机以后,整个集群的写就会挂掉。因为 redis 本身是不会自动从 slave 中选举出新的 master 的。
我们理想的情况是:当 master 挂掉之后,可以有 slave 迅速补上,自动切换为 master,不影响整个服务。
基于此,引入了 Redis Sentinel(Redis 哨兵机制)。
它能够在 master 挂掉之后,自动从 多台 slave 中选举出 新的 master,迅速开始工作,省去了人工切换的麻烦,实现了 redis 的高可用。
二、模拟主机挂掉之后,人工切换
1、环境介绍
这里有四台 redis,分别的 ip 是:
master:172.10.0.2 slave1:172.10.0.3 slave2:172.10.0.4 slave3:172.10.0.5
2、将原来的 master 挂掉
通过 netstat -anp|grep 6379
命令找到 master 的 pid,然后 kill 掉。
去几个 slave 中查询 info replication
,会发现,master 的状态已经是 down
。
3、人工将一个 slave 选举成为新的 master
选择 slave2 成为 新的 master:
(1)去 slave2 客户端执行 slave no one
命令
该命令会将 slave2 和原来的 master 的主从关系断掉,重新使自己成为 master(当然,这个 master 下没有一个 slave )
(2)到其他两个 slave 执行 slaveof 172.10.0.4 6379
或配置slaveof
注意 requirepass、masterauth、bind 的配置,并重启、重新加载配置文件,否则可能会不生效。
虽然人工方式也可以实现切换,但难免会碰到
‘到底选举哪一个为 master’,
‘如果再断了又要重新配置’,
‘如果有其他事情耽误了,没来得及配置,会有很长一段时间无法提供服务’等问题,
因此,哨兵机制就变得十分有必要。
三、哨兵机制的原理
Redis Sentinel 是一个分布式架构,其中包含若干个 Sentinel 节点和 Redis 数据节点,每个 Sentinel 节点会对数据节点和其余 Sentinel 节点进行监控,当它发现节点不可达时,会对节点做下线标识。
哨兵集合监控redis主从是否正常运行。
如果挂掉的是从节点,则哨兵集合会将这个从节点做下线标识;
如果挂掉的是主节点,则哨兵集合不仅会对主节点做下线标识,而且还会所有哨兵进行"协商”,选举出新的主节点,来完成自动故障转移工作。原来的主节点恢复正常后,会变成新的主节点的从节点。
整个过程完全是自动的,不需要人工接入。
四、哨兵机制的实现
1、创建三个redis-sentinel,构成一个哨兵集合
docker run -itd --name redis-sentinel-1 --privileged --net haveyb-network -p 6384:6379 --ip 172.10.0.6 docker-test docker run -itd --name redis-sentinel-2 --privileged --net haveyb-network -p 6385:6379 --ip 172.10.0.7 docker-test docker run -itd --name redis-sentinel-3 --privileged --net haveyb-network -p 6386:6379 --ip 172.10.0.8 docker-test
注:--net haveyb-network为指定自定义网络
2、使用 docker ps -a
命令查看当前创建的容器
3、分别进入新建的三个 sentinel 的每一个容器
docker exec -it redis-sentinel-3 bash
4、修改 net.core.somaxconn的值
vi /etc/sysctl.conf
(1)添加下面一行代码:
net.core.somaxconn = 32768
(2)加载
sysctl -p
5、修改 redis.conf
vi /etc/redis.conf
(1)修改参数 bind 127.0.0.1 为 0.0.0.0
bind 0.0.0.0
(2)设置 redis 密码
requirepass YourPasswordSettings
(3)加载配置文件
redis-server /etc/redis.conf &
6、修改新建的三台 redis-sentinel 的 redis-sentinel.conf
vi /etc/redis-sentinel.conf
(1)修改 # bind 127.0.0.1 192.168.1.1 为 bind 0.0.0.0
bind 0.0.0.0
(2)删除这一行代码
sentinel monitor mymaster 127.0.0.1 6379 2
这一行代码是redis默认给的(没有注释掉的),我们后面自己配置,所以直接删除掉,也会避免之后由于顺序造成的问题。
(3)添加下面代码
sentinel monitor mymaster 172.10.0.2 6379 2 sentinel auth-pass mymaster yourPasswordSettings sentinel down-after-milliseconds mymaster 3000
解释:
第一行代码:
监控的主节点的名字(可以任意起,这里就起为 master)、IP 和端口,最后一个 2 的意思是有几台 Sentinel 发现有问题,就执行故障转移。一般这个数字设置为 Sentinel 节点数的一半加1。
不过这里建议把名字就起为 mymaster(默认的就是这个),因为如果起成别的名字,还需要对应改好几处地方。
第二行代码:
是填写连接的master的名字和密码,这里名字就用的默认的mymaster,密码要填写master的密码,我这里都设置成一样的了。
第三行代码
是设置每隔多长时间进行心跳检测,这里设置成3秒
7、分别在三台新建的redis-sentinel加载哨兵配置文件
redis-sentinel /etc/redis-sentinel.conf &
8、验证是否配置成功
如果出现下图类似内容,则说明配置哨兵成功
注:移除某个哨兵对master的监控,在哨兵中执行命令
sentinel remove mastername
加载全部内容