# Redis三主三从集群高可用维护手册

# 前言:

三主三从是redis-cluster最常用的架构,每个从节点复制的都不是本机主库的数据,而是其他节点主库的数据,这样即使某一台主机坏掉了,从节点备份还是在其他机器上,这样就做到了高可用,三主三从架构允许最多坏一台主机。

三主三从我们采用交叉复制架构类型,这样可以做到最多坏一台主机集群还是正常可以用的,如果每台主机的6381节点都是6380节点的备份,那么这台机器坏了,集群就不可用了,因此想要做到高可用,就必须采用交叉复制。如下面架构图所示。

三台服务器部署redis集群三主三从(高可用)合理架构图:

# 三主三从集群的创建:

一、集群创建时,默认是采用的交叉复制方式,将3个主节点放在3台主机,且每个主节点slave都存放在别的主机。(M:开头为主节点;S:开头为从节点);如下图:

三个主节点分别是:10.2.5.121:6380、10.2.5.122:6380、10.2.5.124:6380

三个从节点分别是:10.2.5.121:6381、10.2.5.122:6381、10.2.5.124:6381

# 三主三从集群的停止与启动:

步骤1、停止:先停三个从节点,再停三个主节点

步骤2、删除所有主节点、从节点的dump.rdb文件(OA不需要redis持久化数据)

步骤3、启动:先启动三个主节点,再启动三个从节点

重启完成后,请执行检查命令,检查集群状态,确认没有出现2个主节点在同一台主机。

./redis-cli --cluster check 10.2.5.121:6380 -a Seeyon123456

# 集群高可用注意事项:

集群高可用因避免出现2个主节点再同一台服务器。

可能出现的情况如下:

1、其中一台主机发生故障,主机上的2个redis节点宕机,集群主从做了切换。

模拟10.2.5.121服务器宕机,此时查询redis集群状态如下:

可以看出2个主节点:10.2.5.122:6380、10.2.5.122:6381,在同一台服务器上了。此时,再启动121上的2个redis服务,就是变成从节点。

2、手动停过redis服务

如果出现2个主节点再同一台服务器,我们需要把关系切换回来,不能让一台机器上同时存在两台主库,每次故障处理后一定要把主从架构修改会原来的样子。

# 解决策略:将原来的主库(新从库)重新变为主库

已下图为例:10.2.5.122服务器出现了2个主节点。在集群创建时,10.2.5.122:6381原本是从节点,现在变成了主节点,它对应的从节点10.2.5.121:6380原本是主节点,现在变成了从节点,原因就是2者之间做了主从切换

# 解决方法一:在122服务器上停掉主节点M2,等121上的从节点S2切换成主后,在重新启动

# 解决方法二:将10.2.5.121:6380从库切换成主库,只需要连上10.2.5.121:6380,执行CLUSTER FAILOVER即可变为主库

将新从库重新切换为主库

[root@redis-1 ~]# ./redis-cli -h 10.2.5.121 -p 6380 -a Seeyon123456

10.2.5.121:6380> CLUSTER FAILOVER

OK

# 附言:

主从数据同步原理:

1、全量同步

当一个redis服务器初次向主服务器发送salveof命令时,redis从服务器会进行一次全量同步。

salveof:将当前服务器转变为指定服务器的从属服务器,就是给主机加一个从机

  • 1、 slave服务器向master发送psync命令,告诉master我需要同步数据。

  • 2、 master接收到psync命令后会进行BGSAVE命令生成RDB文件快照。

  • 3、生成完后,会将RDB文件发送给slave。

  • 4、slave接收到文件会载入RDB快照,并且将数据库状态变更为master在执行BGSAVE时的状态一致。

  • 5、 master会发送保存在缓冲区里的所有写命令,告诉slave可以进行同步了

  • 6、slave执行这些写命令。

2、增量同步

slave已经同步过master了,那么如果后续master进行了写操作,比如说一个简单的set name redis,那么master执行过当前命令后,会将当前命令发送给slave执行一遍,达成数据一致性。

3、重新复制

当slave断开重连之后会进行重新同步,重新同步分完全同步和部分同步。

  • 1、当slave断开重连后,会发送psync 命令给master。

  • 2、master收到psync后会返回+continue回复,表示slave可以执行部分同步了。

  • 3、master发送断线后的写命令给slave

  • 4、slave执行写命令。

创建人:zhangshuang