一.Redis配置文件/etc/redis/sentinel.conf中几个重要的配置项含义
1.port 26379
sentinel监听端口,默认是26379,可以修改。
2.daemonize no
默认情况下,sentinel是不是在后台运行的,如果需要在后台运行,把该项的值更改为yes。
3.sentinel auth-pass <master-name> <password>
设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。
配置示例:
sentinel auth-pass mymaster 0123passw0rd
4.sentinel monitor <master-name> <ip> <redis-port> <quorum>
告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效。master-name只能包含英文字母,数字,和“.-_”这三个字符 需要注意的是master-ip 要写真实的ip地址而不要用回环地址(127.0.0.1)。
所以一般设置的redis的主从个数为奇数个。
配置示例:
sentinel monitor mymaster 172.25.83.1 6379 2
5.sentinel down-after-milliseconds <master-name> <milliseconds>
这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒
配置示例:
sentinel down-after-milliseconds mymaster 10000
6.sentinel parallel-syncs <master-name> <numslaves>
这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成 failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设 为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
配置示例:
sentinel parallel-syncs mymaster 1
7. sentinel failover-timeout <master-name> <milliseconds>
failover-timeout 可以用在以下这些方面:
1. 同一个sentinel对同一个master两次failover之间的间隔时间。
2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
3.当想要取消一个正在进行的failover所需要的时间。
4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个时件,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。
配置示例:
sentinel failover-timeout mymaster1 180000
二.实验环境(rhel7.3版本)
1.selinux和firewalld状态为disabled
2.各主机信息如下:
主机 | ip |
server1(主机) | 172.25.83.1 |
server2(从机) | 172.25.83.2 |
server3(从机) | 172.25.83.3 |
三.redis主从复制+主从切换的部署(redis-sentinel实现高可用)
1.在配置好一主一从的前提下,新增加一从——server3(该从的配置同server2)
2.配置server1(主机)
<1>将sentinel配置文件拷贝到/etc/redis目录中
[root@server1 redis-5.0.3]# cp sentinel.conf /etc/redis/
<2>编辑sentinel配置文件(sentinel端口是26379)
[root@server1 redis]# vim sentinel.conf
#将17行的注释去掉:
protected-mode no 关闭保护模式,可以进行远程连接
将84行的127.0.0.1该为172.25.83.1
sentinel monitor mymaster 172.25.83.1 6379 2 #监控的名称是mymaster,2表示裁决,三台主机只有半数以上同意方可切换。
为了便于测试,将113行的30000改为10000
sentinel down-after-milliseconds mymaster 10000 #10秒收不到master的数据包,就认为master已经down。
<3>开启sentinel
[root@server1 redis]# redis-server --help #首先查看sentinel开启的命令
[root@server1 redis]# redis-server /etc/redis/sentinel.conf --sentinel #按照帮助给出的提示,开启sentinel
3.配置server2(从机):配置过程同server1。
<1>为了方便,将server1配好的sentinel配置文件发送到server2
不过值的注意的是:将server1上配好的sentinel文件发送给server2,一定要在server1开启sentinel之前。这是因为如果开启sentinel,然后再发送,那么sentinel配置文件会发生改变。那么发送给server2之后,在server2上启动sentinel会报错。
<2>开启sentinel
[root@serve2 redis]# redis-server /etc/redis/sentinel.conf --sentinel
4.配置server3:配置过程同server1
<1>为了方便,将server1配好的sentinel配置文件发送到server3
不过值的注意的是:将server1上配好的sentinel文件发送给server2,一定要在server1开启sentinel之前。这是因为如果开启sentinel,然后再发送,那么sentinel配置文件会发生改变。那么发送给server2之后,在server2上启动sentinel会报错。
<2>开启sentinel
[root@serve3 redis]# redis-server /etc/redis/sentinel.conf --sentinel
5.测试一:重新开server1,server2,server3的终端(因为之前的终端被sentinel的开启占用)
<1>查看redis集群的复制情况
在查看redis集群的复制情况之前,可以先了解如下的一条命令
[root@server1 ~]# redis-cli --help #在远程连接之前,前查看帮助,以清楚远程连接的命令
server1:
[root@server1 ~]# redis-cli
127.0.0.1:6379>info replication
当然也可以在server2上远程连接server1,来查看server1的状态
[root@server2 ~]# redis-cli -h 172.25.83.1 #远程连接server1
172.25.83.1:6379> info replication
也可以利用下面的命令来查看sentinel情况(查看sentinel的情况的前提是sentinel是开启的)
[root@server1 ~]# redis-cli -p 26379
127.0.0.1:26379> info
当然也可以在server2或server3上,远程连接server1的26379,查看sentinel的状态(查看sentinel的情况的前提是sentinel是开启的)
[root@server2 ~]# redis-cli -h 172.25.83.1 -p 26379
172.25.83.1:26379> info
server2:操作同serve1
server3:操作同serve1
<2>手工down掉master(server1)
可见172.25.83.3切换为master,172.25.83.2从机开始指向新的master同步(当然主机挂掉之后,谁成为master,这是随机的)
<3>手动让旧的master(server1)重新上线做从机。
可以看到旧的master(server1)指向新的master(server3)
[root@server1 ~]# /etc/init.d/redis_6379 start
[root@server1 ~]# redis-cli
127.0.0.1:6379> info replication
6.测试二:手工将所有从机down掉,看主机能否再设置key和value值(答案:可写)
手动down掉从机server1和从机server2
此时可以看到主机server3已经没有slave
此时主机server3仍然可以设定键和value值
7.测试二:手工将所有从机down掉,并将主机和从机上的参数min-replicas-to-write和min-replicas-max-lag 进行设置,看主机能否再设置key和value值(答案:不可写)
<1>先将从机server1和server2上的redis打开,以恢复server1和server2从机的身份。以保证对后续实验没有影响
<2>在server1,server2,server3上的/etc/redis/6379.conf文件中,将下面两行内容修改如下,修改之后,重启redis服务
min-replicas-to-write 1 #一redis提供了可以让master停止写入的方式,如果配置了min-slaves-to-write,健康的slave的个数小于N(这里是1),mater就禁止写入。master最少得有多少个健康的slave存活才能执行写命令。这个配置虽然不能保证N个(这里是1)slave都一定能接收到master的写操作,但是能避免没有足够健康的slave的时候,master不能写入来避免数据丢失。设置为0是关闭该功能。
min-replicas-max-lag 10 #延迟小于min-slaves-max-lag秒的slave才认为是健康的slave。
<3>此时再手工down掉所有从机(server1和server2)
此时可以看到主机server3已经没有slave
此时主机server3是不可以设定键和value值(报错是:因为没有足够的slave)