redis主库和从库

主从库

读写分离

redis采用主从库模式的方式来保证数据一致性,主从库采用的是读写分离方式

读操作:主库和从库都可以进行读操作

写操作:首先在主库操作,再将数据同步给从库

为何读写分离

如果客户端对同一个数据修改了三次,每次修改请求都被分发给了不同的库,那么这三个库中的数据就不一致了,读取这个数据的时候就有可能读取到旧的值。

如何实现

首先,从库发送指令给主库,请求同步,主库接收到请求后,生成一个RDB文件,并且把所有数据都存进去,如何发给从库,从库接收到数据后,会把自己当下的数据清空,如何再装入主库来的数据。在主库把数据传给从库的过程中,主库不会阻塞,仍然在接受请求,但这些请求中的写操作并没有同步到刚刚的RDB文件中,所以redis在内存中专门的replication buffer中记录的修改发送给从库,从库再执行这些修改,达到同步。

主从级联

在进行数据同步时,主库进行了两个非常耗时的操作,生成RDB文件和传输RDB文件

为了分担主库的压力,可以采用主-从-从的方式来,将主库生成RDB和传输RDB的工作级联给从库来执行。

简单来说,我们在部署主从集群的时候,可以手动选择一个从库(比如选择内存资源配置较高的从库),用于级联其他的从库。然后,我们可以再选择一些从库(例如三分之一的从库),在这些从库上执行如下命令,让它们和刚才所选的从库,建立起主从关系。

img

主从库之间网络断连了怎么办

在主从库完成全量复制之后,主从库之间就会维护一个网络连接,通过这个连接把后续的操作发给从库,避免了频繁建立连接的开销,但是却有了网络断联和阻塞的问题

采用增量复制的方式来实现同步,其中使用了repl-backlog-buffer缓冲区。

这个缓冲区是环形缓冲区,主库写入,从库读取,这样的操作流程,在发生网络断联的时候,主库继续在写入,则主库写入进度比从库读取进度要快,网络连接恢复的时候,从库发出请求,并且把自己读取到了哪里的位置发给主库,主库判断从库读取到的位置,然后和自己写入的位置进行比较,把这两者之间的数据发送给从库。

由于是环形缓冲区,如果从库的读取速度比较慢,就有可能导致从库还未读取的操作被主库新写的操作覆盖了,这会导致主从库间的数据不一致。

  1. 一个从库如果和主库断连时间过长,造成它在主库repl_backlog_buffer的slave_repl_offset位置上的数据已经被覆盖掉了,此时从库和主库间将进行全量复制。

  2. 每个从库会记录自己的slave_repl_offset,每个从库的复制进度也不一定相同。在和主库重连进行恢复时,从库会通过psync命令把自己记录的slave_repl_offset发给主库,主库会根据从库各自的复制进度,来决定这个从库可以进行增量复制,还是全量复制。

解决这个问题我们可以调高缓冲区的大小或者切片集群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值