redis主从复制以及数据同步的原理

 有学习的小伙伴可以一起讨论,微信 15321502296

第五章   复制

复制功能 :是高可用redis的基础,后面的哨兵和集群都是在复制的基础上进行的,满足数据恢复和负载均衡

1、建立配置  

主节点  和从节点   主上操作,从上学习

每个从节点只能有一个主节点,而主节点可以有多个从节点

复制的数据流是单向的,从复制主。方法有三种

(1)、在配置文件中加入(slaveof masterHost)(master Port)随redis启动生效

vim redis.conf

slaveof下添加

(2)redis-server启动命令后加入-slaveofmasterHost)(masterPort)生效

(3)在交互式界面直接使用命令 slaveofmasterHost)(masterPort)生效

 slaveof 192.168.4.60 6379

slaveof 节点值保留主节点的信息,然后返回

复制流程,以异步当时方式执行

查看主从信息

info replication

 断开主从复制

slaveof no one

1、断开与主节点的复制关系

2、晋升为主节点

切主

把当前从节点上对主节点的复制,切换到另一台主节点上的复制

slaveof 新主的ip 新主的端口

流程

1、断开与旧的复制关系

2、与新主的节点建立联系

3、删除从节点当前的所有数据 (为了生产安全不要操作 !!)

4、对新主节点进行复制操作

安全性 requirepass 密码验证 auth校检,配置 masterauth参数

vim redis.conf

在主上添加 requirepass 123.com  登录时用auth+密码验证

在从上 添加 masterauth 123.com   声明 主上的密码

只读  slave-read-only yes 改成no    从节点修改,可能会造成数据没有统一性

传输延迟

再主上设置 repl-disable-tcp-nodelay  控制是否关闭 tcp-nodelay

  关闭 ,主节点产生的命令数据不管大小都会及时发送给从节点,主从延迟会减小,增加了网络带宽消耗,在主从同机房,同机架、上部署。

开启 :主节点会合并比较小的tcp 数据包发送给从,节省带宽,一般40毫秒发送一次,一般在跨机房部署时使用。

拓扑图

星型 树状

复制过程·的原理

1、保存主节点信息  slaveof

2、从节点通过内部每秒运行的定时任务维护,复制相关的逻辑

从节点无法建立链接,定时任务会无限重复,直到成功

查看从节点失败的原因

命令操作 info replicatio

查看 master_link_down_since_seconds

3、连接成功时,第一次发送ping命令,首次通信

检测主机网络套接字,是否接受处理的命令

4、执行权限的验证,密码验证

5、同步数据集,psync同步,主节点全部发送给从节点

6、命令持续复制

 数据同步的方式

1、复制偏移量   (偏移量就是主节点宕掉之后,从节点代替主节点记录 所执行的操作时间,以及数量)  从节点每秒都会上报自身的偏移量,主记录到偏移量。主会根据自己的偏移量进行核对,同时保存自己的偏移量

2、复制积压缓冲区  :复制积压缓冲区是保存在主节点上的一个固定长度的列队,默认大小为1 mb。(缓冲区规则: 先进先出)

主会响应写命令,把命令发送给从节点,还会写入积压缓冲区

repl_blacklog_active:1    //开启积压缓冲区

repl_backlog_size:1048576   //缓冲区最大长度

repl_backlog_first_byte_offset:1984

repl_backlog_histlen:14


3、主节点运行的 id  :每个redis'启动后都会有一个4016进制的字符串作为id,运行id 是 用来表示唯一识别redis的 节点,用info replication   查看,关闭再启动后,运行id会改变

4psync 命令 : 从节点使用psync 完成部分操作和  全量操作

psync runid offset

      运行id    复制偏移量

psync工作流程

主发送命令 psync

-从返回情况 :full resynccountinueerr

全量复制   : 主节点吧全部数据一次性发送给从,量大,时间长

全量复制的流程

1、从节点 发送psync 复制请求 : 默认值为 ? 和 -1

2、主节点根据判断为全量复制回复 full  resync(全量复制)、continue(继续 ,出现在部分复制或者是增量复制)、err(错误)

3、从节点接受响应,保存 运行id 和偏移量

4、主节点执行bgsave 保存rdb文件到本地 ,

5、发送给从节点,从节点把接受的rdb文件保存到本地,并直接作为从节点的数据文件

6、从节点保存文件,并记录。主节点仍然响应

7、从节点删除自身的旧数据,加载rdb文件

8、加载完成后,会开启AOF持久化,进行学习

部分复制  重新建立连接,把之前断掉之后,没有发送的数据,剩下的部分继续发送

部分复制的工作流程

 

 

 

 

 

 

心跳

判断心跳的机制

 

 

通过 min-slaves-to-writemin-slaves-max-log  //参数定义

主节点根据 replication 判断从节点超时时间,如果超过默认的值,则判定从节点下线并段爱复制客户端连接。及时主节点判定从节点下线后,如果从节点重复恢复,心跳检测会继续进行。

异步复制

主节点复制的流程

1、主节点的端口6379 接收处理命令

2、命令处理完之后返回响应结果

3、对于修改命令异步发送给6380从节点,从节点在主线中执行命令

 

 

 

 

 

异步复制

主节点进行读写数据,并进行同步

 

开发或者运维中的问题

1、读写分离,  数据延迟 ,数据过期问题 ,从节点发生故障

 

数据延迟

1、  监控程序  :定期检查主从节点偏移量

2、当延迟字节量过高时,监控程序触发警报,并通知客户端从节点延迟过高

3、客户端接收到具体的从节点高延迟通知后,修改读命令到其他从节点或主节点。当延迟恢复后,在此通知客户端,恢复从节点的读命令请求

读到过期数据

惰性删除  主节点处理读取命令时,自动检测键的时间,如果超时自动删除

定时删除   在内部循环,定期查看键有没有过期,如果过期自动删除,之后同步给从节点

从节点的故障问题

在客户端维护,维护可用的节点列表,当从节点故障时,立刻切换到其他从节点或者主节点上,由监控程序去完成

主从配置不一样

内存相关的配置必须要一样,避免出现内存溢出

 

规避全量复制

建议在低峰时进行操作

  

复制积压缓冲区不足

把复制积压缓冲区,根据峰值进行设置

 

复制风暴

1、单主节点复制风暴      太多从节点

2、单机复制风暴    机柜

 

 

 

 

  

 

 哨兵

redis setinel

哨兵   实现高可用的一种方式

自动完成故障发现和故障转移

配置哨兵

1、直接新建配置文件运行redis

cd /usr/local/redis-4.0.2

编辑新的配置文件

cp redis.conf redis.sentinel-26380.conf

修改端口  

vim redis.sentinel-26380.conf

启动

 service-server redis.sentinel-26380.conf --sentinel

 配置主节点   

底部添加以下内容

sentinel monitor mymaster 192.168.4.30 6379 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

 

 sentinel monitor <master name>  <ip>  <port> monitor : 监控

<master name> : 主节点名字

<quorum>  :法定人数  最好设置为基数    哨兵节点数除以二加一       设置大  : 准确

setinel down-after-milliseconds <master name> <times>  

通过 ping 命令  默认单位 毫秒

down-after-milliseconds  : 定期发送 ping 命令

 <times>  超过时间没响应就down

 setinel parallel-sync  <master name> <nums>

sentinel parallel-syncs  

 一个从晋升为 主的时候  其他的从需要进行全量复制

会执行成为一个一个学习

setinel failover-time <master name> <time>

故障转移的超时时间    

故障转移的过程

1、选出合适从节点

2、从节点晋升为主节点        

3、其他的从节点向新主节点复制    

4、等待原来的主节点恢复后命令他去复制新的主节点

  故障转移失败     第一次超时时间是第二次超时时间的二倍

 

sentinel auth-pass <master name>  <password>

setinel notification-script  <master name> <script-path>

  哨兵在故障转移期间出现问题 会触发脚本 发送邮箱配置文件

setinel client-reconfig-script <master name> <script-path>

     部署redis  sentinel 的技巧

   1setinel 节点不应该部署在一台物理机器上

   2、 部署至少三个 奇数个数的sentinel

   3、只有 一套sentinel,还是每个主节点配置一套

哨兵的 API

sentinel master   展示所有被监控的主节点的状态 和相关信息

setinel master <master name>  

 

 展示指定<master name > 的从节点状态 以及相关的统计信息

  sentinel sentinels <master name>

展示指定 <master name>sentinel 节点集合

sentinel get-master-addr-by-name <master name>

返回指定<master name > 主节点的 ip地址端口

sentinel reset <pattern>

当前 sentinel 节点对符合 <pattern> 主节点的配置进行重置,包括 清除主节点相关状态

  sentinel failover <master name>

对指定的<master name> 主节点进行强制故障转移

sentinel ckuquorum <master name>  

检查当前可达的sentinel 节电数量是否 可达   

<quorum>的 个数

sentinel flushconfig

sentinel 节点的配置强制刷到磁盘上  

 

 

sentinel remove <master name>

取消当前 sentinel 节点指定 <master name> 主节点的 监控

sentinel monitor <master name>  <ip> <port> <quorum>

  sentinel  set <master name>

动态 修改 sentinel 的 配置

sentinel is-master-downby-addr

sentinel 节点之间用来交换 对主节点是否下线的判断  

 

 

实现原理

三个定时监控任务

主观下线

客观下线

sentinel 领导选举

故障转移

 有学习的小伙伴可以一起讨论,微信 15321502296

原文地址:https://www.cnblogs.com/bingpo-blade/p/9234189.html