
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
高可用性是目前大多数软件开发程序员在开发软件的时候都需要满足的一个开发需求,而本文我们就通过案例分析来简单了解一下,高可用性主从复制实现原理分析。
主从复制是如何进行复制的,是一次性全部复制,还是分批一批一批的复制?而且如果复制中网络中断,数据还能保持一致性吗,其内部原理是怎样的?Redis的复制功能主要有两个操作:
同步(sync):同步操作是将从库的数据状态更新至主库当前所处的状态,主要有全量复制和增量复制两种
命令传播(commandpropagate):命令传播是作用在主库的数据库状态被修改后,主从库之间的数据库状态出现不一致,让主从服务器的数据库状态重新回到一致性。
在同步操作中,我们先来看看全量复制,顾名思义也就是主库将所有的数据传送给从库。因为主从库初始化需要传输全部数据,所以一次同步其实就是一次全量复制。当启动多个Redis实例时,主从库间就可以通过replicaof(Redis5.0前使用的是slaveof)命令形成主从库的关系,在这期间从库就会全量复制当前主库的数据库状态。主要分为三个阶段:
主从库建立连接:主要是为全量复制做准备,在这一步,从库和主库建立起连接,告知主库进行数据同步,待主库确认回复后,主从库之间可以开始同步。主要的操作是从库给主库发送psync命令,主库根据这个命令参数来启动复制。而psync命令包含了主库的runID和复制进度offset两个参数:
runID:是每个Redis实例启动时随机生成的ID,它是用来标记这个实例。而当主从库一次复制时,从库不知道主库的runID。因此将runID设置为“?”。
offset:一次设置为-1,表示一次复制
主库在接收到psync命令后,会利用FULLRESYNC响应命令带上两个参数:主库runID和主库目前的复制进度offset来返回给从库。而从库在收到响应后会记录下主库传递的这两个参数。
主库将所有数据同步给从库:数据同步给从库后,从库接收到数据后,在本地完成数据加载。这个过程主要依赖于内存快照生成的RDB文件。
内部具体的流程是,主库先执行bgsave命令,执行持久化生成RDB文件,并将该文件发送给从库。从库在接收到RDB文件后,会先清空当前数据库,然后再加载RDB文件。
在主库同步从库过程中,我们知道bgsave命令系统会fork一个子线程来创建RDB文件,另外的主线程可以继续处理命令请求。而在同步过程中的新增的写操作,主库会在内存中用专门的replicationbuffer来记录这些写操作。
主库将新接收的写操作再发送给从库:当主库完成RDB文件发送后,就会将replicationbuffer中的写操作发送给从库,从库再执行这些写操作。到此完成所有的操作数据同步。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。