一文让你明白Redis主从同步

今天想和大家分享有关 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> SLAVEOF 127.0.0.6379

 

如此 127.0.0.1:12345 服务器就会去复制 127.0.0.1:6379 的数据。即前者是从服务器,后者为主服务器。

除了以上方式进行复制之外,还可以通过配置文件中的 slaveof 选项进行设置。

 

可能,求知欲爆棚的你会想知道,Redis 是怎么进行主从同步的?

 

ok,下面我们继续了解一下。

 

2. 主从同步的实现过程

 

主从同步分为 2 个步骤:同步和命令传播

 

同步:将从服务器的数据库状态更新成主服务器当前的数据库状态。(数据库状态在这篇文章开头有提到是什么意思,不清楚的小伙伴可以先看下:)

命令传播:当主服务器数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的过程。

 

上面就是主从同步 2 个步骤的作用,下面我打算稍微细说这两个步骤的实现过程。

 

这里需要提前说明一下:在 Redis 2.8 版本之前,进行主从复制时一定会顺序执行上述两个步骤,而从 2.8 开始则可能只需要执行命令传播即可。在下文也会解释为什么会这样?

 

2.1 同步

 

 

从服务器对主服务的同步操作,需要通过 sync 命令来实现,以下是 sync 命令的执行步骤:

 

1. 从服务器向主服务器发送 sync 命令

2. 收到 sync 命令后,主服务器执行 bgsave 命令,用来生成 rdb 文件,并在一个缓冲区中记录从现在开始执行的写命令。

3. bgsave 执行完成后,将生成的 rdb 文件发送给从服务器,用来给从服务器更新数据

4. 主服务器再将缓冲区记录的写命令发送给从服务器,从服务器执行完这些写命令后,此时的数据库状态便和主服务器一致了。

 

用图表示就是这样的:

 

一文让你明白Redis主从同步

 

2.1 命令传播

 

经过同步操作,此时主从的数据库状态其实已经一致了,但这种一致的状态的并不是一成不变的。

 

在完成同步之后,也许主服务器马上就接受到了新的写命令,执行完该命令后,主从的数据库状态又不一致。

 

为了再次让主从数据库状态一致,主服务器就需要向从服务器执行命令传播操作 ,即把刚才造成不一致的写命令,发送给从服务器去执行。从服务器执行完成之后,主从数据库状态就又恢复一致了

 

这里插播一个疑问:    

 

不知道有没有的读者觉得,当发生上述不一致的情况后,Redis 再执行同步操作不就 ok 了吗?

 

从效果上来说,的确是可以恢复同步,但其实没有必要。原因是实现同步的 sync 命令是一个非常消耗资源的操作,看完下图的说明,相信你肯定理解的。

 

一文让你明白Redis主从同步

 

既然同步是一个非常消耗资源的操作,那 Redis 有没有什么优化方法呢?答案当然是有的。

 

2.3 优化版同步操作

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzgfz.html