前言
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
网友评论