Redis主从模式设计
Redis的安装见:https://blog.csdn.net/user2025/article/details/105934987
Redis集群的原因:避免单点故障,冗余存储数据,保证Redis的高可用
Redis有三种集群模式:主从模式、Sentinel模式、Cluster模式
一个master节点可以有多个slave节点,一个slave节点只能有一个master节点
主从复制的作用
(1)读写分离: master负责写操作,slave负责写操作
(2)负载均衡:slave负责读操作,通过增加slave的数量可以减小单个slave节点读操作的负载,大大提高并发量和数据吞吐量
(3)故障恢复:当mater节点宕机后,slave节点切换master,继续提供服务
(4)数据冗余:实现数据热备份,master节点和salve节点都存在相同的数据
配置主从复制
(1)修改配置文件/etc/redis/redis.conf,在Replication区进行配置,配置好后重启服务器
slaveof master节点的IP地址 端口号 # 指定当前redis的master节点的ip和端口号
masterauth master节点的密码 # 指定master节点的密码
(2)master、slave客户端分别输入info replication命令后,显示的信息如下:
(3)如果想使slave节点作为从服务器,不能进行写操作,修改配置文件
slave-read-only yes #yes表示salve仅用于读
(4)如果想使slave节点与主服务器断开,可以在slave节点的客户端输入命令:slaveof no one
如果想使slave节点与master节点重连,可以在slave节点的客户端输入命令:slaveof master节点ip 端口号【也可以重启slave服务器】
主从复制的原理
Redis主从复制分为三个阶段:全量复制、增量复制、命令传播阶段
全量复制主要分为如下4个步骤:
(1) slave连接master,发送psync2命令请求同步数据
(2) master执行bgsave命令【background save后台保存的缩写】,生成RDB快照文件,在这期间master执行的所有写命令都会被写入复制缓冲区
(3)master执行完bgsave命令后,向所有slave发送快照文件
(4)slave收到RDB文件后,清空slave之前的所有数据,根据RDB文件恢复数据
增量复制:
全量复制完成后,master节点将复制缓冲区的所有指令都会发送给slave,slave会执行这些指令
命令传播阶段
master每执行一条写命令,都会同步到slave中执行
总结:全量复制实际是将建立同步关系之前的数据一次性完全复制到slave,增量复制实际是将建立同步关系之后master执行的每条写命令同步到slave
运行id(run id)
运行id是单个redis每次启动时生成身份识别码(40位的字符),一个redis多次启动会生成多个运行id,每次重启就会发生变化
slave和master首次建立连接后,slave会保存master的run id。当复制时发现master和之前的 run_id 不同时,将会重新进行全量同步。
通过客户端执行命令:info server,可以查看当前节点的run id
复制缓冲区(全量复制时)
- 复制缓存区的组成:偏移量offset、字节值
- 工作原理:通过对比master和slave节点的复制偏移量,可以判断主从节点数据是否一致
(1)参与复制的主从节点都会维护自身复制偏移量。主节点(master)在处理完写入命令后,会把命令的字节长度做累加记录,统计信息在info relication中的master_repl_offset指标中:
(3)从节点(slave)每秒钟上报自身的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量,统计指标如下:
(4)从节点在接收到主节点发送的命令后,也会累加记录自身的偏移量。统计信息在info relication中的slave_repl_offset指标中:
redis主从复制同步数据死循环问题
- 复制缓冲区是一个先进先出(FIFO)的队列。复制缓冲区默认数据存储空间大小是1M,由于存储空间大小是固定的,当入队元素的数量大于队列长度时,最先入队的元素会被弹出,而新元素会被放入队列
- 复制缓冲区的创建时机:
(1)redis启动时,如果开启了AOF日志功能
(2)redis作为master节点 - 当slave节点与master节点进行全量复制过程中,master节点执行的所有引起数据变化的指令(如set、select换库)都会被存储在复制缓冲区,当全量复制完成后,复制缓冲区的所有数据都会发生到slave节点执行
复制缓冲区大小设置不合理,会导致数据溢出,继而引发redis主从复制同步数据死循环问题
举例: 当master数据量比较大,同步时间过长,复制缓冲区就可能数据溢出,增量复制时发现复制缓冲区存在部分数据丢失的情况,就会进行第2次全量复制。
解决办法: 修改配置文件中client-output-buffer-limit参数
主从模式注意事项
(1)master节点数据量比较大时,流量高峰期不要进行全量复制
(2)master节点占用宿主机的内存不应过大,建议使用50-70%的内存,留下30-50%的内存用于执行bgsave指令和创建复制缓冲区
(3)当master和slave之间长时间通信中断时,复制缓存区数据肯定存在丢失,必须进行全量复制
(4)master和slave尽量在同一个局域网,减少同步延迟问题
(5)对比offset,如果slave延迟过大,暂时屏蔽程序对slave数据的访问,可以通过修改配置文件的如下参数实现,将yes改为no,开启后仅响应info和slaveof指令
slave-serve-stale-data no
本文地址:https://blog.csdn.net/user2025/article/details/107466532