【Redis】Redis Replication(主从复制)

主从搭建(1主2从)

  • 3台redis实例,ip和redis端口:
1
2
3
192.168.1.15:6379
192.168.1.16:6379
192.168.1.17:6379

      准备把192.168.1.15作为主,192.168.1.16192.168.1.17作为从。

  • 丛机相关配置修改(6379.conf,原redis.conf)
1
2
3
bind 192.168.1.16 # 192.168.1.17,绑定本机ip
slaveof 192.168.1.15 6379 # slaveof master主机ip 端口号
slave-read-only yes # 默认就是yes,开启了只读的redis slave node,会拒绝所有的写操作,强制读写分离
  • 主机相关配置修改(6379.conf,原redis.conf)
1
2
bind 192.168.1.15
slave-read-only yes
  • 重启3台redis实例,redis相关查看命令:
1
2
redis-cli -h ipaddr #登录指定ip的redis
info replication #查看redis相关信息

replication流程

核心流程

1. slave node启动,仅仅保存master node的信息,包括master node的host和ip,但是复制流程没开始。(master host和ip来源根据redis.conf里面的slaveof配置的)。
2. slave node内部有个定时任务,每秒检查是否有新的master node要连接和复制,如果发现,就跟master node建立socket网络连接。
3. slave node发送ping命令给master node。
4. 口令认证,如果master设置了requirepass,那么salve node必须发送masterauth的口令过去进行认证。
5. slave发送PSYNC命令给master,开始数据同步
6. master node第一次执行**全量复制(full resynchronization)**,将所有数据发给slave node。
7. slave node重新连接master node,那么master node仅仅会复制给slave部分缺少的数据(**增量复制**)
  • 注意事项:
    1. slave node做复制的时候,是不会block master node的正常工作的。
    2. slave node在做复制的时候,也不会block对自己的查询操作,它会用旧的数据集来提供服务;但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了。
    3. slave node主要用来进行横向扩容,做读写分离,扩容的slave node可以提高读的吞吐量。
    4. 过期key处理:slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。
    5. 全量复制和增量复制,具体还需要根据master run id、backlog、offset来判断是全量还是增量,这几个参数相关解释如下。

全量复制

  1. master执行bgsave,在本地生成一份rdb快照文件。
  2. master node将rdb快照文件发送给salve node,如果rdb复制时间超过60秒(repl-timeout),那么slave node就会认为复制失败,适当调大这个参数(对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s)。
  3. master node在生成rdb时,会将所有新的写命令缓存在内存中,在salve node保存了rdb之后,再将新的写命令复制给salve node。
  4. client-output-buffer-limit slave 256MB 64MB 60 ,如果在复制期间,内存缓冲区持续60s消耗超过64MB,或者一次性超过256MB,那么停止复制,断开复制连接,复制失败。
  5. slave node接收到rdb之后,清空自己的旧数据,然后重新加载rdb到自己的内存中,同时基于薪的数据版本对外提供服务。
  6. 如果slave node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF。
  • 注意事项:
    1. rdb生成、rdb通过网络拷贝、slave旧数据的清理、slave aof rewrite,很耗费时间。如果复制的数据量在4G~6G之间,那么可能全量复制时间消耗到1分半到2分钟(理论测试值,具体看机器配置以及网络配置)
    2. master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘保存。
1
2
repl-diskless-sync no #默认no
repl-diskless-sync-delay #等待一定时长再开始复制,因为要等更多slave重新连接过来

增量复制

  1. 如果全量复制过程中,master-slave网络连接断掉,那么salve重新连接master时,会触发增量复制。
  2. master直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB。
  3. msater就是根据slave发送的psync中的offset来从backlog中获取数据的。

相关参数详解

offset

  • master和slave都会维护一个offset,保存在backlog中。
  • master会在自身不断累加offset,slave也会在自身不断累加offset。
  • slave每秒都会上报自己的offset给master,同时master也会保存每个slave的offset。
  • 这并不是说特定就用在全量复制的,主要是master和slave都要知道各自的数据的offset,才能知道互相之间的数据不一致的情况。

backlog

  • master node有一个backlog,默认是1MB大小。
  • master node给slave node复制数据时,也会将数据在backlog中同步写一份。
  • backlog主要是用来做全量复制中断时候的增量复制的。

master run id

  • info server,可以看到master run id。
  • 如果根据host+ip定位master node是不靠谱,,如果master node重启或者数据出现了变化,那么slave node应该根据不同的run id区分,run id不同就做全量复制。
  • 如果需要不更改run id重启redis,可以使用redis-cli debug reload命令。

psync

  • 从节点使用psync从master node进行复制,psync runid offset。
  • master node会根据自身的情况返回响应信息,可能是FULLRESYNC runid,offset触发全量复制,可能是CONTINUE触发增量复制。

hearbeat和异步复制

  • Hearbeat:主从节点互相都会发送heartbeat信息,master默认每隔10秒发送一次heartbeat,salve node每隔1秒发送一个heartbeat。
  • 异步复制:master每次接收到写命令之后,现在内部写入数据,然后异步发送给slave node。(redis 2.8开始,slave node会周期性地确认自己每次复制的数据量)

master持久化

  • 采用了主从架构,那么建议必须开启master node的持久化!不建议用slave node作为master node的数据热备。
    因为如果你关掉master的持久化,可能在master宕机重启的时候数据是空的,然后可能一经过复制,salve node数据也丢了
    • master -> RDB和AOF都关闭了 -> 全部在内存中。
    • master宕机,重启,是没有本地数据可以恢复的,然后就会直接认为自己的数据是空的。
    • master就会将空的数据集同步到slave上去,所有slave的数据全部清空。100%的数据丢失。

      所以,master节点,必须要使用持久化机制。

  • master的各种备份方案也需要做,如果万一本地的所有文件丢失了,从备份中挑选一份rdb去恢复master; 这样才能确保master启动的时候,是有数据的。
    • 注意:slave node可以自动接管master node,但是也可能sentinal还没有检测到master failure,master node就自动重启了,还是可能导致上面的所有slave node数据清空故障。

redis replication 高可用

  • redis高可用架构,叫做故障转移 failover,也可以叫做主备切换。
    • 一旦master故障,在很短时间内,就会切换到另外一个master上去,可能redis就几分钟或者几秒钟不可用。
  • 当然这是,redis replication基于哨兵sentinal的高可用性
文章目录
  1. 1. 主从搭建(1主2从)
  2. 2. replication流程
    1. 2.1. 核心流程
    2. 2.2. 全量复制
    3. 2.3. 增量复制
    4. 2.4. 相关参数详解
      1. 2.4.1. offset
      2. 2.4.2. backlog
      3. 2.4.3. master run id
      4. 2.4.4. psync
      5. 2.4.5. hearbeat和异步复制
  3. 3. master持久化
  4. 4. redis replication 高可用
|