Redis提供了主从同步功能。

    通过slaveof配置项可以控制某一个Redis作为另一个Redis的从服务器,通过指定IP和端口来定位到主Redis的位置。一般情况下建议用户为从Redis设置一个不同频率的快照持久化的周期,或者为从Redis配置一个不同的服务端口等等。

  • slaveof <masterip> <masterport>

    如果主Redis设置了验证密码的话(使用requirepass来设置),则在从Redis的配置中要使用masterauth来设置校验密码,否则的话,主Redis会拒绝从Redis的访问请求。

  • masterauth <master-password>

    当从Redis失去了与主Redis的连接,或者主从同步正在进行中时,Redis该如何处理外部发来的访问请求呢?这里,从Redis可以有两种选择:

  •     第一种选择:如果slave-serve-stale-data设置为yes(默认),则从Redis仍会继续响应客户端的读写请求。
  •     第二种选择:如果slave-serve-stale-data设置为no,则从Redis会对客户端的请求返回“SYNC with master inprogress”,当然也有例外,当客户端发来INFO请求和SLAVEOF请求,从Redis还是会进行处理。

    可以控制一个从Redis是否可以接受写请求。将数据直接写入从Redis,一般只适用于那些生命周期非常短的数据,因为在主从同步时,这些临时数据就会被清理掉。自从Redis2.6版本之后,默认从Redis为只读。

  • slave-read-only yes

    只读的从Redis并不适合直接暴露给不可信的客户端。为了尽量降低风险,可以使用rename-command指令来将一些可能有破坏力的命令重命名,避免外部直接调用。比如:

  • rename-command CONFIG b8c02d524045429941cc15f59e41cb7be6c52

    从Redis会周期性的向主Redis发出PING包。可以通过repl_ping_slave_period指令来控制其周期。默认是10秒。

  • repl-ping-slave-period 10

    在主从同步时,可能在这些情况下会有超时发生:

    (1)以从Redis的角度来看,当有大规模IO传输时。

    (2)以从Redis的角度来看,当数据传输或PING时,主Redis超时

    (3)以主Redis的角度来看,在回复从Redis的PING时,从Redis超时

    用户可以设置上述超时的时限,不过要确保这个时限比repl-ping-slave-period的值要大,否则每次主Redis都会认为从Redis超时。

  • repl-timeout 60

    我们可以控制在主从同步时是否禁用TCP_NODELAY。如果开启TCP_NODELAY,那么主Redis会使用更少的TCP包和更少的带宽来向从Redis传输数据。但是这可能会增加一些同步的延迟,大概会达到40毫秒左右。如果关闭了TCP_NODELAY,那么数据同步的延迟时间会降低,但是会消耗更多的带宽。

  • repl-disable-tcp-nodelay no

    我们还可以设置同步队列长度。队列长度(backlog)是主Redis中的一个缓冲区,在与从Redis断开连接期间,主Redis会用这个缓冲区来缓存应该发给从Redis的数据。这样的话,当从Redis重新连接上之后,就不必重新全量同步数据,只需要同步这部分增量数据即可。

  • repl-backlog-size 1mb

    如果主Redis等了一段时间之后,还是无法连接到从Redis,那么缓冲队列中的数据将被清理掉。我们可以设置主Redis要等待的时间长度。如果设置为0,则表示永远不清理。默认是1个小时。

  • repl-backlog-ttl 3600

    我们可以给众多的从Redis设置优先级,在主Redis持续工作不正常的情况,优先级高的从Redis将会升级为主Redis。而编号越小,优先级越高。比如一个主Redis有三个从Redis,优先级编号分别为10、100、25,那么编号为10的从Redis将会被首先选中升级为主Redis。当优先级被设置为0时,这个从Redis将永远也不会被选中。默认的优先级为100。

  • slave-priority 100

    假如主Redis发现有超过M个从Redis的连接延时大于N秒,那么主Redis就停止接受外来的写请求。这是因为从Redis一般会每秒钟都向主Redis发出PING,而主Redis会记录每一个从Redis最近一次发来PING的时间点,所以主Redis能够了解每一个从Redis的运行情况。

  • min-slaves-to-write 3
  • min-slaves-max-lag 10

    上面这个例子表示,假如有大于等于3个从Redis的连接延迟大于10秒,那么主Redis就不再接受外部的写请求。上述两个配置中有一个被置为0,则这个特性将被关闭。默认情况下min-slaves-to-write为0,而min-slaves-max-lag为10。