1.简介
互联网的架构中需要保证高并发,高性能,高可用。主从复制为了保证系统的高可用而诞生,指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点,后者称为从节点。数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave读为主禁止写。
2、主从复制架构
Master:数据提供方,主要负责写数据,可以读数据基本不读。
Slave:数据接收方法,主要负责读数据,禁止写。
数据同步:将master的数据热备份到slave中。
注意:Master和Slave是相对的,出现突发情况时,身份可以相互转换。
3、主从复制的作用
高可用:Redis服务器单点故障,其他服务器仍然可以提供服务,保证了Redis服务的高可用。
冗余备份:将数据进行热备份,实现数据的冗余备份
负载均衡:读写分离,由主节点提供写服务,由从节点提供读服务,分担服务器负载。
4、主从复制【全量复制】
将master中的数据全部复制到slave的过程叫做全量复制
# slave 发送全量复制指令
# master 执行bgsave
# master 生成RDB文件,发送给slave
# slave 接收RDB,清空数据,执行RDB文件恢复数据
# slave 发送命令告诉master,RDB复制完成
5、主从复制【部分复制】
将master复制缓存区的数据复制到slave的过程叫做部分复制,又称增量复制
master将RDB期间的命令记录在【repl_backlog】,并持续将log中的命令发送给slave
slave执行接收到的命令,增量同步,保持与master之间的同步
注意:repl_backlog_buffer。一种环形缓冲区,用于为增量同步做保障
6、主从复制,【主节点】怎么知道从哪来开发复制数据给【从节点】
# 主从服务器的复制偏移量【offset】,一个数字,描述主从复制已复制到的位置。
# master会存储每个【salve的偏移量】,从节点复制成功,发送ack命令给Master,然后Master的offset发送变化。
# savle只会存储自己的【偏移量】,从节点接收来自master的同步数据,并修正从节点的offset。
从节点什么时候更新offset呢? 就是在心跳的时候,主节点发送ping命令。
主从复制过程
建立连接
数据同步
命令传播(数据反复同步)
7、心跳机制
进入命令传播阶段,master与slave间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线
master心跳:
周期性执行ping指令,判断slave是否在线。获取slave通过REPLCONF ACK的最后一次连接时间间隔。
slave心跳:
每秒发送REPLCONF ACK {offset}指令,汇报自己的【复制偏移量】,获取最新的数据变更指令,判断master是否在线
主从复制的过程中,主节点定期发送心跳包(PING)给从节点,同时附带上当前的复制偏移量。
从节点收到心跳包后,会将主节点的复制偏移量更新到自己的里面去。
如果从节点的复制偏移量与主节点的复制偏移量相差较大(超过 repl-backlog-size 配置的大小),
从节点可能会请求进行部分重同步(partial resynchronization),从而避免全量同步。
8、全量复制问题
如果master数据量巨大,在数据同步时一定要避开流量高峰期,避免造成master阻塞
数据同步开启缓冲区大小设定不合理,会导致数据溢出找出增量复制过程存在数据丢失,需要进行二次全量复制,致使slave陷入死循环。
为了避免slave进行全量复制、增量复制时服务器响应阻塞或者数据不同步,此期间应关闭对外服务。
多个slave同时对master请求同步,master发送的RDB文件增多,会对带宽造成巨大冲击,可以适量错峰同步。
原文:跳转