【redis主从复制解析】

前言

redis的高可用涉及到持久化、主从复制(读写分离)、哨兵和集群。持久化主要是内存数据到磁盘,是一个单机备份问题,主从复制是多机数据备份问题。主从复制不仅仅解决数据备份还可以实现读负载均衡和故障恢复。

此篇文章主要分析,如何使用主从复制、复制的原理(全量复制,部分复制,及心跳机制),在使用过程中注意的问题(数据不一致问题,复制链接超时问题,复制缓冲区),主从复制的相关配置。

一、如何使用主从复制(具体的配置可查找相关资料,本文不做过多的设计)

主从复制的配置不需要对主节点进行设置,只要在从节点设置

通过对redis.conf文件中配置

port 6380     //端口

pidfile /var/run/redis_6380.pid   

slaveof 127.0.0.1 6379    //该从节点属于哪个主节点

logfile "/data/logs/redis.slave1.log"

daemonize yes

配置完成后,在该redis目录中输入命令。redis-server  redis.conf

二、主从复制的原理

第一建立连接

第二 数据同步阶段

从节点发送同步命令(psync)到主节点,此时需注意,此时两者的身份状态发生改变,主节点也需要向从节点发送命令到命令缓冲区,在数据同步阶段,会根据子节点的状态(offset,runid)来选择全量复制或者部分设置。。

1.全量复制和部分复制

全量复制

1. 从节点发送psync命令给主节点,主节点收到命令后执行bgsave命令,将数据生成rdb文件发送给从节点

2.从节点首先删除旧的数据,然后接收新的rdb文件,这个时候从节点的数据保持跟主节点执行bgsave命令时的数据状态,但是这个时候会出现数据的不一致

3.主节点将复制缓冲区的写操作命令全部发送给子节点,然后子去执行,这样会保证从节点的数据跟主节点的数据保持一致,这时候从节点就拥有一个offset和runid

部分复制

因为全量复制会带来很大的计算机性能开销,所以redis后面提供了部分复制,在数据同步中断或者网络中间的前提下,实现部分复制

部分复制需要依赖一下几个机制实现

runid: 主节点的标识符

复制缓冲区: 用于存储备份主节点的写命令,是一个fifo队列

复制偏移量 offset :复制缓冲区中的数据标识

其实部分复制是针对复制缓冲区的数据而言,复制缓冲区中的每条数据都带有offset,主从节点都各自维护一个offset,当从节点发送同步命令的时候会带有一个offset和runid,当runid的和接收的主节点的runid不一样则执行全量复制,当runid一致的时候就比较offset,看从节点发送过来的offset是否在复制缓冲区中,如果不在,那么执行全量复制,如果在,那么就把缺少的offset发送给从节点,从而实现数据的一致性。


第三 命令传输阶段

数据同步阶段完成之后就到了命令传输阶段,主要是为了完成数据的一致性,主节点将写命令传输给从节点去执行,中间涉及到复制缓冲区,包括主从之间还涉及到心跳机制。心跳机制也影响数据同步采用何种同步方式。

但是该阶段并不一定保证数据的强一致性,因为命令传输阶段是异步的,也就是说主节点发送命令并不会等从节点的回复,所以出现延迟和数据的不一致性还是在所难免,这个也跟主从之间的网络状况和主节点发送命令的频率有关。

repl-disable-tcp-nodelay no/yes  该配置是主节点发送命令是否需要对包的合并从而减少带宽,默认是关闭的

三、心跳机制

ping

主节点发送ping给子节点,用来检测两者连接是否超时

ack

从节点发送offset的命令,每秒一次

四、应用中的问题

数据过期问题

定期删除(选取一部分数据判断key是否过期从而进行删除)+惰性删除(获取key时候先进行判断是否过期)

内存淘汰机制,在redis.cof 中  # maxmemory-policy volatile-lru 当内存不够用的时候,删除经常不适用的key

复制超时时间

当连接的时间超过阈值的时候就断开连接  repl-timeout参数,这个时间可以设置大一点,避免因为数据过大同步时间超过阈值时间断开连接,或者查询大量的数据比如 key * 等操作

正常重启 尽量使用 debug reload

你可能感兴趣的:(【redis主从复制解析】)