概述

在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。redis也是如此,为我们提供了复制功能。

参与复制的redis实例分为主节点和从节点,默认情况下,redis都是主节点。每个主节点可以有多个从节点,每个从节点只能有一个主节点,复制是单向的,只能由主节点复制到子节点。

比方说现在有两台机192.168.85.110主节点,192.168.85.111从节点,要建立如下主从关系。




redis双节点集群模式 redis多个主节点_redis 主从配置


前置-安全性校验

在开启主从复制之前,redis配置默认有保护模式配置,需要设置一下,否则会导致开启主从复制失败。

方式一修改保护模式: redis默认只允许本地客户端进行连接,所以在设置主从复制的时候,需要关闭主节点的保护,在配置中修改protected-mode为no

protected-mode yes

方式二设置口令(推荐): 修改主节点配置,设置密码auth

requirepass 123456

修改从节点的配置,设置主节点的密码

masterauth 123456

设置口令或者关闭保护模式之后就可以设置主从复制了。

主从复制的命令:

  • 在配置中直接添加:
slaveof 192.168.85.110 6379
  • 在redis-server启动命令时候--slaveof host port
./src/redis-server --slaveof 192.168.85.110 6379 &
  • 直接设置命令 slaveof host port
slaveof 192.168.85.110 6379

以上三种方式都是在从节点中配置,如果主节点有设置密码,记得要在从节点的配置文件中设置主节点的密码masterauth,并且启动时候让配置生效。

设置完成之后,可以对主从节点进行测试,尝试往主节点写入,看有无复制到从节点:

110主节点:

127.0.0.1:6379> set say helloworldOK127.0.0.1:6379> get say"helloworld"

111从节点:

127.0.0.1:6379> get say"helloworld"

同时也可以通过info replication查看复制相关的状态信息 110主节点:

127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:1slave0:ip=192.168.85.111,port=6379,state=online,offset=899,lag=1

切主

slaveof还可以实现切主操作,既是可以从节点对主节点的复制,变成从节点对另外一个主节点的复制。


redis双节点集群模式 redis多个主节点_redis主从复制_02


切主操作流程如下:

  1. 断开与旧主节点复制关系。
  2. 与新主节点建立复制关系。
  3. 删除从节点当前所有数据。
  4. 对新主节点进行复制操作。

去除主从关系

slaveof no one


redis双节点集群模式 redis多个主节点_redis主从_03


110主节点:

127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:0

断开复制的主要流程:

  1. 断开与主节点的复制关系
  2. 从节点晋升为主节点从节点断开复制后不会抛弃原有的数据,只是无法再获取主节点的变化信息。

注意点

  • 设置主从或切主之后,从节点数据都会被删除,所以要特别小心。
  • 设置主从复制关系之后,主节点要注意设置好持久化,防止断电重启之后,主节点没有数据,从节点由于复制主节点,导致从节点数据也被清空的问题。
  • 一般情况下,从节点默认的配置replica-read-only为只读模式,由于复制是单向的,只能是主节点到从节点,为了保持主从数据的一致性,应不要随意修改该配置。