免费网站建设是什么,网站二级域名建站属于子站吗,装修公司哪家好十大排名上海,微信小程序卖东西Redis#xff1a;主从同步一. 概述二. 原理(1) 全量同步(2) 增量同步(3) 优化Redis主从集群三. 总结一. 概述
引入#xff1a; Redis主从集群采用一个Master负责写#xff0c;多个Slave负责读的方式#xff08;读多写少#xff09;#xff0c;那么如何让读取数据时多个从…
Redis主从同步一. 概述二. 原理(1) 全量同步(2) 增量同步(3) 优化Redis主从集群三. 总结一. 概述
引入 Redis主从集群采用一个Master负责写多个Slave负责读的方式读多写少那么如何让读取数据时多个从节点的数据都一样 ----将Master数据同步到每个Slave即主从同步
定义 主从同步是指将一台Redis服务器的数据复制到其他的Redis服务器。 数据的复制是单向的只能由主节点到从节点。 默认情况下每台Redis服务器都是主节点且一个主节点可以有多个从节点(或没有从节点)但一个从节点只能有一个主节点。redis有主从同步从从同步。
二. 原理
(1) 全量同步
触发时间①第一次建立连接 ②增量同步失败
流程
当slave和master建立连接后slave发起psync同步请求带上replid和offset master会根据slave的replid来判断slave是不是第一次同步ID和自己不一样则是第一次则将master的replid发给slaveslave记录replid作为自己的id①master执行bgsave将内存数据写入RDB文件并将RDB发送给slaveslave会清空本地数据加载RDB文件到【内存】中 ②当master异步写RDB文件期间会记录主进程的操作到repl_baklog缓冲区中 此时RDB文件缓冲区的命令即master上的完整数据master将缓冲区的新命令发送给slaveslave拿到命令后会执行命令保证slave和master的数据一致 后序新的命令都写到缓冲区再发送到slave以次实现主从同步
Replication ID 简称replid是数据集的标记id一致则说明是同一数据集。每个master都有唯一一个replidslave则会继承master节点的replid
offset偏移量 随着master记录在【repl_baklog缓冲区】中的数据增多而逐渐增大。 slave完成同步时也会记录当前的offset 如果slave的offset小于master的offset说明slave落后于master需要更新slave的offsetmaster的offset
所以slave做同步时必须向master声明自己的Replication ID和offsetmaster就可以通过ID来判断slave是不是从当前master同步的以及从offset判断数据同步的进度
如何判断slave是不是第一次做数据同步 Replication ID不一样则是slave第一次请求同步 而后slave的Replication ID就变成了当前master的Replication IDmaster根据slave的 offset ?大小来做增量同步
(2) 增量同步
触发时间在slave重启过程中master会持续接收数据则slave数据会落后此时就是做增量同步
流程
slave重启重启完后发送给psync请求同步并带上replid和offset 由于不是第一次发起请求此时slave的replid和master一致master不用再给slave发送id而是回复continuemaster不再RDB因为slave已经拷贝过了slave宕机期间丢失的部分记录在repl_baklog缓冲区而slave的offest就是之前读取到的位置所以将缓存中slave的offset往后的命令发往slaveslave执行master传过来的命令就可以补上错过的命令此时数据保持了一致
repl_baklog缓冲区 本质是一个成环的数组当数组满了slave落后master的数据超过了缓冲区容量则会用master新命令覆盖旧的命令 只要slave和master的数据差距在一个环内就可以将slave落后于master的部分找到并发给slave 当slave和master差距超过了一个环则无法做增量同步了
什么时候增量同步失败 缓冲区是一个数组大小有限当slave断开时间太长和master的差距超过了缓冲区导致尚未备份的数据被新命令覆盖则此时无法基于缓冲区做增量同步只能做全量同步了
(3) 优化Redis主从集群
提高全量同步的性能
在master中配置无磁盘复制避免全量同步时的磁盘IO不使用RDB文件即内存数据的IO流直接写到网络中而不是先写到RDB磁盘文件减少了一次拷贝到磁盘的过程提高性能网络比较快时控制Redis单节点内存上限这样就能控制RDB文件的大小从而减少磁盘IO
减少全量同步
提高repl_baklog缓冲区的大小这样slave落后于master的数据就多一点一定程度避免由于由于增量同步失效导致的全量同步
其他
主从链式结构限制一个master上的slave节点数量减轻master的压力
三. 总结
1.全量同步与增量同步的区别 全量同步master需要将内存数据写入 RDB 文件再将RDB文件传给slave后序命令记录在缓冲区 增量同步时master不需要写RDB文件只需要将缓冲区中slave的offset之后的命令传给slave
2.什么时候执行全量同步 ①slave第一次连接master时 ②slave宕机时间太长导致salve的offset在缓冲区被新的命令覆盖
3.什么时候执行增量同步 slave重启时