Redis学习(Redis主从)

Redis学习(Redis主从)

单节点Redis的并发能力具有上限,要进一步提高并发能力,就要搭建主从集群,实现读写分离

一般在Redis的应用中读多写少,所以可以做读写分离,写操作访问主节点,读操作访问从节点,一主多从,然后主从之间需要做数据同步。

pCHV7DK.png

搭建主从集群

搭建主从集群有临时和永久两种模式

  • 临时:使用客户端连接到Redis服务后执行slaveof <masterip> <masterport>
  • 永久:在redis.conf中添加上述的配置

除此以外,还可以用replicaof命令

数据同步原理

主从搭建的第一次同步是全量同步,之后就是增量同步

全量同步

全量同步的流程图如下:

pCHeMQI.png

master判断slave是不是第一次来同步数据

  • Replication Id :简称replid,是数据集的标志,id一致则说明是同一数据集,每一个master都有唯一的replid,搭建主从后slave会继承master节点的replid
  • offset:是偏移量,随着记录在repl_baklog中的数据增多而逐渐增大,slave在同步的时候会记录当前同步的offset,如果slave的offset小于master的offset,说明slave的数据落后于master,需要进行更新

所以在进行数据同步的时候必须向matser声明自己的replid和offset,master才可以判断要同步哪些数据

master判断是否是第一次同步是看replid是否一致

全量同步的流程如下:

  • slave节点请求增量同步
  • master节点判断replid,发现不一致,拒绝增量同步
  • master将完整内存数据生成RDB,发送RDB到slave
  • slave清空本地数据,加载master的RDB
  • master将RDB期间的命令记录在repl_baklog,并持续将log的命令发送给slave
  • slave执行接收到的命令,保持与master之间的同步

增量同步

slave重启后同步,则执行增量同步

流程图如下:

pCHumYF.png

repl_baklog可以理解为一个环形的记录,每次更新slave与master之间的数据。不过slave和master的差距不能超过这个环的存储上限

如果slave和master的数据差距超过了repl_baklog的大小,也就是尚为备份的数据被覆盖了,那么就只能进行全量同步。这种情况多发生于slave断开时间过久

数据同步优化

可以从以下几个方面来优化Redis主从集群

  • 在master中配置repl-diskless-syn yes启用无磁盘复制,避免全量同步时的磁盘IO,这种用法多用于网速快且磁盘读写慢的情况
  • 控制Redis单节点上的内存占用,减少RDB导致的过多磁盘IO
  • 适当提高repl_baklog的大小,发现slave宕机时尽快恢复,尽可能避免全量同步
  • 限制master上的slave节点的数量,如果slave过多,可以采用主-从-从链式结构,减少master压力

链式结构的示意图如下:

pCHMbQJ.png

总结:

全量同步和增量同步的区别

  • 全量同步:master将完整的内存数据生成RDB,发送RDB到slave,后续命令记录在repl_baklog中,逐个发送给slave
  • 增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave

什么时候执行全量同步

  • slave节点第一次连接master节点时
  • slave节点断开时间太久,repl_baklog中的offset已经被覆盖时

什么时候执行增量同步

  • slave节点断开后又恢复,并且在repl_baklog中能找到offset
posted @ 2023-07-20 16:59  ANewPro  阅读(25)  评论(0编辑  收藏  举报