Linux下redis的主从复制+主从切换(redis-sentinel实现高可用)(redis版本:redis-5.0.3)——这里以一主两从为例

续我的上篇博文:https://mp.csdn.net/postedit?not_checkout=1

一.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)

猜你喜欢

转载自blog.csdn.net/qq_42303254/article/details/87984308