在线QQ客服:1922638
专业的SQL Server、MySQL数据库同步软件本文摘自微信公众号:不仅Java
今天,我想与大家分享Redis主从同步(也称为”复制”)。
我们知道,当有多个Redis服务器时,必须有一个主服务器和多个从属服务器。一般而言,主服务器执行写操作,而从服务器执行读操作。
这里存在一个问题:如何在从属服务器和服务器之间同步数据主服务器怎么样?
此问题已通过今天的内容解决:主从同步。
文章内容仍然相对干燥,总计3k +话。请参阅,文章结尾将为您提供简要的摘要。
1.如何执行主从同步
如果有2个Redis服务器,则地址为127.0.0.1:6379和127.0.0.1:12345
我们在客户端上的127.0.0.1:12345输入命令:
因此127.0.0.1:12345服务器将复制127.0.0.1:63 79数据。也就是说,前者是从属服务器,而后者是主服务器。
除上述方法外,还可以使用配置文件Option中的slaveof进行设置。
可能,您将想知道Redis将如何从同步掌握它。
好,让我们继续理解。
2.主从同步的实现过程
主从同步分为两个步骤:同步和命令传播
同步:将从属服务器的数据库状态更新为主服务器的当前数据库状态。(本文开头提到了数据库状态。如果不清楚,则可以首先查看:让您了解Redis的持续性)style =” margin-left:0em; margin-right:0em;”> 命令传播:修改主服务器数据库的状态后,主从服务器数据库的状态将不一致,因此需要将主从数据同步到一致的状态。
以上是主从同步的2个步骤下面的角色,我打算详细说明这两个步骤的执行过程。
这里我们需要预先说明:在Redis 2.8之前,主从复制必须按顺序执行以上两个步骤,从2.8开始,您可能只需要执行命令传播即可,我将解释为什么是这种情况
2.1 sync
从服务器到主要服务的同步操作需要使用sync命令来完成,以下是执行sync命令的步骤:
1.从服务器向主服务器发送同步命令
2.接收到sync命令后,主服务器将执行bgsave命令,该命令用于生成rdb文件并将从现在开始执行的write命令记录在缓冲区中。
3.完成bgsave的执行后,将生成的RDB文件发送到从属服务器,以将数据更新到从属服务器
4.主服务器随后将发送给从服务器的缓冲区记录命令写入,从服务器执行这些写命令后,此时数据库的状态将与主服务器一致。
就像在图中这样:
; “>
2.1命令传播
同步操作之后,主从数据库状态实际上是一致的,但是此一致状态不是静态的。
同步完成后,也许主服务器会立即收到它。New write命令。执行此命令后,主数据库和从数据库的状态不一致。
要使主从数据库状态再次保持一致,主服务器需要对从服务器执行命令传播操作,即,将导致不一致的写命令发送给从服务器执行。 。
在此处插入一个问题:
我不知道是否有读者认为当上述不一致发生时,Redis会再次执行同步吗?
就效果而言,确实可以恢复同步,但是没有必要。原因是用于实现同步的sync命令是非常消耗资源的操作。阅读下图中的说明后,相信您一定会理解。
由于同步是非常耗费资源的操作,因此Red是否有任何优化方法是吗答案是肯定的。
2.3优化的版本同步操作
记住我上面所说的-2.8从在版本中,主从同步可能仅需要执行命令传播。这也是因为同步会消耗更多资源,因此需要进行优化。
什么时候可以完成?让我们先看一下先决条件:
实际上是划分了主从同步分为2种情况:
第一次复制:从属服务器第一次复制当前的主服务器(PS:可能会替换主服务器)
断开连接后重新复制:由于网络问题,主从服务器在命令传播阶段中断复制,并且从服务器自动重新连接,重新连接到主服务器并继续复制。
如果在断开连接时,主服务器(已经有成千上万个键值对)仅执行少数几个写命令,为了使从服务器补偿这些命令,必须重新执行同步
要解决此问题,请使用psync命令而不是2.8版中的sync命令执行同步操作。
psync具有完全重新同步和部分重新同步的两种模式。
完全重新同步:用于初始复制,执行过程与sync相同,在此不再赘述。
部分重新同步:在断开连接后用于重新复制。如果满足某些条件,则主服务器仅需要将断开连接期间执行的写命令发送到从服务器。
很明显,当母版和从站同步出现在断开连接后重新复制的情况下,psync的部分重新同步模式可以解决同步效率低下的问题。
在上面的介绍中,”满足某些条件”出现了,鬼的条件是什么?-实际上,它是偏移量的比较。您可以继续查看详细信息。
2.4部分重新同步\\ n
重新同步功能的一部分由以下3个部分组成:
主-从服务器偏移量
复制待办事项缓冲区主服务器
服务器的运行ID(运行ID)
2.4.1复制偏移量
执行复制的主服务器和从属服务器将保持各自的复制偏移:
每次主服务器传播到从服务器时,当有n个字节的数据时,它将在其自己的副本偏移量上加上n。
当从服务器从主服务器接收数据时,它还将添加自己的副本偏移n
例如:
如果当前主服务器的复制偏移为10000,则此时将30字节的数据传播到从服务器,并且复制偏移在结束后为10030。
此时,从属服务器在接收30个字节的数据之前中断,先联机,然后再重新连接,然后从属服务器的复制偏移仍为10000,表明主数据和从属数据不一致,此时,psync命令将发送到主服务器。
因此,主服务器应该执行从属服务器的完全重新同步还是部分重新同步?如果执行部分重新同步,则主服务器如何知道要与从属服务器同步的数据?
以下答案都是关于复制待办事项缓冲区
2.4.2复制待办事项缓冲区
首先,复制产品这是一个固定长度的缓冲区,FIFO队列默认为1MB。
当主服务器传播命令时,它不仅将命令发送到从属服务器,还将发送到该缓冲区。
因此,复制积压缓冲区的结构如下:
当从服务器向主服务器发送psync命令时,还需要带上自己的复制偏移量,主服务器可以将此复制偏移量与复制积压缓冲区偏移量进行比较。
如果复制积压缓冲区包含来自服务器的复制偏移量+ 1之后的数据,则将执行部分重新同步,否则将执行完全重新同步。
2.4.3运行ID
运行ID是初始副本,主服务器会将其自己的运行ID发送给从服务器以保存它。
当从属服务器断开连接并重新连接时,从属服务器将将此运行ID发送到刚连接的主服务器。
如果当前服务器的运行ID相同,则意味着在断开与服务器的连接之前,复制的服务器是当前服务器,主服务器可以尝试执行部分同步;
如果不同,则表示在断开服务器连接之前复制的服务器不是当前服务器,主要服务器直接执行完全重新同步。
花费了很多笔墨,最后编写了部分重新同步的实现,最后添加了一个辅助函数
2.5心跳检测
刚刚提到,使用同步命令进行主从同步并扩展了两个步骤。
同步完成后,主从服务器将进入命令传播阶段,从服务器将以每秒1的频率向主服务器发送命令:REPLCONF ACK \\ replication_offset \ ;其中Replication_offset是从属服务器的当前复制偏移量
发送此命令具有三个主要功能:
检测主服务器和从属服务器的网络状态
协助实施min-slaves选项
检测丢失的命令(如果丢失,主服务器将把丢失的写命令重新发送到从属服务器)
3.摘要
最后总结,让我们总结和纪念我的下午的时间。
主从同步可以通过发送SLAVEOF命令来完成,例如:SLAVEOF 127.0.0.6379
主从同步有两个步骤:同步和命令传播。
同步:将从属服务器的数据库状态更新为主服务器当前数据库状态(消耗资源的操作)
命令传播:修改主服务器数据库的状态时,主从服务器数据库的状态不一致。数据同步到一致的过程
主从同步分为两种情况:初始复制和断开连接后重复复制
从2.8开始,从版本开始,断开连接后进行复制时,将根植主服务器 根据复制偏移量,复制积压缓冲区并运行id来确定是执行完全重新同步还是部分重新同步
2.8版改为使用psync命令sync命令执行同步操作,目的是解决同步操作效率低下的问题(sync命令)
Hollis官方帐户文章已被授权为了进行原始的版权保护,为避免不必要的版权责任,请注明出处!
Java工程师成为GitHub更新上的God系列文章的方式,欢迎关注,欢迎关注。
<
Face Java#206:什么是正则表达式
沉道路015:对Java IO的深入研究
深度并发问题006:正确使用Java线程池的状态
-更多|更精彩的文章-
IntelliJ IDEA已使用一年,它是长期收集呕吐血液的必备附件
打败了程序员,您如何获得9个月的年度终奖?
世界上最脏的技术解释,我实际上是在几秒钟内就能理解的。
叔叔和姨妈,我真的不修电脑
如果您喜欢这篇文章。
长按QR码,然后按照Hollis
转发朋友圈是对我的最大支持。