媛代码社区

java_redis 主从复制

技术
Alpha
· 阅读 94 · 评论 0 · 2 年前

从以下几个方面进行记录:

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缓冲区的长度,则进行全量复制。

帖子评论(0)
发起评论
暂无数据
Loading
推荐帖子
  • 关于忘记安装依赖包这件事
  • 新创建了一个vue项目查看时发现首...
  • “至少一名女性董事”,是对男人的反...
  • 有什么好书推荐?什么类型都行
  • 媛代码访谈第 5 期 | 集美们好...
社区宗旨
媛代码社区是女性科技从业者的聚集地
我们鼓励:
分享生活经验,日常趣事
晒晒您的作品,讨论讨论技术
也可以吐槽职场,抱怨不公
我们致力于:
让更多的人听到我们的声音
打破社会传统偏见!提升个人能力!
快来加入媛代码大家庭吧!
加入组织
二维码

媛代码社区微信公众号