Redis包含三种集群策略:

  1. 主从复制
  2. 哨兵模式
  3. redis cluster

 

主从复制

在主从复制中,数据分为两类:主数据库(master)和 从数据库(slave)。其中主从复制有如下特点:

  1.     主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
  2.     从数据库一般都是只读的,并且结束主数据库同步过来的数据
  3.     一个master可以拥有多个slave,但是一个slave只能对应一个master

 

主从复制工作机制

1. 全量同步

初始化:
    全量同步,redis全量复制一般发生在slave创建之处,这时slave需要将master上的所有数据都复制一份。具体步骤如下:
    (1)从服务器连接主服务器,发送SYNC命令;
    (2)主服务器收到SYNC命令后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
    (3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
    (4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
    (5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
    (6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令
    (7)复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性

Redis 集群使用(2)

 

 

2. 增量同步

    redis增量复制是指slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的命令。

 

3. redis主从同步策略

    主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,salve 在任何时候都可以发起全量同步。redis策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从节点进行全量同步。

 

4. 注意点

    如果多个slave断线了,需要重启服务,因为只要slave重启,就会发送SYNC请求和master全量同步,当多个同时出现的时候,可能会导致Master IO剧增。

 

主从复制实例

 

版本信息

Redis 集群使用(2)

 

 节点信息

Redis 集群使用(2)

 

redis基础安装上篇博客已经详细介绍:https://www.cnblogs.com/hukey/p/10053557.html 这里不在赘述

 

主要解析 redis 主从复制 参数和配置

在配置redis的时候要注意以下几点:

  1. 监听的地址一定要是两台服务器连通的地址,如监听 127.0.0.1 两端肯定是不会通的,通常可以直接修改为 bind 0.0.0.0;
  2. 从服务器启动了两个redis服务,请分别申明 dump.rdb文件名和log文件名

 

主redis启动服务:

[root@redis-master ~]# redis-server /usr/local/redis/conf/6379.conf 
[root@redis-master ~]# netstat -ntplu | egrep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      14485/redis-server

从redis启动服务:
注意:从 redis 一共是启动两个redis服务,端口为:63806381
[root@redis-slave-1 ~]# redis-server /usr/local/redis/conf/6380.conf 
[root@redis-slave-1 ~]# redis-server /usr/local/redis/conf/6381.conf 
[root@redis-slave-1 ~]# netstat -ntplu | egrep redis
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      14386/redis-server  
tcp        0      0 0.0.0.0:6381            0.0.0.0:*               LISTEN      14391/redis-server

 

服务启动成功,接下来就可以进行主从的配置,具体相关配置参数:

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 in progress”,当然也有例外,当客户端发来INFO请求和SLAVEOF请求,从redis还是会进行处理。
你可以控制一个从redis是否可以接受写请求。将数据直接写入从redis,一般只适用于那些生命周期非常短的数据,因为在主从同步时,这些临时数据就会被清理掉。自从redis2.6版本之后,默认从redis为只读。

slave-read-only yes

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

从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

我们还可以设置同步队列长度。队列长度(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、10025,那么编号为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。
关于主从复制参数注解

相关文章: