通常使用redis时,如果redis存储的是一些非常重要的数据,那么只配置一台服务器的redis是有风险的,以为如果主服务器宕机,影响到正常业务之外,最终要的是数据的丢失,因此我们常常会配置多台redis做集群,除了防止主机宕机,我们还可以实现读写分离,任务分离等。
为了使redis其高可用,redis在2.4版本后加入了sentinel功能,主要功能是在主机宕机时自动选举出一个slave,并且将其转换为master,保证业务的正常运行。这篇文章我们就模拟配置redis的集群和sentinel监控功能
一、 配置redis集群
1、 服务器信息
系统:centos 6.5
服务器: 采用3台服务器,实现一主两从
主master:192.168.1.11
从slave1: 192.168.1.12
从slave1: 192.168.1.13
确保三台机器安装了相同版本的redis,并且关闭防火墙和seLinux
2、主从服务器配置参考
编辑redis的配置文件:redis.conf
3、 配置成功后启动三台服务器的redis,启动顺序最好为先master后slave,启动后,登录到redis命令行,执行info Replication
Replication主要需要监控的信息已标红,上面的信息则表示主从启动成功
二、 sentinel监控
如果主服务器master挂了,那么我们需要切换master服务器并且将其他slave指向新的master,具体的操作流程为:选取一台slave, 该服务器是我们即将配置的new master,将其slaveof选项配为no one,并且将slave-read-only配置为no,然后将其它所有的slave指向新的master
1、 手动进行master-slave切换
1)登录192.168.1.11(master)主机的redis,执行shutdown命令关闭redis
2)登录192.168.1.12(new master),执行如下命令:
127.0.0.1:6379> slaveof no one
127.0.0.1:6379> config set slave-read-only no
3)登录192.168.1.13(slave),执行如下命令,:
127.0.0.1:6379> slaveof 192.168.1.12 6379 #若有多台slave,则所有slave都需重新指定master
此时再执行info Replication命令,发现主从一切换完毕
2、 sentinel监控实现自动切换
1、 配置文件位置
sentinel.conf配置文件一般在redis的安装包目录下,将该文件拷贝至拷贝至redis安装目录的根目录下(或/etc下,这个根据个人喜好来定)
2、 sentinel配置说明
[root@master ~]# vi /application/redis/sentinel.conf port 26379 # sentinel监听的端口 sentinel monitor mymaster 192.168.1.11 6379 1 # 主服务器信息 # 注意:末尾的数字n表示当有n个哨兵同事检测到主服务器挂了时,redis才会认为master挂掉并进行从服务器的切换,这里的数字不能大于哨兵的个数,我们只有一个哨兵监控,因此配置1即可,mymaster 可随意起名,但是要与下列的配置保持一致 sentinel down-after-milliseconds mymaster 30000 # 表示sentinel在多少毫秒后连接不到master认为master断开 sentinel parallel-syncs mymaster 1 # 表示一次性允许多少slave指向新的new master. 这里默认为1,如果该数值过大会导致新的master服务器IO剧增,保持默认1即可 sentinel client-reconfig-script mymaster /var/redis/reconfig.sh # 在重新配置new master,new slave过程,可以触发的脚本,可发邮件或者修改项目中的redis指向等
3、 启动sentinel
/application/redis/bin/redis-server /application/redis/sentinel.conf --sentinel
启动后sentinel会占据终端窗口,若想让sentinel在后台运行,执行下面命令即可:
/application/redis/redis-server /application/redis/sentinel.conf --sentinel 2>&1 >> /tmp/sentinel.log &
状态可检测日志
启动sentinel后,可看到master状态和slave的状态,窗口如下:
[root@master ~]# redis-server /application/redis/sentinel.conf --sentinel
9965:X 20 Jul 10:13:43.110 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.2.1 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 9965
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
9965:X 20 Jul 10:13:43.111 # Sentinel ID is 79dfd62f9884969637c28f36ced52c2b9a8ac425
9965:X 20 Jul 10:13:43.111 # +monitor master mymaster 192.168.1.11 6379 quorum 1
9965:X 20 Jul 11:25:37.147 * +slave slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379
9965:X 20 Jul 11:25:37.158 * +slave slave 192.168.1.11:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379
4、 此时我们登陆master(192.168.1.11)使用shutdown命令关闭master,
127.0.0.1:6379> shutdown
not connected>
查看两个slave的Replication的状态(使用infoReplication命令),结果如下:
可以看到,两台slave机子会显示主机master为192.168.1.11,但是master_link_status状态为down,表示master已下线,此时sentinel会检测到master已经下线,经过我们设定的超时时间后(sentinel down-after-milliseconds mymaster 30000 ),leader就需要开始将选举一个salve提升为master,此slave必须为状态良好(不能处于SDOWN/ODOWN状态)且权重值最低(redis.conf中的slave-priority参数)的,当master身份被确认后,开始failover,具体流程如下:
[root@master ~]# redis-server /application/redis/sentinel.conf --sentinel 9965:X 20 Jul 10:13:43.110 * Increased maximum number of open files to 10032 (it was originally set to 1024). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.2.1 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 | `-._ `._ / _.-' | PID: 9965 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 9965:X 20 Jul 10:13:43.111 # Sentinel ID is 79dfd62f9884969637c28f36ced52c2b9a8ac425 9965:X 20 Jul 10:13:43.111 # +monitor master mymaster 192.168.1.11 6379 quorum 1 9965:X 20 Jul 10:17:10.072 # +sdown master mymaster 192.168.1.11 6379 9965:X 20 Jul 10:17:10.072 # +odown master mymaster 192.168.1.11 6379 #quorum 1/1 9965:X 20 Jul 10:17:10.072 # +new-epoch 20 9965:X 20 Jul 10:17:10.072 # +try-failover master mymaster 192.168.1.11 6379 9965:X 20 Jul 10:17:10.093 # +vote-for-leader 79dfd62f9884969637c28f36ced52c2b9a8ac425 20 9965:X 20 Jul 10:17:10.093 # +elected-leader master mymaster 192.168.1.11 6379 9965:X 20 Jul 10:17:10.093 # +failover-state-select-slave master mymaster 192.168.1.11 6379 # Leader开始查找合适的slave 9965:X 20 Jul 10:17:10.194 # +selected-slave slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379 # 确定合适的slave 9965:X 20 Jul 10:17:10.194 * +failover-state-send-slaveof-noone slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379 # Leader向slave发送“slaveof no one”指令,此时slave已经完成master的角色转换 9965:X 20 Jul 10:17:10.279 * +failover-state-wait-promotion slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379 # 等待其他sentinel确认slave 9965:X 20 Jul 10:17:11.103 # +promoted-slave slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379 # 确认成功 9965:X 20 Jul 10:17:11.103 # +failover-state-reconf-slaves master mymaster 192.168.1.11 6379 # 开始对slaves进行reconfig操作 9965:X 20 Jul 10:17:11.172 * +slave-reconf-sent slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379 # 向指定的slave发送“slaveof”指令,告知此slave跟随新的master 9965:X 20 Jul 10:17:12.167 * +slave-reconf-inprog slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379 # 此slave正在执行slaveof + SYNC过程,如过slave收到“+slave-reconf-sent”之后将会执行slaveof操作 9965:X 20 Jul 10:17:12.167 * +slave-reconf-done slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379 # 此slave同步完成,此后leader可以继续下一个slave的reconfig操作,直至操作完所有slave 9965:X 20 Jul 10:17:12.257 # +failover-end master mymaster 192.168.1.11 6379 # 切换完成 9965:X 20 Jul 10:17:12.257 # +switch-master mymaster 192.168.1.11 6379 192.168.1.13 6379 # 切换master后,所有sentinel开始监控新的master 9965:X 20 Jul 10:17:12.259 * +slave slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.13 6379 9965:X 20 Jul 10:17:12.259 * +slave slave 192.168.1.11:6379 192.168.1.11 6379 @ mymaster 192.168.1.13 6379 9965:X 20 Jul 10:17:42.270 # +sdown slave 192.168.1.11:6379 192.168.1.11 6379 @ mymaster 192.168.1.13 6379 # 11号机子下线
再查看两台slave的状态,发现192.168.1.13的role已变为master,并且192.168.1.12这台服务器已经指向了新的master
这时如果重新启动192.168.1.11这台原始的master主句
sentinel监控端显示:
10050:X 20 Jul 12:17:50.984 # -sdown slave 192.168.1.11:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379 10050:X 20 Jul 12:18:00.904 * +convert-to-slave slave 192.168.1.11:6379 192.168.1.11 6379 @ mymaster 192.168.1.13 6379 # 转换为从服务器
发现sentinel已经将原有的主服务master器转换为了从服务器slave