首页 > 技术笔记 > [redis]线上大数据量redis主从一例

[redis]线上大数据量redis主从一例

2014年6月18日 发表评论 阅读评论

背景:
master redis 数据13GB,由于持久化没有关闭,在进行持久化时不响应服务请求,导致业务异常。现关闭持久化,所以需要做一台slave作为备份且业务可以进行read操作。
redis版本2.6.16。
过程:
redis主从配置相对简单,在slave配置中加入slaveof ip port 即可,但是在实际操作中遇到了问题,解决过程如下,备忘之:
master 13G数据
现象:
slave不停的去master上同步数据,每次都取一份完整13G rdb文件,master过两分钟就会dump一份完整的rdb文件,send给slave,导致负载上涨。
slave 在把tmp rdb文件加载到内存中后,我连接master上set key,然后在slave上不能get到,说明同步没有成功,而且发现上述过程一直持续。
由于持续同步数据,导致网络流量和cpu都有异常
redis1

redis2

查看状态:
slave info信息
master_link_status:down 显示master一直没有连接成功
master info信息
slave0:172.17.108.1,16379,wait_bgsave
一会变成,一直没有成功online
slave0:172.17.108.1,16379,sendbulk
查看日志:
slave:
日志中I/O error trying to sync with MASTER: connection lost
查看主配置文件
timeout 0
tcp-keepalive 0
最开始以为是tcp-keepalive这个被禁用有关,改成非0的数后,还是上述故障现象。

最终 google了一下
client-output-buffer-limit 这个参数对slave 同步时候所用的buffer和timeout做限制了
默认值是这个 client-output-buffer-limit slave 256mb 64mb 60改成 client-output-buffer-limit slave 512mb 256mb 300
最终解决问题,
slave 日志
[29342] 18 Jun * MASTER <-> SLAVE sync: Finished with success

写在后面:

参数client-output-buffer-limit说明:
客户端buffer控制
在客户端与server进行的交互中,每个连接都会与一个buffer关联,此buffer用来队列化亟待被client接受的响应信息.
如果client不能及时的消费响应信息,那么buffer将会被不断积压而给server带来内存压力.如果buffer中积压的数据达到阀值,将会
导致连接被关闭,buffer被移除."
buffer控制类型包括:
 normal -> 普通连接
 slave ->与slave之间的连接
 pubsub ->pub/sub类型连接,此类型的连接,往往会产生此种问题;因为pub端会密集的发布消息,但是sub端可能消费不足.
指令格式:client-output-buffer-limit <class> <hard> <soft> <seconds>",其中hard表示buffer最大值,一旦达到阀值将立即关闭连接;
soft表示"容忍值",它和seconds配合,如果buffer值超过soft且持续时间达到了seconds,也将立即关闭连接,如果超过了soft但是在seconds之后
buffer数据小于了soft,连接将会被保留.
其中hard和soft都设置为0,则表示禁用buffer控制.通常hard值大于soft.

redis 主从流程说明:

整个流程过程如下:
    Slave端在配置文件中添加了slave of指令,于是Slave启动时读取配置文件,初始状态为REDIS_REPL_CONNECT。
    Slave端在定时任务serverCron(Redis内部的定时器触发事件)中连接Master,发送sync命令,然后阻塞等待master发送回其内存快照文件(最新版的Redis已经不需要让
Slave阻塞)。
    Master端收到sync命令简单判断是否有正在进行的内存快照子进程,没有则立即开始内存快照,有则等待其结束,当快照完成后会将该文件发送给Slave端。
    Slave端接收Master发来的内存快照文件,保存到本地,待接收完成后,清空内存表,重新读取Master发来的内存快照文件,重建整个内存表数据结构,并最终状态置位为 
REDIS_REPL_CONNECTED状态,Slave状态机流转完成。
    Master端在发送快照文件过程中,接收的任何会改变数据集的命令都会暂时先保存在Slave网络连接的发送缓存队列里(list数据结构),待快照完成后,依次发给Slave,之后
收到的命令相同处理,并将状态置位为 REDIS_REPL_ONLINE。

流程如下图
redis3

分类: 技术笔记 标签:
  1. xiehc
    2014年6月18日15:15 | #1

    redis版本2.8.8 在slave断了之后,可以增量同步了,有时间升级下线上版本

  1. 本文目前尚无任何 trackbacks 和 pingbacks.