Redis之主从复制

只使用单机版的redis,只要服务器宕机了,数据恢复期间无法执行新的请求。并且如果服务器磁盘出现故障,那么数据就会丢失。也就是单点故障

解决就是多来几个redis,搭一个集群。那么怎么保证多redis之间的数据一致性?数据的读写操作是否每台服务器都可以处理?

redis解决的方法就是主从复制机制。主服务器可以执行读写操作,从服务器只能执行读操作,且会接收主服务器的写操作命令,并且执行。

这样只在主服务器上面进行写操作。然后同步该操作到其余读服务器,这样就能保证多服务器数据的一致性。

重点是同步操作

主服务器怎么同步最新数据到从服务器?

从命令开始

# 服务器 B 的redis客户端中执行这条命令
replicaof <服务器 A 的 IP 地址> <服务器 A 的 Redis 端口号>

# 可能会失败,需要将redis.conf 中bind 设置为 bind * -::*   
# 确保服务端端口都开放,可以在客户端输入info replication 查看状态

执行这个命令就会让服务器B成为服务器A的从机

同步过程有三个阶段:

  1. 建立链接、协商同步;
  2. 主服务器同步数据给从服务器;
  3. 主服务器发送新写操作命令给从服务器。

具体过程:

  1. 第一个阶段就是执行完命令之后会马上发送一个psync命令,表示要进行数据同步。psync包含2个参数,runID(主服务器的runID)和offset(复制进度)。主服务器收到后会返回一个FULLRESYNC(全量复制)命令。复制当前所有数据。
  2. 第二阶段,主服务器执行bgsave生成rdb,发送给从服务器。从服务器接收到清空当前数据,载入rdb文件。
  3. 新写命令是因为bgsave期间主服务器还可以正常执行请求。主服务器会将这些写操作命令记录到一个replication buffer缓存区中。在第三阶段将这里面的命令发送给从服务器

同步之后双方共同维护一个TCP长连接作为 命令传播

网络断开,又恢复,怎么维护主从数据一致性

使用增量复制,将断开期间主服务器执行的写操作同步到从服务器。
过程:

  1. 从服务器恢复网络之后,发送psync给主服务器,此时offset和runid都有数据
  2. 主服务器收到后,响应continue,表示增量复制
  3. 主服务器将断线期间的写操作发送给从服务器。

怎么标识断线期间的写操作:

  1. 有一个环形缓存区,正常命令都会再这里备份记录。
  2. offset 每一次都会携带,主服务器offset标识写的位置,而从服务器offset标识读的位置。
  3. 主服务器提供这两个offset关系,判断数据还在不在缓存区中。环形缓存区会被覆盖的,如果长时间每连接到。在就使用增量复制,否则只能使用全量负责

小结:

主从复制,就是保证集群中多个节点数据的一致性。具体的是

  1. 规定只有主节点才可以读写操作。从节点只读。
  2. 主节点执行写操作之后将命令同步给从节点。第一次同步会生成一个rdb文件。之后就是基于TCP长连接的命令传播。如果出现断网异常,可以使用增量复制。
  3. 从服务器也可以有自己的从服务器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值