澳门威斯尼人平台登录哨兵模式,Sentinel集群部署

测试Failover

一、sentinel介绍

Sentinel作用: 
1):Master状态检测 
2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave 
3):Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换 

Sentinel工作方式: 
1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令 
2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。 
3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。 
4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 
5):在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令 
6):当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 
7):若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。 
8):若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。

主观下线和客观下线 
主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis服务器做出的下线判断。 
客观下线:Objectively Down, 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,然后开启failover.

通俗来讲就是: 
redis的sentinel系统用来管理多个redis服务器,可以实现一个功能上实现HA的集群。该系统主要执行三个任务: 
①监控( Monitoring ): Redis Sentinel实时监控主服务器和从服务器运行状态。 
②提醒(notification): 当被监控的某个 Redis 服务器出现问题时, Redis Sentinel 可以向系统管理员发送通知, 也可以通过 API 向其他程序发送通知 
一个简单的主从结构加sentinel集群的架构图如下: 

澳门威斯尼人平台登录 1

 上图是一主两从节点,sentinel集群之间会互相通信,沟通交流redis节点的状态,做出相应的判断并进行处理,这里的主观下线状态和客观下线状态是比较重要的状态,它们决定了是否进行故障转移 可以 通过订阅指定的频道信息,当服务器出现故障得时候通知管理员 客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器,你不可以使用 PUBLISH 命令向这个服务器发送信息,但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通过订阅给定的频道来获取相应的事件提醒。 

一个频道能够接收和这个频道的名字相同的事件。 比如说, 名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。

dev-master-01

二、搭建redis-sentinel 集群环境

1、下载redis编译安装包:redis-2.8.19.tar.gz,然后解压缩进行编译安装。将redis安装到/opt/redis目录下。

1 [root@idxs21-108 redis]# mkdir bin              #redis脚本文件 
2 [root@idxs21-108 redis]# mkdir conf             #redis配置文件 
3 [root@idxs21-108 redis]# mkdir data             #redis的本地数据存放 
4 [root@idxs21-108 redis]# mkdir logs             #redis日志文件 
5 [root@idxs21-108 redis]# tar zxvf redis-2.8.19.tar.gz cd redis-2.8.19 
6 [root@idxs21-108 redis]# make PREFIX=/opt/redis install cp *.conf /opt/redis/conf  #把安装源文件中的.conf配置文件拷贝一份到安装目录下的conf目录中。 
7 [root@idxs21-108 redis]# cd /opt/redis/conf cp redis.cof redis.conf.bak cp sentinel.conf sentinel.conf.bak   

2.在安装redis成功后,可以在/opt/redis/bin目录下看到以下内容:

1 [root@idxs21-108 bin]# ll
2 total 15220
3 -rwxr-xr-x 1 root root 4586251 Mar 10  2015 redis-benchmark
4 -rwxr-xr-x 1 root root   22177 Mar 10  2015 redis-check-aof
5 -rwxr-xr-x 1 root root   45387 Mar 10  2015 redis-check-dump
6 -rwxr-xr-x 1 root root 4679739 Mar 10  2015 redis-cli
7 lrwxrwxrwx 1 root root      27 Jun 20 15:59 redis-sentinel -> /opt/redis/bin/redis-server
8 -rwxr-xr-x 1 root root 6241748 Mar 10  2015 redis-server

3、修改master机器配置文件(这里直接使用的sed命令做的替换):

 1 # -- redis.conf                                                   #修改redis.conf
 2 sed -i 's/daemonize no/daemonize yes/g' redis.conf            #使用后台方式运行         
 3 sed -i 's/logfile ""/logfile "/opt/redis/logs/redis.log"/g' redis.conf  #配置日志路径
 4 # no AOF and RDB for master                                #配置数据同步策略,master节点注释关闭掉dump数据同步
 5 sed -i 's/save 900 1/# save 900 1/g' redis.conf
 6 sed -i 's/save 300 10/# save 300 10/g' redis.conf
 7 sed -i 's/save 60 10000/# save 60 10000/g' redis.conf
 8 sed -i 's/appendonly no/appendonly yes/g' redis.conf          #打开aof同步
 9 sed -i 's/dir .//dir "/opt/redis/data/"/g' redis.conf       #配置数据文件存放路径
10 sed -i 's/slowlog-log-slower-than 10000/slowlog-log-slower-than 5000/g' redis.conf
11 sed -i 's/slowlog-max-len 128/slowlog-max-len 1000/g' redis.conf
12  
13 # -- sentinel.conf                                                #修改sentinel.conf文件
14 echo 'daemonize yes' >> sentinel.conf                        #后台方式运行sentinel
15 echo 'logfile /opt/redis/logs/sentinel.log' >> sentinel.conf
16 sed -i 's/sentinel monitor mymaster 127.0.0.1 6379 2/sentinel monitor mymaster 10.135.40.118 6379 2/g' sentinel.conf  #配置哨兵模式 

 

4、修改slave机器配置文件,两台slave配置一样:

 1 # -- redis.conf
 2 sed -i 's/daemonize no/daemonize yes/g' redis.conf      
 3 sed -i 's/logfile ""/logfile "/opt/redis/logs/redis.log"/g' redis.conf     
 4 sed -i 's/# save ""/save ""/g' redis.conf         
 5 sed -i 's/appendonly no/appendonly yes/g' redis.conf      
 6 sed -i 's/dir .//dir "/opt/redis/data/"/g'redis.conf          
 7 
 8 # SLOWLOG GET or SLOWLOG GET number
 9 sed -i 's/slowlog-log-slower-than 10000/slowlog-log-slower-than 5000/g' redis.conf
10 sed -i 's/slowlog-max-len 128/slowlog-max-len 1000/g' redis.conf
12 echo "slaveof 10.135.40.118 6379" >> redis.conf                        #指定master节点
13 
14 # -- sentinel.conf
15 echo 'daemonize yes' >> sentinel.conf        
16 echo 'logfile /opt/redis/logs/sentinel.log' >> sentinel.conf
17 sed -i 's/sentinel monitor mymaster 127.0.0.1 6379 2/sentinel monitor mymaster 10.135.40.118 6379 2/g' sentinel.conf      

 

5、配置文件修改完成之后启动redis服务,从master开始启动,所有节点的启动方式和命令都是一样的。

1 启动redis服务和sentinel服务:
2 [root@idxs21-108 redis]# /opt/redis/bin/redis-server /opt/redis/conf/redis.conf
3 [root@idxs21-108 redis]# /opt/redis/bin/redis-sentinel /opt/redis/conf/sentinel.conf
4 查看服务进程状态:
5 [root@idxs21-108 redis]# ps -ef | grep redis
6 root      10024   9807  0 17:14 pts/0    00:00:00 grep redis
7 root      68378      1  0 Jul28 ?        01:30:09 /opt/redis/bin/redis-sentinel *:26379                      
8 root      68379      1  0 Jul28 ?        00:35:16 /opt/redis/bin/redis-server *:6379 

6、测试

1>.测试数据同步

 1 主redis写入数据:
 2 [root@idxs40-118 redis]# redis-cli -p 6379
 3 127.0.0.1:6379> set name abc
 4 OK
 5 127.0.0.1:6379> get name
 6 "abc"
 7 127.0.0.1:6379>
 8 从redis读取数据:
 9 [root@idxs40-117 redis]# redis-cli -p 6379
10 127.0.0.1:6379> get name
11 "abc"
12 127.0.0.1:6379>
13 从redis读取数据:
14 [root@idxs40-119 redis]# redis-cli -p 6379
15 127.0.0.1:6379> get name
16 "abc"
17 127.0.0.1:6379>

2>.redis默认是读写分离的,只有master能写,slave只能读:

1 [root@idxs40-117 ~]# redis-cli -p 6379
2 127.0.0.1:6579> set name 123
3 (error) READONLY You can't write against a read only slave.

这里可看到,slave节点默认只有读的权限,无法进行写入操作。

7、sentinel一些命令介绍 要使用sentinel的命令,我们需要用redis-cli命令进入到sentinel:

[root@idxs21-108 redis]# redis-cli -h 10.135.40.118 -p 26379
①INFO  sentinel的基本状态信息 
②SENTINEL masters  列出所有被监视的主服务器,以及这些主服务器的当前状态 
③SENTINEL slaves  列出给定主服务器的所有从服务器,以及这些从服务器的当前状态 
④SENTINEL get-master-addr-by-name  返回给定名字的主服务器的 IP 地址和端口号 
⑤SENTINEL reset  重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel 。 
⑥SENTINEL failover  当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移,但是它会给其他sentinel发送一个最新的配置,其他sentinel会根据这个配置进行更新

 

8、如果master节点宕机,会从两台slave中自动选举出一台机器接替master角色。后期如果老的master节点重新恢复,重新加入集群中,也只能是salve节点。

当配置文件无法写入时,Sentinel会启动失败。Sentinel默认监听26379端口,所以运行前必须确定该端口没有被别的进程占用。

当Sentinel发起failover后,切换了新的Master,Sentinel会发送 CLIENT KILL TYPE normal命令给客户端,客户端需要主动断开对老的Master的链接,然后重新查询新的Master地址,再重复走上面的流程。这样的方式仍然相对不够实时,可以通过Sentinel提供的Pub/Sub来更快地监听到failover事件,加快重连。

增加新的Sentinel实例非常简单,修改好配置文件,启动即可,其他Sentinel会自动发现该实例并加入集群。如果要批量启动一批Sentinel节点,最好以30秒的间隔一个一个启动为好,这样能确保整个 Sentinel集群的大多数能够及时感知到新节点,满足当时可能发生的选举条件。

min-slaves-to-write 1min-slaves-max-lag 10

如果需要实现读写分离,读走Slave,那可以走SENTINEL slaves master name 来查询Slave列表并连接。

在两个Slave Redis的配置文件中声明所从属的主数据库。

我们让dev-master-01主机上的redis-master主动休眠30秒来观察failover过程:

启动Redis

Sentinel默认会绑定到127.0.0.1,这里要在多台机器间通信,我们将它绑定到主机IP上。

运行一个Sentinel所需的最少配置如下所示:

移除一个Sentinel实例会相对麻烦一些,因为Sentinel不会忘记已经感知到的Sentinel实例,所以最好按照下列步骤来处理:

$ redis-cli -p 6379 -h 192.168.2.212 -a 000000 info Replication# Replicationrole:masterconnected_slaves:2slave0:ip=192.168.2.211,port=6379,state=online,offset=2312008,lag=0slave1:ip=192.168.2.210,port=6379,state=online,offset=2312008,lag=0master_repl_offset:2312008repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1639828repl_backlog_histlen:672181
$ systemctl start redis-sentinel

安装的Redis版本必须在2.8版本以上。

Sentinel启动后会输出类似的日志:

输出的结果表示开始监控redis-master集群,并输出集群的基本信息。+slave+sentinel分别代表成功发现了从数据库和其他Sentinel。

Redis Sentinel系统架构图

Sentinel可以切换主从数据库,主数据库可能会变成从数据库,所以三台机器上都需要同时设置requirepassmasterauth配置项。

如果在多少毫秒内没有把宕掉的那台Master恢复,那Sentinel认为这是一次真正的宕机。在下一次选取时排除该宕掉的Master作为可用的节点,然后等待一定的设定值的毫秒数后再来探测该节点是否恢复,如果恢复就把它作为一台Slave加入Sentinel监测节点群,并在下一次切换时为他分配一个”选取号”。

客户端实现

$ redis-sentinel /etc/redis/sentinel.conf

dev-node-02

SENTINEL MONITOR name ip port quorumSENTINEL REMOVE nameSENTINEL SET name option value

对于一个最小集群,Redis应该是一个Master带上两个Slave,并且开启下列选项:

$ vim /etc/redis/redis.confslaveof 192.168.2.210 6379

文章来自微信公众号:运维之美

$ vim /etc/redis/redis.confrequirepass "000000"

启动N个Sentinel实例,这些Sentinel实例会去监控你指定的Redis Master/Slaves。当Redis Master节点挂掉后,Sentinel实例通过ping检测失败发现这种情况就认为该节点进入 SDOWN状态,也就是检测的Sentinel实例主观地(Subjectively)认为该Redis Master节点挂掉。当一定数目(Quorum参数设定的Sentinel实例都认为该Master挂掉的情况下,该节点将转换进入ODOWN状态,也就是客观地(Objectively)挂掉的状态。接下来Sentinel实例之间发起选举,选择其中一个Sentinel实例发起failover过程:从Slave中选择一台作为新的Master,让其它Slave从新的Master复制数据,并通过Pub/Sub发布事件。使用者客户端从任意Sentinel实例获取Redis配置信息,并监听(可选)Sentinel发出的事件: SDOWN, ODOWN以及failover等,并做相应主从切换,Sentinel还扮演了服务发现的角色。Sentinel的Leader选举采用的是Raft协议。构建Redis Sentinel集群

+sdown master redis-master 192.168.2.210 6379,发现Master检测失败,主观认为该节点挂掉,进入sdown状态。+odown master redis-master 192.168.2.210 6379 #quorum 2/2,有两个Sentinel节点认为Master 6379挂掉,达到配置的quorum值2,因此认为Master已经客观挂掉,进入odown状态。+try-failover master redis-master 192.168.2.210 6379,表示Sentine开始进行故障恢复。+vote-for-leader 2b2446b24a2bd01b9f54a6b2ca4f945a3480dd7e 1,准备选举一个 Sentinel Leader来开始failover。+failover-end master redis-master 192.168.2.210 6379,表示Sentinel完成故障修复,其中包括了Sentinel Leader的选举、备选从数据库的选择等较为复杂的过程。+switch-master redis-master 192.168.2.210 6379 192.168.2.212 6379, 切换Master节点,failover完成。-sdown slave 192.168.2.210:6379 192.168.2.210 6379 @ redis-master 192.168.2.212 6379,192.168.2.210休眠完成后,作为Slave挂载到192.168.2.212后面,可见Sentinel确实同时在监控Slave状态,并且挂掉的节点不会自动移除,而是继续监控。

运行Sentinel有两种方式:

+config-update-from sentinel 192.168.2.210:26379 192.168.2.210 26379 @ redis-master 192.168.2.210 6379

Redis Sentinel环境准备

daemonize yes

$ cat /etc/redis/sentinel.conf# Generated by CONFIG REWRITEmaxclients 4064sentinel leader-epoch redis-master 0sentinel known-slave redis-master 192.168.2.212 6379sentinel known-slave redis-master 192.168.2.211 6379sentinel current-epoch 0

以下输出信息,表明192.168.2.212上的Redis是Master角色。

bind 192.168.2.210

指定Sentinel failover之后重配置客户端时执行的脚本,该配置项可选,但线上系统建议配置。

配置Sentinel

$ vim /etc/redis/sentinel.confdaemonize yesport 26379bind 192.168.2.210sentinel monitor redis-master 192.168.2.210 6379 2sentinel down-after-milliseconds redis-master 5000sentinel failover-timeout redis-master 180000sentinel parallel-syncs redis-master 2sentinel auth-pass redis-master 000000sentinel notification-script redis-master /etc/redis/notify.shsentinel client-reconfig-script redis-master /etc/redis/failover.shlogfile /var/log/redis/redis-sentinel.log

什么是Redis Sentinel

sentinel notification-script redis-master /etc/redis/notify.sh

这里需要注意一点:当一个Master配置需要密码才能连接时,客户端和Slave在连接时都需要提供密码。Master通过requirepass设置自身的密码,不提供密码无法连接到这个Master。Slave通过masterauth来设置访问Master时的密码。

以下输出信息,表明192.168.2.210上的Redis是Slave角色。

停止将要移除的sentinel进程。给其余的sentinel进程发送SENTINEL RESET *命令来重置状态,忘记将要移除的sentinel,每个进程之间间隔30秒。确保所有sentinel对于当前存货的sentinel数量达成一致,可以通过SENTINEL MASTER mastername命令来观察,或者查看配置文件。生产环境推荐

dev-node-01

如果要给Redis设置密码,需要在三个Redis的配置文件中设置相同的密码。

验证下三台主机上的角色

port 26379

启动成功后可以通过redis客户端工具查看当前Sentinel的信息,终端输入:

$ redis-cli -p 6379 -h 192.168.2.210 -a 000000 DEBUG sleep 30

配置Redis

down-after-milliseconds选项指定了Sentinel认为服务器已经断线所需的毫秒数。如果服务器在给定的毫秒数之内,没有返回Sentinel发送的PING命令的回复,或者返回一个错误,那么Sentinel将这个服务器标记为主观下线(subjectively down,简称SDOWN)。

sentinel down-after-milliseconds redis-master 5000

$ cat /etc/redis/sentinel.conf# Generated by CONFIG REWRITEmaxclients 4064sentinel leader-epoch redis-master 1sentinel known-slave redis-master 192.168.2.211 6379sentinel known-slave redis-master 192.168.2.210 6379sentinel known-sentinel redis-master 192.168.2.212 26379 bbf85fae74692d9527e77c5b0bb83a2b5db40dd2sentinel known-sentinel redis-master 192.168.2.210 26379 2b2446b24a2bd01b9f54a6b2ca4f945a3480dd7esentinel current-epoch 1

指定Sentinel检测到该监控的Redis实例failover时调用的报警脚本。脚本被允许执行的最大时间为60秒,超过这个时间脚本会被kill。该配置项可选,但线上系统建议配置。这里的通知脚本简单的记录一下failover事件。

sentinel client-reconfig-script redis-master /etc/redis/failover.sh

查看Sentinel监控的主从服务器

运行Sentinel

启动Sentinel

三台Redis主机配置类似,只是初次配置时角色不同。这里以主机dev-master-01为例,其它两台按实际情况修改就行了。

在Redis Master角色上主要有以下几个事件:

Sentinel系统本身是一个分布式的系统,它的作用是监视Redis服务器,在Master Redis下线时,自动将某个Slave Redis提升为新的主服务器。Redis系统由Master Redis处理客户端的命令请求,Slave Redis作为主服务器的备份而存在。

测试Sentinel

redis-sentinel软件包中默认包含了一个名为sentinel.conf的文件,默认在/etc/redis/sentinel.conf。这里以主机dev-master-01为例,其它两台配置类似,按实际情况修改就行了。

安装Redis和Sentinel

列出所有被监视的主服务器,以及这些主服务器的当前状态。

$ redis-cli -p 6379 -h 192.168.2.210 -a 000000 info Replication# Replicationrole:slavemaster_host:192.168.2.212master_port:6379master_link_status:upmaster_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:2222825slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:593455repl_backlog_histlen:1048576
$ redis-cli -p 26379 -h 192.168.2.210 INFO Sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:2sentinel_scripts_queue_length:1master0:name=redis-master,status=ok,address=192.168.2.210:6379,slaves=2,sentinels=1

第二种:使用redis-server的—sentinel选项

$ redis-cli -p 6379 -h 192.168.2.211 -a 000000 info Replication# Replicationrole:slavemaster_host:192.168.2.212master_port:6379master_link_status:upmaster_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:2283392slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0

以上配置项说明:

如果全部从服务器一起对新的主服务器进行同步,那么就可能会造成所有从服务器在短时间内全部不可用的情况出现。你可以通过将这个值设为1来保证每次只有一个从服务器处于不能处理命令请求的状态。

$ vim /etc/redis/redis.confrequirepass "000000"masterauth "000000"

Sentinel去监视一个名为redis-master的主服务器,这个主服务器的IP地址为192.168.2.210 ,端口号为6379。将这个主服务器判断为失效至少需要2个Sentinel同意,一般设置为N/2+1(N为Sentinel总数)。只要同意Sentinel的数量不达标,自动故障迁移就不会执行。

配置Redis和Sentinel

其他

如果从服务器被设置为允许使用过期数据集(slave-serve-stale-data选项), 那么你可能不希望所有从服务器都在同一时间向新的主服务器发送同步请求。因为尽管复制过程的绝大部分步骤都不会阻塞从服务器,但从服务器在载入主服务器发来的RDB文件时,仍然会造成从服务器在一段时间内不能处理命令请求。

sentinel parallel-syncs redis-master 2

不过只有一个Sentinel将服务器标记为主观下线并不一定会引起服务器的自动故障迁移,只有在足够数量的Sentinel都将一个服务器标记为主观下线之后,服务器才会被标记为客观下线(objectively down,简称ODOWN), 这时自动故障迁移才会执行。将服务器标记为客观下线所需的Sentinel数量由对主服务器的配置(sentinel monitor参数)决定。

$ tail -f /var/log/redis/redis-sentinel.log6207:X 06 Jun 10:40:05.904 # Sentinel runid is 2b2446b24a2bd01b9f54a6b2ca4f945a3480dd7e6207:X 06 Jun 10:40:05.904 # +monitor master redis-master 192.168.2.210 6379 quorum 26207:X 06 Jun 10:40:05.910 * +slave slave 192.168.2.211:6379 192.168.2.211 6379 @ redis-master 192.168.2.210 63796207:X 06 Jun 10:40:05.915 * +slave slave 192.168.2.212:6379 192.168.2.212 6379 @ redis-master 192.168.2.210 63796207:X 06 Jun 12:01:33.098 * +sentinel sentinel 192.168.2.211:26379 192.168.2.211 26379 @ redis-master 192.168.2.210 63796207:X 06 Jun 12:02:07.922 * +sentinel sentinel 192.168.2.212:26379 192.168.2.212 26379 @ redis-master 192.168.2.210 637968.2.212:6379 192.168.2.212 6379 @ redis-master 192.168.2.210 6379

一个一主多从的Redis系统中,可以使用多个Sentinel进行监控任务以保证系统足够稳健。此时,不仅Sentinel会同时监控主数据库和从数据库,Sentinel之间也会相互监控。在这里,建议大家Sentinel至少部署三个,并且使用奇数个Sentinel。

logfile /var/log/redis/redis-sentinel.log

不过要注意,无论你设置要多少个Sentinel同意才能判断一个服务器失效, 一个Sentinel都需要获得系统中多数Sentinel的支持,才能发起一次自动故障迁移,并预留一个给定的配置纪元。(configuration Epoch ,一个配置纪元就是一个新主服务器配置的版本号)。

Sentinel的原理并不复杂:

# 创建通知脚本$ vim /etc/redis/notify.sh#! /bin/bashecho "master failovered at `date`"  /var/log/redis/redis_issues.log

# 给脚本增加执行权限$ chmod +x /etc/redis/notify.sh

Slave可以适当设置优先级,除了0之外(0表示永远不提升为Master),越小的优先级,越有可能被提示为Master。如果Slave分布在多个机房,可以考虑将和Master同一个机房的Slave的优先级设置的更低以提升他被选为新的Master的可能性。

Redis Slave上大多数都和Redis Master上的事件类似,不同的是Redis Slave还多了一步配置更新。

Redis Sentinel是用来实现Redis高可用的一套解决方案。Redis Sentinel由两个部分组成:由一个或者多个Sentinel实例组成Sentinel系统;由一个主Redis服务器(Master Redis)和多个从Redis服务器(Slave Redis)组成主从备份的Redis系统。

PING:返回PONG。SENTINEL masters:列出所有被监视的主服务器,以及这些主服务器的当前状态。SENTINEL master master name:用于查看监控的某个Redis Master信息,包括配置和状态等。SENTINEL slaves master name:列出给定主服务器的所有从服务器,以及这些从服务器的当前状态。SENTINEL sentinels master name:查看给定主服务器的Sentinel实例列表及其状态。SENTINEL get-master-addr-by-name master name:返回给定名字的主服务器的IP地址和端口号。 如果这个主服务器正在执行故障转移操作,或者针对这个主服务器的故障转移操作已经完成,那么这个命令返回新的主服务器的IP地址和端口号。SENTINEL reset pattern:重置所有名字和给定模式pattern相匹配的主服务器。pattern 参数是一个Glob风格的模式。重置操作清除主服务器目前的所有状态,包括正在执行中的故障转移,并移除目前已经发现和关联的,主服务器的所有从服务器和Sentinel。SENTINEL failover master name:当主服务器失效时, 在不询问其他Sentinel意见的情况下, 强制开始一次自动故障迁移(不过发起故障转移的Sentinel会向其他Sentinel发送一个新的配置,其他Sentinel会根据这个配置进行相应的更新)。SENTINEL reset pattern:强制重设所有监控的Master状态,清除已知的Slave和Sentinel实例信息,重新获取并生成配置文件。SENTINEL failover master name:强制发起一次某个Master的failover,如果该Master不可访问的话。SENTINEL ckquorum master name:检测Sentinel配置是否合理,failover的条件是否可能满足,主要用来检测你的Sentinel配置是否正常。SENTINEL flushconfig:强制Sentinel重写所有配置信息到配置文件。SENTINEL is-master-down-by-addr ip port:一个Sentinel可以通过向另一个Sentinel发送SENTINEL is-master-down-by-addr命令来询问对方是否认为给定的服务器已下线。增加和移除监控以及修改配置参数

考虑到可用性和选举的需要,Sentinel进程至少为3个,推荐为5个。如果有网络分区,应当适当分布(比如2个在A机房, 2个在B机房,一个在C机房)等。

第一种:用单独的可执行文件redis-sentinel

由于Redis是异步复制,所以Sentinel其实无法达到强一致性,它承诺的是最终一致性:最后一次failover的Redis Master赢者通吃,其他Slave的数据将被丢弃,重新从新的Master复制数据。此外还有前面提到的分区带来的一致性问题。

Redis Sentinel主要作用

Sentinel验证

在Redis Slave角色上主要有以下几个事件:

当Master设置了密码时,Sentinel连接Master和Slave时需要通过设置参数auth-pass配置相应密码。

sentinel auth-pass redis-master 000000

重新打开sentinel.conf文件,发现Sentinel自动生成了一些信息,记录了监控过程中的状态变化。

监控(Monitoring):Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。提醒(Notification):当被监控的某个Redis服务器出现问题时, Sentinel可以通过API向管理员或者其他应用程序发送通知。自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。

以下输出信息,表明192.168.2.211上的Redis是Slave角色。

我们可以看到每个Sentinel进程都监控到Master挂掉,从sdown状态进入odown,然后选举了一个leader来进行failover,最终192.168.2.212成为新的Master, Sentinel的日志输出:

$ vim /etc/redis/redis.confbind 192.168.2.210

先连接一个Sentinel实例使用 SENTINEL get-master-addr-by-name master-name 获取Redis地址信息。连接返回的Redis地址信息,通过ROLE命令查询是否是Master。如果是,连接进入正常的服务环节。否则应该断开重新查询。(可选)客户端可以通过SENTINEL sentinels master-name来更新自己的Sentinel实例列表。

查看Sentinel配置文件变更

sentinel failover-timeout redis-master 180000

以上两种方式,都必须指定一个Sentinel的配置文件sentinel.conf。需要确保配置文件是可写的,因为Sentinel会往配置文件里添加很多信息作为状态持久化,这是为了重启等情况下可以正确地恢复 Sentinel的状态。

这样能保证写入Master的同时至少写入一个Slave,如果出现网络分区阻隔并发生failover的时候,可以保证写入的数据最终一致而不是丢失,写入老的Master会直接失败。

Redis默认会绑定到127.0.0.1,这里要在多台机器间通信,我们将它绑定到主机IP上。

配置完Redis和Sentinel之后,按顺序启动各个角色。启动顺序如下:Master-Slave-Sentinel,要确保按照这个顺序依次启动。

虽然Redis Sentinel有单独的软件安装包,但实际上它只是一个运行在特殊模式下的Redis实例。当前Redis Stable版已经自带了redis-sentinel这个工具。你可以在启动一个普通Redis实例时通过给定--sentinel选项来启动Redis Sentinel。

$ redis-server /etc/redis/sentinel.conf --sentinel

其次,Sentinel的选举算法依赖时间,因此要确保所有机器的时间同步,如果发现时间不一致,Sentinel实现了一个TITL模式来保护系统的可用性。

$ redis-cli -p 26379 -h 192.168.2.210192.168.2.210:26379 sentinel master redis-master 1) "name" 2) "redis-master" 3) "ip" 4) "192.168.2.210" 5) "port" 6) "6379" 7) "runid" 8) "02d88a6105ce3277745c1fc65b695887f165f302" 9) "flags"10) "master"11) "pending-commands"12) "0"13) "last-ping-sent"14) "0"15) "last-ok-ping-reply"16) "1096"17) "last-ping-reply"18) "1096"19) "down-after-milliseconds"20) "5000"21) "info-refresh"22) "4732"23) "role-reported"24) "master"25) "role-reported-time"26) "667578"27) "config-epoch"28) "0"29) "num-slaves"30) "2"31) "num-other-sentinels"32) "0"33) "quorum"34) "2"35) "failover-timeout"36) "180000"37) "parallel-syncs"38) "2"39) "notification-script"40) "/etc/redis/notify.sh"
$ systemctl start redis
$ apt-get install redis-server redis-sentinel

增加和移除Sentinel

经过一次failover后,会发现Sentinel配置文件变更了以下一些内容。可以看到Sentinel将最新的集群状态写入了配置文件。

查看sentinel.conf

在三台服务器上分别安装Redis和Sentinel。需要注意的是,如果要给Redis设置密码,需要在三个Redis的配置文件中设置相同的密码。

Sentinel实例之间的通讯端口,该端口号默认为26379。

以后台进程模式运行。

Sentinel日常运维Sentinel常用命令

以下列出的是Sentinel接受的命令:

我们这里用redis-sentinel方式来启动:

parallel-syncs选项指定了在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步。这个数字越小,完成故障转移所需的时间就越长。

sentinel monitor redis-master 192.168.2.210 6379 2

设置主从复制

日志文件所在位置,默认在/var/log/redis/redis-sentinel.log。

日志的几个主要事件

客户端从过去直接连接Redis ,变成:

本文由澳门威斯尼人平台登录发布于服务器&运维,转载请注明出处:澳门威斯尼人平台登录哨兵模式,Sentinel集群部署

相关阅读