一、主从复制是什么?
参与复制的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)。
- 待原来的主节点恢复后,让它去复制新的主节点。