后面格式有点乱,将就看吧,内容都没错
优点:
- 主从复制:写入master的数据会同步到slave(提高了数据可靠性)
- 读写分离:master可以读写,slave只能读(提高了性能)
缺点:
- 没有解决单点失效(如果主节点宕机,那就无法写入,可能自动选举主节点,需要人为修改)
如何配置主从模式?(配从不配主):
- redis.conf:slaveof (5.0之前的版本)
- redis.conf:replicaof (5.0之后的版本)
其余配置:
- 配置主服务密码:masterauth
- 设置自己节点的密码:requirepass
- replication buffer缓冲区大小:client-output-buffer-limit slave <32mb缓冲区大小> <8mb 60秒内写入超过次大小算作缓冲一处> <60秒>
- repl_backlog_buffer积压缓冲区大小:repl-backlog-size 1mb
- 主从增量同步延迟性:repl-disable-tcp-nodelay yes/no(yes redis会合并小的TCP包从而节省带宽,但会增加同步延迟,造成master与slave数据不一致;no 主节点会立即发送同步数据,延迟降到最低)
- 心跳从节点超时时间(超时后代表从节点掉了):repl-timeout <60 单位为秒>
- 主节点向从节点发送心跳频率:repl-ping-slave-period <10 单位为秒>
- 主从延迟大于n秒,拒绝写命令:min-slaves-max-lag
- 从服务少于n个,拒绝写命令:min-slaves-to-write
主从模式用到的命令:
- 查看从节点信息:info replication
- 客户端连接服务时输入密码(服务没有设置就不需要输入):auth
- 从节点关闭同步功能,不再连接主服务,自己变成了主服务,客户端可做读写操作,原本的数据不丢失:slaveof on one
节点数据的持久化:
- 每一个节点(主节点、从节点)的持久化数据方式都按各自节点的配置来走
sync、fsync数据同步命令:
sync:
-
- redis2.8版本之前(不包含2.8)
- 全量数据同步
fsync:
-
- redis2.8版本之后(包含2.8)
- 全量数据同步、部分数据同步
主从复制大致流程:
- 设置主节点的地址和端口
- 建立套接字连接
- 发送PING命令
- 权限验证
- 同步数据集
- 命令持续复制
全量复制、部分复制 判断条件:
执行全量复制:
从节点主动发送全量同步命令:
-
-
-
-
- 从节点没有复制过任何节点数据
- 从节点之前执行了slaveof on one后,再连接主节点
-
-
-
主节点告诉从节点要全量同步:
-
-
-
-
- 从节点发送同步命令,主节点 判断run ID不对、offset复制偏移量 再积压缓冲区找不到
-
-
-
执行部分复制:
-
-
-
- 从节点发送同步命令,run ID与当前主节点对应,offset复制偏移量可以再积压缓存区找到
- 心跳检测,从节点的偏移量和主节点偏移量不一致
-
-
主节点响应fsync:
-
-
- fullresync {runid} {offset},表示全量同步
- +continue部分同步
- -err,主节点redis版本低于2.8,无法识别psync,从节点会再发送sync,进行全量同步
-
两个缓冲区:
replication buffer复制缓存区:
数量:主节点对每一个从节点都会创建一个此缓存区
作用:主节点再全量同步RDB时,之后写入的数据会存入此缓冲区,RDB同步完,发送此缓存区的数据给从节点进行同步
repl_backlog_buffer积压缓存区:
数量:主节点只有一个公共的缓存区
作用:全量同步后,主节点每接收一个命令后,不仅会将命令发送给从节点,还会将命令存入此缓存区,用于再从节点与主节点断开连接后,从节点恢复连接可以通过从节点的复制偏移量,在此缓存区判断是否部分复制。
全量复制:
-
-
- 从节点发送全量复制命令
- 主节点收到命令,执行bgsave,后台生成RDB文件,同时使用 replication buffer复制缓冲区(记录生成文件后主节点写入的命令)
- 主节点发送rdb文件,从节点先清楚旧数据,再载入新数据(从节点阻塞,无法对客户端响应命令)
- 主节点发送复制缓冲区的内容,从节点载入
- 如果从节点开启AOF,会触发bgrewriteaof重写
-
部分复制(fsync <主节点运行ID> <从节点复制偏移量>):
-
-
- 从节点发送fsync命令
- 主节点判断是否符合部分复制,符合则将从节点偏移量-最新的数据发送给从节点
- 从节点进行部分数据同步
-
命令持续复制:
主节点将命令异步发送给从节点(主节点不会等从节点同命令),从节点将命令同步
心跳检测:
作用:
-
-
-
- 检测从节点是否存活
- 通过从节点返回给主节点的复制偏移量,判断是否部分复制
-
-
流程:
-
-
-
-
- 主节点每隔10秒(发送频率配置repl-ping-slave-period)向从节点发送ping命令,等待从节点恢复pong
- 从节点每隔一秒,发送replconf ack{offset}一次,其作用:
- 主节点判断 从节点的复制偏移量(偏移量不一样就部分复制)
- 检测主从网络是否通畅
- 主节点判断min-slaves-to-write、min-slaves-max-lag 检测判断是否继续执行写操作
- 双方超过60秒(配置repl-timeout)没有回复,判断对方掉了,断开连接
-
-
-