一、文教介绍主从切换技术的哨兵方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,模式这就需要人工干预,文教费事费力,哨兵还会造成一段时间内服务不可用。模式这不是文教一种推荐的方式,更多时候,哨兵我们优先考虑哨兵模式。模式 在 深入学习Redis(3):主从复制 中曾提到,文教Redis主从复制的哨兵作用有数据热备、负载均衡、模式故障恢复等;但主从复制存在的文教一个问题是故障恢复无法自动化。本文将要介绍的哨兵哨兵,它基于Redis主从复制,模式主要作用便是解决主节点故障恢复的自动化问题,进一步提高系统的高可用性。 文章主要内容如下:首先介绍哨兵的作用和架构;然后讲述哨兵系统的部署方法,以及通过客户端访问哨兵系统的方法;然后简要说明哨兵实现的基本原理;最后给出关于哨兵实践的云南idc服务商一些建议。文章内容基于Redis 3.0版本。 二、哨兵模式概述哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。  Redis哨兵
 这里的哨兵有两个作用 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,企商汇这样就形成了多哨兵模式。 用文字描述一下故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。 三、部署这一部分将部署一个简单的哨兵系统,包含1个主节点、2个从节点和3个哨兵节点。方便起见:所有这些节点都部署在一台机器上(局域网IP:192.168.92.128),使用端口号区分;节点的网站模板配置尽可能简化。 1.  部署主从节点哨兵系统中的主从节点,与普通的主从节点配置是一样的,并不需要做任何额外配置。下面分别是主节点(port=6379)和2个从节点(port=6380/6381)的配置文件,配置都比较简单,不再详述。 复制#redis-6379.conf                        port 6379                        daemonize yes                        logfile "6379.log"                        dbfilename "dump-6379.rdb"                        #redis-6380.conf                        port 6380                        daemonize yes                        logfile "6380.log"                        dbfilename "dump-6380.rdb"                        slaveof 192.168.92.128 6379                        #redis-6381.conf                        port 6381                        daemonize yes                        logfile "6381.log"                        dbfilename "dump-6381.rdb"                        slaveof 192.168.92.128 63791.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.                                                                配置完成后,依次启动主节点和从节点: 复制redis-server redis-6379.conf                        redis-server redis-6380.conf                        redis-server redis-6381.conf1.2.3.                                            节点启动后,连接主节点查看主从状态是否正常,如下图所示:  图片
 2.  部署哨兵节点哨兵节点本质上是特殊的Redis节点。 3个哨兵节点的配置几乎是完全一样的,主要区别在于端口号的不同(26379/26380/26381),下面以26379节点为例介绍节点的配置和启动方式;配置部分尽量简化,更多配置会在后面介绍。 复制#sentinel-26379.conf                        port 26379                        daemonize yes                        logfile "26379.log"                        sentinel monitor mymaster 192.168.92.128 6379 21.2.3.4.5.                                            其中,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 --sentinel1.2.                                            按照上述方式配置和启动之后,整个哨兵系统就启动完毕了。可以通过redis-cli连接哨兵节点进行验证,如下图所示:可以看出26379哨兵节点已经在监控mymaster主节点(即192.168.92.128:6379),并发现了其2个从节点和另外2个哨兵节点。  图片
 此时如果查看哨兵节点的配置文件,会发现一些变化,以26379为例:  图片
 其中,dir只是显式声明了数据和日志所在的目录(在哨兵语境下只有日志);known-slave和known-sentinel显示哨兵已经发现了从节点和其他哨兵;带有epoch的参数与配置纪元有关(配置纪元是一个从0开始的计数器,每进行一次领导者哨兵选举,都会+1;领导者哨兵选举是故障转移阶段的一个操作,在后文原理部分会介绍)。 3.  演示故障转移哨兵的4个作用中,配置提供者和通知需要客户端的配合,本文将在下一章介绍客户端访问哨兵系统的方法时详细介绍。这一小节将演示当主节点发生故障时,哨兵的监控和自动故障转移功能。 (1)首先,使用kill命令杀掉主节点:  图片
 (2)如果此时立即在哨兵节点中使用info Sentinel命令查看,会发现主节点还没有切换过来,因为哨兵发现主节点故障并转移,需要一段时间。  图片
 (3)一段时间以后,再次在哨兵节点中执行info Sentinel查看,发现主节点已经切换成6380节点。  图片
 但是同时可以发现,哨兵节点认为新的主节点仍然有2个从节点,这是因为哨兵在将6380切换成主节点的同时,将6379节点置为其从节点;虽然6379从节点已经挂掉,但是由于哨兵并不会对从节点进行客观下线(其含义将在原理部分介绍),因此认为该从节点一直存在。当6379节点重新启动后,会自动变成6380节点的从节点。下面验证一下。 (4)重启6379节点:可以看到6379节点成为了6380节点的从节点。  图片
 (5)在故障转移阶段,哨兵和主从节点的配置文件都会被改写。 对于主从节点,主要是slaveof配置的变化:新的主节点没有了slaveof配置,其从节点则slaveof新的主节点。 对于哨兵节点,除了主从节点信息的变化,纪元(epoch)也会变化,下图中可以看到纪元相关的参数都+1了。  图片
 4.  总结哨兵系统的搭建过程,有几点需要注意: (1)哨兵系统中的主从节点,与普通的主从节点并没有什么区别,故障发现和转移是由哨兵来控制和完成的。 (2)哨兵节点本质上是redis节点。 (3)每个哨兵节点,只需要配置监控主节点,便可以自动发现其他的哨兵节点和从节点。 (4)在哨兵节点启动和故障转移阶段,各个节点的配置文件会被重写(config rewrite)。 (5)本章的例子中,一个哨兵只监控了一个主节点;实际上,一个哨兵可以监控多个主节点,通过配置多条sentinel monitor即可实现。  |