redis-主从复制

何为主从复制:
主从复制为了解决单点redis服务器出现的机器故障或是内存不足等情况,造成的服务器数据丢失情况而生的解决方案。准备多台服务器互相连通,将数据保存多个副本到不同的服务器,保证服务器数据同步。这样一个服务器宕机其他的服务器依然可以提供服务,实现redis的高可用,同时实现冗余备份。

多服务器连接方案:
提供数据方:master,主服务器,负责数据写入
接收数据防:slave,从服务器,负责数据读取
该架构的目的就是解决数据同步的问题。将master的数据复制到slave中。主从复制就是将master中的数据及时、有效的复制到slave中。
特征:
一个master可拥有多个slave,一个slave只对应一个master
职责:
master:写数据;执行写操作时,将出现变化的数据自动同步到slave;读数据(可忽略)
slave:读数据;写数据(禁止)

主从复制的作用:
读写分离:master写,slave读,提高读写负载能力
负载均衡:基于主从架构配合和读写分离,提高reedis放服务器并发量和数据吞吐量
故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
高可用基石:基于主从复制,构建哨兵模式与集群,实现redis的高可用方案

主从复制的工作流程:
主从复制过程大体可分为3个阶段:
一、建立连接阶段:slave向master建立连接
1)内部实现为socket连接
2)连接分为三步,slave发起连接,master响应连接;slave发起auth password验证,master验证授权;slave发送给master监听端口号,master保存端口号并监听
3)主从连接方式:
slaveof (客户端发送命令连接)
redis-server -slaveof (启动服务器增加参数连接)
slaveof (服务器配置连接)
4)主从断开连接:
slaveof no one (客户端发送该命令可断开主从连接)
5)master服务器可以通过info指令查看当前slave连接数,Replication-connected_slaves字段为连接数
6)授权访问
requirepass (配置文件设置密码)
config set requirepass (客户端发送命令设置密码)
config get requirepass
auth (slave客户端发送命令设置密码)
masterauth (slave配置文件设置密码)
redis-cli -a (启动客户端设置密码)

二、数据同步阶段:master将数据发送给slave
注意事项-master:
1、如果master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行
2、复制缓冲区大小设置不合理,会导致数据溢出,如进行全量复制周期太长,进行部分复制时发现数据已经存在丢失的情况,必须进行第二次全量复制,致使slave现入死循环状态。
使用 repl-backlog-szie 1mb (更改缓冲区大小)
3、master单机内存占用内存的比例不应过大,建议使用50%-70%的内存,留下30%-50%内存用于执行bgsave命令和创建复制缓冲区
注意事项-slave:
1、为避免slave进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭此期间的对外服务
slave-server-stale-data yes|no (关闭\打开写权限)
2、数据同步阶段,master发送给slave信息可以理解master时slave的一个客户端,主动向slave发送命令
3、多个slave同时对master请求数据同步,master发送的RDB文件增多,会对带宽造成巨大重启,如果master带宽不足,因此数据同步需要根据业务需求,适量错峰
4、slave过多时,建议调整拓扑结构,由一主多从结构变为树状结构,中间的节点既是master,也是slave。注意使用树状结构时,由层级深度,导致深度越高的slave与最顶层master间数据同步延迟较大,数据一致性变差,应谨慎选择

同步过程:
1)slave发送psync2指令给master请求同步数据
2)master执行bgsave生成RDB文件,通过socket发给slave
3)slave接收RDB,清空数据,执行RDB文件恢复过程
4)发送命令告知masterRDB已经完成复制,至此全量复制完成
5)master发送复制缓冲区信息(为bgsave期间接收到的指令)
6)slave接收信息,执行bgrewriteaof,恢复数据。至此部分复制完成

三、命令传播阶段
说明:实时保持数据同步。当出现网络闪断闪连时可直接忽略;当出现短时间网络中断时刻进行部分复制,当出现长时间网络中断时进行全量复制。

部分复制的三个核心要素:
1、服务器的运行id (run id)
说明:每一台服务器运行的时候都会生成一个id,运行多次生成多个运行id
组成:id由40位字符组成,是一个随机的十六进制字符
作用:运行id被用在服务器间传输识别身份,如果想两次操作均对同一台服务器进行,必须每次操作携带对应的运行id,用于对方识别
实现方式:运行id在每台服务器启动时自动生成,master在首次连接slave时,会将自己的运行id发给slave,slave保存此id,通过info server命令,可以查看节点的id
2、主服务器的复制积压缓冲区
说明:是一个先进先出(FIFO)的队列,用于存储服务器执行过的命令,每次传播命令,master都会将传播的命令记录下来,并储存在复制缓冲区。缓冲区由偏移量和字节值组成,master和slave就是通过offset来区分每个slave数据传播的差异。
3、主从服务器的复制偏移量
说明:
偏移量是个数字,描述复制缓冲区中的指令字节位置
分类:
1)master复制偏移量:记录发送给所有slave的指令字节对应的位置(多个)
2)slave复制偏移量:记录slave接收master发送过来的指令字节对应的位置(一个)
数据来源:
1)master端:发送一次记录一次
2)slave端:接收一次记录一次
作用:
同步信息,比对master与slave的差异,当slave短线后,恢复数据使用

命令传播阶段过程:
1、slave发送 psync2 ? -1 (请求数据)
2、master回复+FULLRESYNC runid offset,通过socket发给slave
3、slave接收RDB,保存runid和offset。下次发送请求时发送psync2 runid offset
4、slave发送pync2 runid offset请求
5、master判断runid是否匹配,offset是否在复制缓冲区中。若果有一个不满足,则返回2进行全量复制。校验通过后校验offset是否与master保存的相同,如果不同会发送+CONTINUE offset,通过socket发送复制缓冲区中的2个offset间的数据
6、slave收到+CONTINUE,保存master的offset,接收后执行bgrewriteaof,恢复数据

心跳机制:
1)master心跳:指令PING,由repl-ping-slave-period决定,默认1秒,作用为判断slave是否在线,通过info replication可获取slave最后一次连接时间间隔,lag项维持在0或1视为正常
2)slave心跳:指令REPLCONF ACK(offset),周期1秒,作用1汇报自己的offset偏移量获取最新的数据变更指令,作用2判断master是否在线

心跳阶段注意事项:
当slave多数掉线,或延迟过高时,master为保障数据稳定性,将拒绝所有信息同步操作
min-slaves-to-write 2
min-slave-max-lag 8
slave数量少于2个,或者所有slave的延迟延迟都大于8秒时,强制关闭master写功能,停止数据同步
slave数量由slave发送REPLCONF ACK命令做确认
slave延迟由slave发送REPLVAONF ACK命令做确认

repl-timeout (设置超时时间,超过该时间时是否slave)
repl-ping-slave-priod (超时时间repl-time的时间至少是ping指令频道的5到10倍,否则slave很容易判定超市)
多个slave信息不同步,使用slave-serve-stale-data yes|no (开启后仅响应info、slaveof等少数命令,该指令慎用,除非对数据一致性要求非常高)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值