【Redis】主从同步可能遇到的坑

博客聚焦Redis主从同步,指出可能遇到主从数据不一致、从库读取到过期数据的问题。分析主从数据不一致是因主从库间命令复制异步进行,且有两个主要原因,同时给出了两个问题的解决思路。

一、主从同步可能遇到的坑

1、主从数据不一致

2、从库读取到过期数据

二、问题1:主从数据不一致

原因:主从库间命令复制是异步进行的

主库收到写命令后,会发送给从库。
但是,主库并不会等到从库实际执行完命令后,再把结果返回给客户端,而是主库自己在本地执行完命令后,
就向客户端返回结果了。
如果从库还没有执行主库同步过来的命令或执行不及时,主从库间的数据就不一致了。

主要有两个原因

1、主从库间的网络可能会有传输延迟,所以从库不能及时地收到主库发送的命令,导致命令执行延后
2、从库及时收到了主库的命令,但是正在处理其它复杂度高的命令(例如集合操作命令),导致命令阻塞,执行延后

解决思路

1、尽量使用良好的硬件和网络环境,并实时做好监控
2、使用info replication 命令查看主库写命令进度(master_repl_offset)和从库复制写命令进度(slave_repl_offset),开发监控程序监控两者的差值,如果超过阀值则移除客户端对该从库的访问,避免数据不一致;如果两者差值恢复到阀值范围内,则重新调整客户端对从库的访问。

三、问题2:从库读取到过期数据

原因

1、从库不会同步执行主库删除命令,不会自动删除过期数据(主库读取到过期数据会自动删除)
2、时间差:比如主库设置60秒过期,是指主库执行的时间点往后60秒;该命令同步到从库后,是按从库执行时间点往后60秒,可能因为命令执行的时间差导致主库已过期,从库还没过期的情况

解决思路

1、Redis对过期数据的处理: Redis 3.2 之前会读取到过期数据,之后会返回空值(不会删除)。所以,尽量使用 Redis 3.2 以后版本
2、时间差:尽量用EXPIREAT 和 PEXPIREAT,它们会把过期时间设置为具体的一个时间点(用时间服务器同步各个服务器的时钟)
### Redis 主从复制异步同步机制解释 #### 一、主从复制概述 Redis 的主从复制功能能够显著提升系统的可用性、扩展性和数据冗余性。该特性允许当主节点发生故障时,从节点可接管并持续提供服务;同时支持通过增加从节点来分摊读取请求的压力,优化整体性能表现[^1]。 #### 二、异步同步特点 在Redis的主从架构里,默认采用的是**异步复制模式**。这意味着每当客户端向Master(即主库)发起写入指令后,Master会立即将变更应用至本地数据库,并随后将此更新转发给所有的Slave(即从库)。然而,在这个过程中,Master并不会等待确认消息返回就已结束当前事务处理过程[^2]。 这种设计使得即使网络连接不稳定或延迟较高情况下也能保持较高的吞吐率,因为不需要每次操作都阻塞直到所有副本均已完成同步。但是这也意味着如果此时突然遭遇断电或其他意外情况,则可能导致某些未被及时传播的数据丢失风险。 为了应对这种情况下的潜在问题,Redis引入了两种不同的策略来进行更高效的增量恢复: - **全量复制 (SYNC)**:适用于初次建立链接或是遇到严重错误无法继续正常工作的场合。它涉及创建一个新的快照文件(RDB),并通过TCP传输给对方加载。 - **部分重放 (PSYNC)**:作为改进版方案,仅需补发自上次成功通讯以来新增加的内容即可完成修复工作,大大减少了所需时间和带宽消耗[^4]。 ```bash # 配置示例 - 设置为 slave 节点 replicaof master_ip_address port_number ``` 上述配置语句展示了如何在一个 Slave 上指明其 Master 所处的位置以及监听端口号,以便于两者间建立起稳定可靠的通信链路。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值