【Redis】总结(三)——主从复制

本文详细介绍了Redis的主从复制,包括复制的目的、集群结构、配置方法、复制原理及开发运维中可能遇到的问题。重点阐述了主从建立复制的过程、数据同步策略以及解决复制延迟、读到过期数据和从节点故障的方法。通过读写分离,提升系统可用性和容灾能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、主从复制是什么?

参与复制的Redis分为主节点(Master)和从节点(slave)。每个从节点只能有一个主节点,而主节点可以同时具有多个从节点。主从复制指主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制。如果我们执行读的操作,在主节点和从节点上获取皆可。如果执行写操作,只能写到主节点上,然后再由主节点复制到从节点上。  

二、集群结构有哪几种?

Redis的集群结构可以为:一主一从,一主多从,树状主从。

三、能做什么?

读写分离,容灾恢复

四、如何配置?

1、建立复制

配置方式有以下三种:

(1)在配置文件中加入slaveof {masterHost} {masterPort} 随Redis启动生效。

(2)在 redis-server 启动命令后加入 --slaveof {masterHost} {masterPort}。

(3)直接使用命令:slaverof {masterHost} {masterPort} 生效。

例如:

//6379为主机,6380设置为6379的从机
127.0.0.1:6380>slaveof 127.0.0.1 6379

2、查看复制状态:

使用 info replication 命令查看复制相关状态。

//主节点6379复制状态信息
127.0.0.1:6379>info replication
#Repliction
rolie:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=43,lag=0
....
//从节点6380复制状态信息
127.0.0.1:6380>info replication
#Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master-last_io_seconds_ago:4
master_sync_in_progress:0

3、断开复制

使用 slaveof no one 命令断开主从复制并使当前端口独立成为主节点。

4、从节点只读模式

默认情况下,从节点使用 slave-read-only=yes 配置只读模式。由于复制只能从主节点到从节点,对于从节点的任何修改主节点都无法感知,修改从节点会造成主从数据不一致。因此建议线上不要修改从节点的只读模式。

五、原理

1、复制过程:

(1)保存主节点信息。从节点保存主节点的地址信息,包括ip和port,便可直接返回。
(2)主从建立socket连接。从节点内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立网络连接。
(3)发送ping命令。连接建立成功后,从节点发送ping命令请求进行首次通信。
(4)权限认证。如果主节点设置了requirepass参数,则需要密码。
(5)同步数据集。当建立正常通信后,主节点会把持有的数据全部发送给从节点。有两种方式可选择:全量复制、部分复制。
(6)命令持续复制。当主节点有新的写入时,会将写命令发送给从节点,从而保证主从数据一致性。

2、数据同步

Redis在2.8及以上版本使用psync命令完成主从数据同步,同步过程为:全量复制和部分复制。

(1)全量复制
一般用于初次复制场景,Redis早期支持的复制功能只有全量复制,它会把主节点的全部数据一次性发送给从节点,当数据量较大时,会对主节点和网络造成很大的开销。
(2)部分复制
用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发丢失数据给从节点。因为补发的数据远远小于全量数据,可以有效的避免全量复制的过高开销。一般从2.8版本以上才支持此功能。

六、开发与运维中的问题

读写分离

对于读占比较高的场景,可以通过把一部分读流量分摊到从节点(slave)来减轻主节点(master)压力,同时需要注意永远只对主节点执行写操作。

遇到的问题:

(1)复制数据延迟

解决思路:

  • 1)监控程序定期检查主从节点偏移量。
  • 2)当延迟字节量过高时,监控程序处罚报警并通知客户端从节点延迟过高。
  • 3)客户端接到具体的从节点高延迟通知后,修改读命令路由到其他从节点或主节点上。当延迟恢复后再次通知客户端,恢复对从节点的读命令请求。

(2)读到过期数据

当主节点存储大量超时的数据时,如缓存数据,Redis内部需要维护过期数据的删除策略,删除策略主要有两种:惰性策略和定时删除。

  • 1)惰性删除:主节点每次处理读取命令时,都会检查键是否超时。如果超时则执行del命令删除键对象,之后del命令也会异步发送给从节点。
  • 2)定时删除:Redis主节点在内部定时任务会循环采样一定数量的键,当发现采样的键过期时执行del命令,之后再同步给从节点。

(3)从节点故障

需要在客户端维护可用从节点列表,当从节点故障时立刻切换到其他从节点或主节点上。具体过程如下:

  • 主节点发生故障后,客户端(client)连接主节点失败,两个从节点与主节点连接失败造成程序中断。
  • 如果主节点无法正常启动,需要选出一个从节点(slave-1),对其进执行 slaveof no one 命令使其成为新的主节点。
  • 原来的从节点(slave-1)成为新的主节点后,更新应用方的主节点信息,重新启动应用方。
  • 客户端命令另一个从节点(slave-2)去复制新的主节点(new-master)。                             
  • 待原来的主节点恢复后,让它去复制新的主节点。                                                                      

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值