咱们常常据说redis具备高可靠性,这里的高可靠性有什么含意呢?
① 数据少失落
② 服务少中断
①通过AOF,RDB保障
②通过多实例保留数据备份保障,即多个机器都保留一份数据,即便机器A宕机了,也有机器B,机器C来服务。
那么redis如何保障各个机器的数据一致性呢?
先想像,如果客户端操作了一个key,然而每次都是操作不同机器,比方
机器A: set aaa 111
机器B: set aaa 222
机器C: set aaa 333
此时,咱们拜访不同机器时,失去key aaa的值都会不同,会对业务造成影响。
redis采纳的是主从模式来保障各机器备份数据的一致性,比方设置机器A为master(主),机器B,C为slave(从)
读操作:A,B,C机器
写操作:先写A机器,而后同步给B,C机器
主从库如何进行第一次数据同步?
因机器数量无限,就在同一机器启动三个实例A, B, C。
实例A:16379 端口(master)
实例B:16379 端口(slave)
实例C:16379 端口(slave)
实例B,C都成为实例A的从库:执行slaveof 127.0.0.1 16379,就成为了实例A的从库。
具体流程:
① 实例B执行 slaveof 127.0.0.1 16379
② psync runID offset , 实例B通知实例A,我须要要同步你数据
参数1 runID, 代表实例A的惟一标识(redis实例启动后主动生成的惟一ID)
参数2 offset,复制进度,这里 - 1 复制代表全量复制
③ 实例A收回相应命令 FULLRESYNC RunID offset(FULLRESYNC 主库ID 主库复制进度)。
④实例B保留实例A响应的runID offset。
⑤实例A执行bgsave命令,生成RDB(实例A的所有数据),发送给实例B
⑥实例B清空本人所有数据,加载RDB文件
⑦replication buffer 是什么呢?
构想一下,实例A在生成RDB时和向实例B传输RDB文件时,有新的写申请怎么办?
实例A生成和传输RDB过程必定不能拒绝服务,所以会先把操作记录到复制缓冲区,即replication buffer,等RDB文件发送实现后,再发送缓冲区的写操作,这样master和slave能力数据统一~~~~
⑧加载replication buffer。
主从库间网络断了,主从数据不统一怎么办?
redis2.8前, 主库会和从库从新进行一次全量复制。
redis2.8后, 采纳增量复制,这里波及到 repl_backlog_buffer(环形缓冲复制队列),当主从库断连后,主库会把断连期间收到的写操作命令,写入 replication buffer(复制缓冲区),同时也会把这些操作命令也写入 repl_backlog_buffer(环形缓冲复制队列)。repl_backlog_buffer 是一个环形缓冲区,主库会记录本人写到的地位,从库则会记录本人曾经读到的地位。
主从网络中断复原连贯时,从库会通过psync命令把offset发给主库,主库把master_repl_offset(3)和 repl_backlog_buffer(1)之间的数据复制给从库就能够,则图中2,3局部即可~~~~。
留神:
如果从库的读取速度比较慢,就有可能导致从库还未读取的操作被主库新写的操作笼罩了,这会导致主从库间的数据不统一。比方
master 把环形缓冲区写了两次了,
slave 环形缓冲区第一次还没读完,就会存在~~~~数据失落。