主从复制
主从复制:将主节点的数据复制至从节点(异步复制)
1)从节点只能有一个主节点,但主节点可拥有多个从节点;
2)主从节点的内存相关配置必须完成相同(保证数据安全性);
3)数据的复制流是单向的(只能由主节点传至从节点);
4)主从节点连接默认无验证环境(均可访问);
//可通过参数“requirepass”参数指定密码验证
//若主节点开启密码验证,从节点需配置参数“masterauth”指定密码
主节点(Master):主从复制中被复制的数据Redis
1)Redis均默认本身为主节点(可通过参数和命令更改)
2)可配置参数“repl-disable-tcp-nodelay=yes或no”是否开启TCO_NODELAY
//开启后主节点发送数据的间隔时间由Linux内核决定(适用于高延迟网络环境)
从节点(Slvae):主从复制中接收复制数据的Redis
1)从节点可切换主节点,但切换前会先重置从节点(清空Redis数据);
2)当主从节点断开时,从节点中的数据仍保留(不能再获取新数据);
3)对于接收到的复制数据,从节点默认为只读模式;
//可通过参数“slave-read-only=yes或no”修改是否为只读模式
复制实现
主从复制实现分为:配置参数、命令触发
1)两者均在从节点中执行(需提前得知主节点的IP和端口);
2)通过客户端连接从节点可执行相关操作;
(1)配置参数:slaveof 主节点IP 主节点端口
1)可在配置文件或启动Redis时指定该命令;
2)本质:周期性调用SLAVEOF命令
(2)命令触发:SLAVEOF 主节点IP 主节点端口
1)若该从节点已存在主节点,则会执行切主(切换主节点);
2)SLAVEOF命令属于异步命令,执行后直接返回(内部执行流程);
SLAVEOF命令执行流程:
1)从节点执行SLAVEOF命令(保存主节点信息);
2)从节点通过定时任务与主节点建立网络连接(Socket);
3)从节点发送ping验证Socket连接是否可用(主节点回复pong则可用);
4)主节点的验证从节点的masterauth参数是否相等requirepass参数;
5)若通过验证,主节点根据连接从节点选择全量复制或部分复制;
6)主节点持续将写命令发送至从节点(保持主从数据一致性);
如:SLAVEOF命令流程图
//“SLAVEOF NO ONE
”命令断开主从复制
复制结构
一主一从
一主一从:仅有一个主节点和一个从节点
1)功能:支持高并发写命令,同时保证数据安全性
2)可只在从节点开启AOF,实现主节点的高性能同时保证数据安全
3)当主节点关闭后再次连接,需先断开主从复制(避免从节点被重置)
//也可在主节点故障修复后,将其作为从节点的从节点(从节点变为主节点)
如:一主一从复制结构
一主多从
一主多从(星形拓扑):仅有一个主节点,但有多个从节点
1)功能:实现读写分离(主节点负责写,从节点负责读)
2)当写命令较多时,会导致主节点频繁发送数据导致网络宽带不足
如:一主多从复制结构(不建议在多写环境下使用)
树状主从
树状主从(树状拓扑):只有一个绝对主节点
1)除绝对主节点外,其他节点可同时为主节点和从节点(根据参考对象)
2)功能:保证绝对主节点的性能(由中间复制层负责数据的处理)
如:树状主从复制结构
心跳机制
心跳机制:主从节点连接后保证连接的不中断
心跳机制的实现方式分为以下3种:
(1)主从节点分别模拟成对象的客户端尝试通信;
(2)主节点默认每隔10秒发送ping命令以判断是否连接;
1)可通过参数“repl-ping-slave-period
”指定主节点的发送频率
(3)从节点默认每隔1秒发送“replconf ack 偏移量
”命令至主节点
1)功能:检测网络状态和上报自身偏移量
2)主节点根据字段lag判断是否断开连接(超过60则断开);
//可通过参数“repl-timeout
”指定lag可容忍的值
全量/部分复制
运行ID(run_id):Redis启动后动态分配40位的十六进制字符串
1)可通过运行ID识别每个Redis节点(具有唯一性);
2)Redis重启后其运行ID会改变(主节点运行ID改变会导致全量复制);
3)“debug reload
”命令重新加载RDB运行Redis可保持其运行ID不变;
//该命令会阻塞主线程(删除本地RDB文件,并加载指定的)
偏移量:主从节点在复制过程中均记录已复制数据大小(字节长度)
1)从节点以秒为周期将自身的偏移量传至主节点(主节点保留);
2)可通过对比主从节点的偏移量判断数据是否一致和实现部分复制;
//主从节点的偏移量分别记录在字段master_repl_offset
和字段slave_repl_offset
复制积压缓冲区(repl-back-log-buffer):主节点中用于存储最近复制数据
1)该缓冲区为固定长度的队列,默认为1MB;
2)主节点将写命令发送至从节点的同时,也会发送一份至该缓冲区;
3)可实现从节点断开连接后,实现部分复制以保持主从数据一致性;
//无法确定从节点一定能接收到最新数据,在该缓冲区中以作备份
全量复制
全量复制:主节点将节点中所有数据均发送至从节点
1)用于初次复制(数据量较大,主节点和网络开销很大);
如:主从节点执行全量复制流程
sync命令:实现全量复制
sync
部分复制
部分复制:主节点根据偏移量发送部分数据至从节点
如:从节点断开后,主从节点执行部分复制流程
psync命令:实现全量/部分复制
psync 主节点运行ID 从节点数据偏移量
1)若未指定主节点运行ID,则默认为“?
”;
2)若数据偏移量为“-1
”,则达标执行全量复制;
3)若从节点第一次执行该命令,则偏移量强制为“-1
”;
根据psync的参数和主节点自身偏移量有以下3种回复:
回复值 | 说明 |
---|---|
+FULLRESYNC 运行ID 偏移量 | 执行全量复制 |
+CONTINUE | 执行部分复制 |
+ERR | 执行全量复制 (无法识别psync命令) |