从以下几个方面进行记录:
1.什么是主从复制;
2.为什么需要进行主从复制;
3.主从复制的模式有哪些;
4.主从复制的工作原理;
5. 相关名词;
6.复制流程;
1.什么是主从复制============================================================
主从复制:是指有一台redis 做为主节点(master),配置其他redis 作为该主节点 的从节点(slave),主节点redis 可进行读写,写操作后将数据分发到从节点进行数据同步,从节点redis 只负则读,从节点的数据从主节点复制过来,数据的复制是单向的,只能由主节点流向从节点,
2.为什么需要进行主从复制=====================================================
背景: 在日常开发中,经常会用到redis,如果部署的是单节点redis ,当该redis 服务挂了之后,大量的请求会直接打到数据库,造成数据库压力过大,cpu 飙升,严重可能会导致服务器挂掉,这就是一般说的单节点故障,为了解决这一问题,主从复制模式出现了,主从复制模式有以下特点:
1. 数据冗余;2.单点故障;3.读写分离;4.负载均衡;5.高可用
3.主从复制的模式有哪些=====================================================
复制的模式有:增量复制和全量复制;
全量复制一般发生在slave 节点初始化的时候,slave 要将master 的数据全部复制一遍;增量复制发生在主节点进行写操作之后,主节点将更新的命令发生给从节点进行数据同步
4.主从复制的工作原理=====================================================
1. 当从节点第一次链接主节点时,会发送一个psync 命令到主节点触发全量复制,主节点接收到该命令后,会fork 一个后台进程,该进程开始生成一个rdb快照,同时将外来的写命令写入缓冲区,rdb文件生成完之后主节点将其发生给从节点,从节点拿到rdb 先写入磁盘,再写入内存,接着master 会将缓冲区的写命令同步到slave,slave 执行写命令开始同步数据,如果master 和slave 中间因为网络原因断开,会自动重连,master 会将复制缺少的数据给slave;
5.相关名词==============================================================
runId -----主节点的运行id
redis 在启动时会生成的随机id,唯一标识该节点,40长度的16进制字符
offset -----复制偏移量
指命令的字节长度,比如16000,通过对比主从节点的复制偏移量,来判断主从节点数据是否一致,增量复制的时候用到
replication buffer-----内部队列缓冲区
主从节点连接的缓冲区,主从节点之间复制命令的传输经过这个缓冲区,每个主从节点之间独有的,当主从节点连接断开,这个缓冲区会被删除
repl_backlog_buffer -----环形缓冲区
salve之间共享的缓冲区,开始执行命令之前,会建立这个缓冲区,这个缓冲区记录了master 接收到的新的命令,和master 的offset,slave 发送psync 到主节点之后,主节点会发送新的写命令和offset 到slave,slave 通过对比offset 来判断自己是否要执行写命令进行增量复制
6. 复制流程============================================================
1.全量复制:
步骤:
1.从节点发送psync 到主节点;
2.主节点接受到psync 命令,fork子进程开始执行bgsave命令生成rdb快照,并使用replication buffer 缓冲区记录此后执行的所有写命令;
3.主节点执行完bgsave命令,向所有服务器发送rdb快照,在此期间,写命令仍然进入replication buffer中;
4.从服务器收到快照,丢弃旧数据,载入新数据;
5.主节点发送完rdb 快照,接着发送缓冲区的写命令;
6.从节点载入新数据完成后,接收写命令并执行;
增量复制流程:
1.从redis 2.8开始,因网络原因主从连接断开,再次连接时可从中断处复制,而不是全量复制;
2.主从断开重连之后, 主节点会根据从节点发送的runId和offset 来判断进行全量还是增量复制,判断逻辑如下:
增量复制:
如果runId和主节点的 id相同,并且主从的offset差距没有超过repl_backlog_buffer缓冲区的长度,主节点就会复制offset 之间的repl_backlog_buffer的命令给slave。
全量复制:
如果runId 和主节点的 id 不同或者主从的 offset差距超过repl_backlog_buffer缓冲区的长度,则进行全量复制。
媛代码社区微信公众号