后端开发之Redis篇----哨兵机制原理及实战

Redis主从架构进阶

哨兵机制

在上一篇博文中,我们介绍了Redis的主从架构。在当前的架构体系下,我们是使用了1个master和2个slave的模式。那么这就有了单点故障的可能性了,当我们的master节点上的Redis服务进程挂掉后,我们就无法提供写操作了,数据就得不到更新了。所以我们需要一个监控机制来保障我们的master有效性,当原来的active的master节点挂掉后,必须要有一个替补节点能顶上来充当新的master节点。这里我们使用哨兵机制来将一个slave节点转换成新的master节点。

配置哨兵机制:
要配置哨兵机制,我们需要一个sentinel.conf的配置文件。这个文件在我们的Redis源码包中,直接将其copy到/usr/local/redis这个目录下。
打开这个配置文件,我们需要修改或者添加的配置如下:
port 26379 # 哨兵进程的端口号
pidfile "/usr/local/redis/sentinel/redis-sentinel.pid" # 配置启动的哨兵进程的pid文件所在的路径
daemonize yes # 这个和redis.conf里面的一样,将哨兵进程定为后台进程
protected-mode no # 保护模式,使得只有localhost或者被bind指定的ip才能访问,如果关闭了保护模式就对外开发了访问的权限了,所以我们这里禁掉。但是,在生产中,还是手动添加bind指定的接口吧
logfile "/usr/local/redis/sentinel/redis-sentinel.log" # 指定哨兵模式下生成的日志的存放路径及文件名

# 核心配置属性
# 这个是指定监控的最原始的master节点的相关配置,其中:doudou-master是为我们的master起一个别名(由于后面master节点可能会变)
# 192.168.0.101 最开始master的内网地址
# 6379 master节点的redis端口
# 2为quorum数量,监控我们master节点状态的哨兵进程可能是多个,当有多少哨兵进程判断master节点是不可连接的时候,认定其为宕机了
sentinel monitor doudou-master 192.168.0.101 6379 2
# 这里的master-name就是上面的doudou-master 而password和redis的auth一样就可以了
sentinel auth-pass <master-name> <password>
# master被sentinel认定为失效的时间长度
# Number of milliseconds the master (or any attached replica or sentinel) should
# be unreachable (as in, not acceptable reply to PING, continuously, for the
# specified period) in order to consider it in S_DOWN state (Subjectively
# Down).
sentinel down-after-milliseconds doudou-master 30000
# 剩余的slaves重新和新的master做同步的并行个数,如果定位1则每次只能有一个slave和master同步
sentinel parallel-syncs doudou-master 1
# 主备切换的超时时间,master的故障转移是有哨兵中的leader去完成,但如果在设定的180000时间内其没有去完成
# 就只能有其他哨兵进程来完成了
sentinel failover-timeout doudou-master 180000
哨兵实例配置情况:
假设我们现在有三台redis机器,1个master(192.168.0.103)和2个slave节点(192.168.0.104,192.168.0.105)。我们需要启动奇数个哨兵进程,一般我们所启动的哨兵进程都是有redis主从机器来提供,就是说哨兵进程也是在redis服务器当中的,一般就是该redis服务的哨兵进程监控该redis服务嘛。
所有我们就在上面三台机器上启动哨兵,命令如下
# 在三台机器上执行
redis-sentinel /usr/local/redis/sentinel.conf # 这里需要指定我们的sentinel.conf的位置

当我们的master节点挂掉后,两个slave节点中的一个会变成新的master节点,而原来的master节点恢复后其状态将变为slave节点,只有当新的master节点挂了,由哨兵重新选举后并刚好选到原来的master节点,其才能重新变成master节点

PS:当时我曾遇到过一个原master恢复后不能同步的问题,其原因是我在标记103为master节点的时候,没有将其redis.conf配置文件中的masterauth属性打开,并设置我们3个节点统一的auth密码。一般原master无法同步只有是因为网路问题或者防火墙问题,以及统一密码问题

哨兵信息检查

在任意一台Redis机器上输入命令

redis-cli -p 26379 # 进入客户端模式,这里的-p是指定了当前机器的哨兵进程所打开的端口号

# 查看doudou-master下的master节点信息
sentinel master doudou-master
# 查看doudou-master下slaves节点信息
sentinel slaves doudou-master
# 查看doudou-master下sentinel相关的信息
sentinel sentinels doudou-master
哨兵机制整合SpringBoot

当我们使用了哨兵模式,我们到master节点随时可能变化所有没有办法直接绑定任意节点中的一个,我们只能连接哨兵进程来获取master的相关信息
在application.yml中配置

# 哨兵模式下的主从读写分离
spring:
  redis:
    database: 0
    password: 123456
    sentinel:
      master: doudou-master # 只能指定我们master的别名
      nodes: 192.168.0.103:26379,192.168.0.104:26379,192.168.0.105:26379 # 要指定端口号

# 单体redis下的配置,这里只是用来对比一下,使用了哨兵机制后就不用写上去了
spring:
  redis:
    password: 123456
    database: 0
    host: 192.168.0.103
    port: 6379
发布了118 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_39702831/article/details/104761647