Redis-12-哨兵模式

上文中,使用了两种方式搭建redis主从,这两种方式无论是哪种,都会存在一个问题,那就是在主机宕机的时候,就会发生群龙无首的情况,那么如果在master挂掉的时候,能够从slave中选举出一个来充当master,就不需要我们去手动重启主机了,这就是哨兵模式

环境准备

本文环境基于上文中,如下这样的一个主从结构:
image

首先我们需要创建一个哨兵的配置文件,名称是sentinel.conf,如果你的三个redis在不同的目录下,那就需要去三个目录下都创建一份哨兵的配置文件,创建命令是:

1
touch sentinel.conf

然后通过vim编辑,内容如下:

1
2
3
4
5
sentinel monitor mymaster 172.16.12.3 6379 1
daemonize yes
logfile "/var/log/sentinel_log.log"
protected-mode no
sentinel auth-pass mymaster 123456

  • 第一行的配置中 mymaster是给监控主机起的名字,这个是自定义的,然后后面是主机的地址和端口,最后的1表示有多少个哨兵认为主机挂掉了,就进行切换
  • 第二行的配置表示哨兵在后台运行
  • 第三行是哨兵的日志文件地址
  • 第四行把保护模式关闭,保护模式如果开启只接受回环地址的ipv4和ipv6地址链接,拒绝外部链接,而且正常应该配置多个哨兵,避免一个哨兵出现独裁情况,如果配置多个哨兵那如果开启也会拒绝其他sentinel的连接.导致哨兵配置无法生效.
  • 第五行如果redis配置了密码,那这里必须配置认证,否则不能自动切换

三个redis节点都要这样配置,三个sentinel.conf文件的内容除了日志文件的名称要改其他都不需要改.

最后,配置完成之后,可以通过以下命令启动哨兵

1
redis-sentinel sentinel.conf

按我们上面的配置,配置了后台运行和日志文件的地址,那就可以到去查看哨兵的运行日志.

1
2
3
cd /var/log/

cat sentinel_log.log

内容如下:
image

测试

好了哨兵起来了,然后主从关系也搭建好了,如下:
image

现在的结构是这样的:

1
2
3
Master: 172.16.12.3 6379 
Slave: 172.16.12.3 6380
Slave: 172.16.12.3 6381

一主二仆,服务都是启动的. 然后现在关闭6379的服务,观察哨兵的日志输出,如下:
image

从图中可以看到在6379这个master挂掉之后,他把master换成了6381这个服务,然后我们在6381和6380上运行info replication,看一下他们各自的身份,如下:
image

这时候,6381显示他是个master然后下面有一个slave是6380

最后,我们再把6379启动起来,启动起来之后看一下他的信息,如下:
image

6379重启之后,他的身份是slave了,并不是master了

好了,哨兵模式就介绍到这里, 如果用的是docker装的redis,在docker环境下配置哨兵的方法请前往docker分类中去查看,有详细说明