什么是主从复制(Master/Slave)?

我们的数据一般是存储在数据库中,为了保证数据的高可用,我们一般使用多台数据库服务器做集群。选中其中的一台作为主服务器(Master),其余的作为从服务器(Slave)。Master 上的数据更新后根据配置文件配置的策略,自动同步到 Slave 上,这就是主从复制

主从复制有什么作用?

  1. 保证了数据的高可用。因为数据在多台服务器上存储了多份,即使一台机器宕掉了,其余的机器还可以顶上。
  2. 实现了读写分离。什么叫读写分离?写数据在 Master 上,读数据是在 Slave 上,这就叫读写分离。它缓解了以往 Master 既要处理读数据又要处理写数据的压力,Master 上负责写,Slave 上负责读,大大提升了数据库服务器的性能。
  3. 容灾恢复。当主机宕掉了之后,就没有办法向数据库中写数据了,怎么办?其余的 Salve 根据配置的策略,选出一台晋升为 Master,其余的 Slave 成为新 Master 的从机,当原来宕掉的 Master 恢复后,自动成为 Slave,实现了容灾恢复。

Redis 如何实现主从复制?

想要实现主从复制就必须开启多个 redis 服务,使用不同的 pid,指明不同的端口号,生成不同的 rdb 文件,产生不同的日志文件。

一、配置 redis.conf 配置文件

1. 将 redis 的配置文件复制多份:

è¿éåå¾çæè¿°

2. 将它们都设置为后台进程:

è¿éåå¾çæè¿°

3. 为它们配置不同的 pidfile(pid 文件名):

 è¿éåå¾çæè¿°
例:6379,6380,6381。

4. 为它们配置不同的 port(端口):

è¿éåå¾çæè¿°

5. 为它们配置不同的 logfile(日志文件):

è¿éåå¾çæè¿°

6. 为它们配置不同的 dbfilename(rdb文件名):

è¿éåå¾çæè¿°

二、启动多个 redis-server 服务

开启三个 Linux 远程连接客户端,在每一个客户端上开启一个 redis 服务。

redis-cli -h 192.168.198.130 -p 6379

redis-cli -h 192.168.198.130 -p 6380

redis-cli -h 192.168.198.130 -p 6381

三、启动多个 redis-cli 客户端

在每个 Linux 终端上开启一个 redis-cli 客户端连接到不同端口号上的 redis 服务:

redis-cli -h 192.168.198.130 -p 6379
redis-cli -h 192.168.198.130 -p 6380
redis-cli -h 192.168.198.130 -p 6381

注:ip 地址那里输入的是在配置文件中绑定的 ip。

è¿éåå¾çæè¿°

四、将其中的一个 redis 服务做为 Master,其余两个 redis 服务做为 Slave

已经开启的三个 redis 客户端:

è¿éåå¾çæè¿°

è¿éåå¾çæè¿°

è¿éåå¾çæè¿°

在 6380 和 6381 两个客户端中输入 slaveof 192.168.198.130 6379 命令,使这两个 redis 服务成为 6379 的 slave。

然后,分别在每个 redis 客户端输入 info replication 命令,显示每个 redis 服务在这个小型集群里面扮演的角色:

  • 6379 为 master:

è¿éåå¾çæè¿°

  • 6380 为 6379 的 slave:

è¿éåå¾çæè¿°

  • 6381 为 6379 的 slave:

è¿éåå¾çæè¿°

五、演示主从复制的过程

我们在 master 上执行 set k1 v1,预期的结果是在另外两个 slave 上 通过 get k1 命令可以获取对应的键值:

è¿éåå¾çæè¿°

è¿éåå¾çæè¿°

è¿éåå¾çæè¿°

成功了!当然,我们还可以发现其实在 master 上也是可以 read 的。

Redis 实现主从复制的原理是什么?

知其然还要知其所以然。

一、master 复制数据给 slave 的原理如下:

  1. slave 启动成功之后连接到 master 后会发送一个 sync 命令。

  2. master 接收到这个同步命令之后启动后台的存盘进程,即将内存的数据持久化到 rdb 或 aof。

  3. 持久化完毕之后,master 将整个数据文件传送给 slave。

二、slave 接收 master 复制过来的数据方式有两种:

     1. 全量复制:

         slave 刚与 master 建立连接的时候,会将接收到的 master 发来的整个数据库文件存盘并加载到内存。

     2. 增量复制:

         slave 已经与 master 建立好连接关系的时候,master 会将收集到的修改数据的命令传送给 slave,slave 执行这些命令,完成同步。而不是再一次重新加载整个数据文件到内存。

         当然,如果 slave 与 master 断开连接,再次重连的时候还是要加载整个数据文件的。

Redis 的主从复制的缺点

当 master 需要同步发送到 slave 上的数据量非常大的时候,会存在一定的时延。 
系统很繁忙或者 slave 机器数量非常多的时候也会使这个问题更加严重。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐