what:
redis高可用:
1、数据尽量不丢失;
2、尽可能的提供服务;
栗子:AOF 和 RDB 保证了数据持久化尽量不丢失;
主从复制就是增加副本,一份数据保存到多个实例上。即使有一个实例宕机,其他实例依然可以持续服务;
主从:
复制——为单向的,即:只能从主复制到从;
读写指责——读:主从都可以读。 写:主库先执行,之后将些操作同步到从库。一般master提供写,slave提供读。
client buffer:
Redis 和客户端通信也好,和从库通信也好,Redis 都分配一个内存 buffer 进行数据交互,客户端就是一个 client,从库也是一个 client,我们每个 client 连上 Redis 后,Redis 都会分配一个专有 client buffer,所有数据交互都是通过这个 buffer 进行的。
RDB和AOF文件对比:
a、RDB 文件是二进制文件,网络传输 RDB 和写入磁盘的 IO 效率都要比 AOF 高。
b、从库进行数据恢复的时候,RDB 的恢复效率也要高于 AOF。
how:
第一次全量复制:
分3个阶段:连接建立阶段(即准备阶段)-> 主库同步数据到从库阶段 -> 发送同步期间新写命令到从库阶段
连接建立阶段:从库执行 replicaof(之前是slave of) 并发送 psync 命令,表示要执行数据同步,主库收到命令后根据参数启动复制。命令参数包含了:主库的 runID 和 复制进度 offset 。主库FULLRESYNC 响应表示第一次复制采用的全量复制,也就是说,主库会把当前所有的数据都复制给从库。
runID:每个Redis 实例启动都会自动生成一个 唯一标识 ID(runID),第一次主从复制,还不知道主库 runID,参数设置为空;
offset:记录复制进度偏移量,第一次复制为-1;
数据同步:master 执行 bgsave命令生成 RDB 文件,并将文件发送给从库,同时主库为每一个 slave 开辟一块 replication buffer 缓冲区记录从生成 RDB 文件开始收到的所有写命令; slave收到 RDB 文件后保存到磁盘,并清空当前数据库的数据,再加载 RDB 文件数据到内存中;
发送同步期间新写命令到从库:从节点加载 RDB 完成后,主节点将 replication buffer 缓冲区的数据发送到从节点,Slave 接收并执行,从节点同步至主节点相同的状态;
replication buffer 缓冲区的数据:
1)master 执行 bgsave 产生 RDB 的期间的写操作;
2)master 发送 rdb 到 slave 网络传输期间的写操作;
3)slave load rdb 文件把数据恢复到内存的期间的写操作;
replication buffer注意:太小会导致主从复制连接断开,由 client-output-buffer-limit slave 设置。
增量复制:
用于网络中断等情况后的复制,只将中断期间主节点执行的写命令发送给从节点,与全量复制相比更加高效(redis 2.8之后增加)。
原理:repl_backlog_buffer。不管在什么时候 master 都会将写指令操作记录在 repl_backlog_buffer 中。因为内存有限, repl_backlog_buffer 是一个定长的环形数组,如果数组内容满了,就会从头开始覆盖前面的内容。master 使用 master_repl_offset
记录自己写到的位置偏移量,slave 则使用 slave_repl_offset
记录已经读取到的偏移量。
增量同步如下:master 只需要把 master_repl_offset
与 slave_repl_offset
之间的命令同步给从库即可
注意:一旦被覆盖就会执行全量复制-
+
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/282703.html