欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Redis主从模式设计

程序员文章站 2022-04-15 20:13:10
Redis有三种集群模式:主从模式、Sentinel模式、Cluster模式主从模式Sentinel模式Cluster模式...


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命令后,显示的信息如下:
Redis主从模式设计

(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
Redis主从模式设计

复制缓冲区(全量复制时)

Redis主从模式设计

  • 复制缓存区的组成:偏移量offset、字节值
  • 工作原理:通过对比master和slave节点的复制偏移量,可以判断主从节点数据是否一致
    (1)参与复制的主从节点都会维护自身复制偏移量。主节点(master)在处理完写入命令后,会把命令的字节长度做累加记录,统计信息在info relication中的master_repl_offset指标中:
    Redis主从模式设计
    (3)从节点(slave)每秒钟上报自身的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量,统计指标如下:
    Redis主从模式设计

(4)从节点在接收到主节点发送的命令后,也会累加记录自身的偏移量。统计信息在info relication中的slave_repl_offset指标中:
Redis主从模式设计

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

相关标签: Redis