redis 主从复制

redis 主从复制

mark

如图,redis的主从架构中,应该常配合haproxy 使用。缺点是当master 宕机时, harproxy 虽然可以自动切换,指向slave,把slave当作新主,但缺点是salve 的角色需要手动切换。

一、主从复制过程:

​ Redis 支持主从复制分为全量同步和增量同步,首次同步是全量同步,主从同步可以让从服务器从 主服务器备份数据,而且从服务器还可与有从服务器,即另外一台 redis 服务器可以从一台从服务器 进行数据同步,redis 的主从同步是非阻塞的,其收到从服务器的 sync(2.8 版本之前是 PSYNC)命令会 fork 一个子进程在后台执行 bgsave 命令,并将新写入的数据写入到一个缓冲区里面,bgsave 执行完成 之后并生成的将 RDB 文件发送给客户端,客户端将收到后的 RDB 文件载入自己的内存,然后主 redis 将缓冲区的内容在全部发送给从 redis,之后的同步从服务器会发送一个 offset 的位置(等同于 MySQL 的 binlog 的位置)给主服务器,主服务器检查后位置没有错误将此位置之后的数据包括写在缓冲区的 积压数据发送给 redis 从服务器,从服务器将主服务器发送的挤压数据写入内存,这样一次完整的数 据同步,再之后再同步的时候从服务器只要发送当前的 offset 位 置给主服务器,然后主服务器根据响 应的位置将之后的数据发送给从服务器保存到其内存即可。
Redis 全量复制一般发生在 Slave 初始化阶段,这时 Slave 需要将 Master 上的所有数据都复制一份。具 体步骤如下:

  1. 从服务器连接主服务器,发送 SYNC 命令;
  2. 主服务器接收到 SYNC 命名后,开始执行 BGSAVE 命令生成 RDB 快照文件并使用缓冲区记录此后执 行的所有写命令;
  3. 主服务器 BGSAVE 执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命 令;
  4. 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  5. 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  6. 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
  7. 后期同步会先发送自己 slave_repl_offset 位置,只同步新增加的数据,不再全量同步。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8xBCQhtV-1581846094430)(A:%5Cimage_typoral_used%5Cimage-20200216152419467.png)]

二、主从同步优化参数

Redis 在 2.8 版本之前没有提供增量部分复制的功能,当网络闪断或者 slave Redis 重启之后会导致主 从之间的全量同步,即从 2.8 版本开始增加了部分复制的功能。

  • repl-diskless-sync yes#yes 为支持 disk,master 将 RDB 文件先保存到磁盘在发送给 slave,no 为maste 直接将 RDB 文件发送给 slave,默认即为使用 no,Master RDB 文件不需要与磁盘交互。
  • repl-diskless-sync-delay 5 #Master 准备好 RDB 文件后等等待传输时间
  • repl-ping-slave-period 10 #slave 端向 server 端发送 ping 的时间区间设置,默认为 10 秒
  • repl-timeout 60 #设置超时时间
  • repl-disable-tcp-nodelay no #是否启用 TCP_NODELAY,如设置成 yes,则 redis 会合并小的 TCP 包从而节 省带宽,但会增加同步延迟(40ms),造成 master 与 slave 数据不一致,假如设置成 no,则 redis master 会立即发送同步数据,没有延迟,前者关注性能,后者关注一致性
  • repl-backlog-size 1mb #master 的写入数据缓冲区,用于记录自上一次同步后到下一次同步过程中 间的写入命令,计算公式:b repl-backlog-size = 允许从节点最大中断时长 * 主实例 offset 每秒写入 量,比如 master 每秒最大写入 64mb,最大允许 60 秒,那么就要设置为 64mb*60 秒=3840mb(3.8G)= repl-backlog-ttl 3600 #如果一段时间后没有 slave 连接到 master,则 backlog size 的内存将会被释放。如 果值为 0 则表示永远不释放这部份内存。
  • slave-priority 100 #slave 端的优先级设置,值是一个整数,数字越小表示优先级越高。当 master 故障时 将会按照优先级来选择 slave 端进行恢复,如果值设置为 0,则表示该 slave 永远不会被选择。
  • min-slaves-to-write 0 # master 至少有0个slave,否则拒绝写命令
  • min-slaves-max-lag 10 #设置当一个 master 端的可用 slave 少于 N 个,延迟时间大于 M 秒时,不接收 写操作。 Master 的重启会导致 master_replid 发生变化,slave 之前的 master_replid 就和 master 不一致从而会引 发所有 slave 的全量同步。

三、主从搭建

​ master 与slave 都要设置自己的bind 地址和密码。除此之外,master不需要做额外的特殊配置。而salve 需要设置以下2项即可

slaveof  192.168.1.101   6379
masterauth 123456
slave-read-only yes(默认打开了)

验证:

  • master 的info

    connected_slaves:1
    slave0:ip=192.168.1.102,port=6379,state=online,offset=1050,lag=0
    master_replid:d18ead2178679cf222a3f69d9ebc2ee152986306
    
  • slave 的info

    # Replication
    role:slave
    master_host:192.168.1.101
    master_port:6379
    master_link_status:up
    
  • 写 key 验证

注意:

  • 主从复制前。slave 一定要是没有数据的,,否则会清空旧数据

    1746:S 16 Feb 16:51:36.252 * MASTER <-> SLAVE sync: Flushing old data

  • Redis 版本需要保持一致

四、 主从状态切换

当matser 宕机时,slave 状态切换

如:当slave1 发现master 宕机时,需要把Slave1 设置为 master ,slave2 重新指向slave1

  1. slave1 上

    127.0.0.1:6379> slaveof  no one
    OK
    

    然后把配置文件 关于slave 的那两行给删除了,否则下次重启仍然是slave

  2. slave2 上

    127.0.0.1:6379> slaveof 192.168.1.102 6379
    OK
    127.0.0.1:6379> config set masterauth 123456
    

    然后把配置文件 关于slave 的那两行给修改了。否则下次重启失效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值