面试题答案
一键面试导致数据丢失的场景
- 异步复制导致的数据丢失
- 场景:Redis主从复制是异步的,当主节点接收到写请求并写入数据后,会向从节点异步复制数据。如果在主节点将数据同步给从节点之前,主节点发生故障,且此时新的主节点选举完成,那么这部分还未同步到从节点的数据就会丢失。
- 示例:客户端向主节点写入数据
SET key value
,主节点接收到数据并返回成功给客户端,但还未来得及将此数据同步给从节点,主节点就宕机了。之后从节点被选举为新主节点,这个SET key value
的数据就丢失了。
- 脑裂导致的数据丢失
- 场景:在网络分区的情况下,集群可能会分成多个部分,每个部分都认为自己是主节点,继续对外提供服务。如果客户端在旧主节点(网络分区后孤立的主节点)写入数据,而这个旧主节点最终被判定为故障,新的主节点没有这些数据,就会造成数据丢失。
- 示例:假设集群中有一个主节点M和两个从节点S1、S2。发生网络分区后,M与S1、S2失去联系,M继续接收客户端写请求并写入数据。同时,S1和S2通过选举产生了新的主节点S1。当网络恢复后,旧主节点M被判定为故障,它写入的数据没有同步到新主节点S1,从而导致数据丢失。
避免数据丢失保障数据一致性的方法
- 配置选项
- 开启
min - slaves - to - write
和min - slaves - max - lag
- 配置说明:
min - slaves - to - write
表示主节点要进行写操作至少需要有多少个从节点连接;min - slaves - max - lag
表示从节点与主节点数据复制延迟的最大时长(单位为秒)。当连接的从节点数量小于min - slaves - to - write
,或者从节点的复制延迟大于min - slaves - max - lag
时,主节点将拒绝写请求。 - 示例配置:在
redis.conf
文件中添加min - slaves - to - write 2
和min - slaves - max - lag 10
,表示主节点至少需要2个从节点连接,且从节点的复制延迟不能超过10秒,否则主节点拒绝写请求,这样可以在一定程度上避免异步复制导致的数据丢失。
- 配置说明:
- 开启
- 使用
WAIT
命令- 原理:客户端在写入数据后,使用
WAIT
命令,它会阻塞当前客户端连接,直到数据被复制到指定数量的从节点。 - 示例:客户端执行
SET key value
写入数据后,接着执行WAIT numSlaves timeout
,其中numSlaves
是期望数据同步到的从节点数量,timeout
是等待的最长时间。例如WAIT 2 1000
,表示等待数据同步到至少2个从节点,最多等待1000毫秒(1秒)。只有当数据同步到足够数量的从节点后,WAIT
命令才会返回,客户端才能继续执行后续操作,从而保障数据不会因异步复制丢失。
- 原理:客户端在写入数据后,使用
- 使用
AOF
持久化并合理配置- 配置说明:开启
AOF
(Append - Only - File)持久化,并且设置appendfsync
选项为always
。appendfsync always
表示每次写操作都会同步到AOF
文件,这样即使主节点发生故障,重启后也能通过重放AOF
文件恢复数据。但这种方式会对性能有一定影响,因为每次写操作都要进行磁盘I/O。 - 示例配置:在
redis.conf
文件中设置appendonly yes
开启AOF
持久化,设置appendfsync always
确保每次写操作都同步到AOF
文件。
- 配置说明:开启
- 优化集群网络
- 方法:尽量减少网络分区的发生,例如采用更可靠的网络设备,优化网络拓扑结构,增加网络冗余等。良好的网络环境可以降低脑裂发生的概率,从而避免因脑裂导致的数据丢失。