加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

实现故障恢复自动化:详解Redis哨兵技术

发布时间:2018-11-15 04:25:09 所属栏目:MySql教程 来源:DBAplus社群
导读:副标题#e# 在前面分享的《读完这篇文章,就基本搞定了Redis主从复制》中我们曾提到,Redis主从复制的作用有数据热备、负载均衡、故障恢复等;但主从复制存在的一个问题是故障恢复无法自动化。本文将要介绍的哨兵,它基于Redis主从复制,主要作用便是解决主

其中,sentinel monitor mymaster 192.168. 92.128 6379 2配置的含义是:该哨兵节点监控192.168.92.128:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移。

哨兵节点的启动有两种方式,二者作用是完全相同的:

  • redis-sentinel sentinel-26379.conf
  • redis-server sentinel-26379.conf --sentinel

按照上述方式配置和启动之后,整个哨兵系统就启动完毕了。可以通过Redis-cli连接哨兵节点进行验证,如下图所示:可以看出26379哨兵节点已经在监控mymaster主节点(即192.168.92.128:6379),并发现了其2个从节点和另外2个哨兵节点。

实现故障恢复自动化:详解Redis哨兵技术

此时如果查看哨兵节点的配置文件,会发现一些变化,以26379为例:

实现故障恢复自动化:详解Redis哨兵技术

其中,dir只是显式声明了数据和日志所在的目录(在哨兵语境下只有日志);known-slave和known-sentinel显示哨兵已经发现了从节点和其他哨兵;带有epoch的参数与配置纪元有关(配置纪元是一个从0开始的计数器,每进行一次领导者哨兵选举,都会+1;领导者哨兵选举是故障转移阶段的一个操作,在后文原理部分会介绍)。

3.演示故障转移

哨兵的4个作用中,配置提供者和通知需要客户端的配合,本文将在下一章介绍客户端访问哨兵系统的方法时详细介绍。这一小节将演示当主节点发生故障时,哨兵的监控和自动故障转移功能。

Step1:首先,使用kill命令杀掉主节点:

实现故障恢复自动化:详解Redis哨兵技术

Step2:如果此时立即在哨兵节点中使用info Sentinel命令查看,会发现主节点还没有切换过来,因为哨兵发现主节点故障并转移,需要一段时间。

实现故障恢复自动化:详解Redis哨兵技术

Step3:一段时间以后,再次在哨兵节点中执行info Sentinel查看,发现主节点已经切换成6380节点。

实现故障恢复自动化:详解Redis哨兵技术

但是同时可以发现,哨兵节点认为新的主节点仍然有2个从节点,这是因为哨兵在将6380切换成主节点的同时,将6379节点置为其从节点;虽然6379从节点已经挂掉,但是由于哨兵并不会对从节点进行客观下线(其含义将在原理部分介绍),因此认为该从节点一直存在。当6379节点重新启动后,会自动变成6380节点的从节点。下面验证一下。

Step4:重启6379节点,可以看到6379节点成为了6380节点的从节点。

实现故障恢复自动化:详解Redis哨兵技术

Step5:在故障转移阶段,哨兵和主从节点的配置文件都会被改写。

对于主从节点,主要是slaveof配置的变化:新的主节点没有了slaveof配置,其从节点则slaveof新的主节点。

对于哨兵节点,除了主从节点信息的变化,纪元(epoch)也会变化,下图中可以看到纪元相关的参数都+1了。

实现故障恢复自动化:详解Redis哨兵技术

4.总结

哨兵系统的搭建过程,有几点需要注意:

  • 哨兵系统中的主从节点,与普通的主从节点并没有什么区别,故障发现和转移是由哨兵来控制和完成的。

  • 哨兵节点本质上是Redis节点。

  • 每个哨兵节点,只需要配置监控主节点,便可以自动发现其他的哨兵节点和从节点。

  • 在哨兵节点启动和故障转移阶段,各个节点的配置文件会被重写(Config Rewrite)。

  • 本章的例子中,一个哨兵只监控了一个主节点;实际上,一个哨兵可以监控多个主节点,通过配置多条sentinel monitor即可实现。

三、客户端访问哨兵系统

上一小节演示了哨兵的两大作用:监控和自动故障转移,本小节则结合客户端演示哨兵的另外两个作用:配置提供者和通知。

1.代码示例

在介绍客户端的原理之前,先以Java客户端Jedis为例,演示一下使用方法:下面代码可以连接我们刚刚搭建的哨兵系统,并进行各种读写操作:

  1. public static void testSentinel throws Exception {  
  2. String masterName = "mymaster";  
  3. Set<String> sentinels = new HashSet<>;  
  4. sentinels.add("192.168.92.128:26379");  
  5. sentinels.add("192.168.92.128:26380");  
  6. sentinels.add("192.168.92.128:26381");  
  7. JedisSentinelPool pool = new JedisSentinelPool(masterName, sentinels); //初始化过程做了很多工作  
  8. Jedis jedis = pool.getResource;  
  9. jedis.set("key1", "value1");  
  10. pool.close;  

(注:代码中只演示如何连接哨兵,异常处理、资源关闭等未考虑)

2.客户端原理

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读