个人技术分享

Redis主从复制

什么是主从复制

顾名思义,主从复制就是将一台机器的redis服务器设置为master,另一台机器的redis服务器设置为slave,将master的数据异步同步到所有的slave上

作为master的主机可读可写,而作为slave的从机只能读取数据不可修改数据

 如何配置主从复制

 配置主从复制只需要在配置文件中修改以下几项即可

解释: 

  1.  开启守护进程,使得服务器可以通过客户端的方式连接
  2. 取消bind本机,允许外部访问
  3. 关闭保护模式
  4. 指定要使用的端口
  5. 指定工作目录
  6. 修改pid文件名称,方便后面查找
  7. 修改log文件名称,log文件用来看主从复制记录
  8. 设置登陆密码
  9. 修改rdb文件名称
  10. 设置aof文件名称(非必须)
  11. 如果是从机的配置文件,则需要设置上主机的密码(和主机requirepass一致)和要连接的主机ip和端口号

配置主机和从机的配置文件后,启动redis服务器即可完成主从复制

主从复制的规则 

一主多从

一个主机可以有多个salve从机,可以通过配置文件或者命令的方式设置本机为从机,每一个独立的redis服务器都可以看作是一个主机,而我们要做的就是配置哪个服务器为从机总结起来就是配从不配主

1.从机可以执行写命令吗?

答:从机不可以执行写命令,只可以读取从主机拷贝过来的数据

 

2.从机启动时间在主机启动之后,从机可以获得启动之前的数据吗?

答:可以,从机在首次启动的时候会对主机进行全盘拷贝,通过主机发送过来的rdb文件复制主机的数据到从机上,之后每一次主机发生数据变化都会同步更新

3.主机shutdown后,从机会上位吗,主从关系如何变化?

答:主机shutdown或者意外宕机后,从机不会上位,且他们之间的主从关系依旧保持,但是状态是未连接状态,从机会原地等待直到主机重启


4.从机shutdown,master继续运行,从机再次重启时可以获取之前的数据吗?

答:可以,从机关机再重启和第2个问题本质是一样的,都可以获取所有数据

通过命令slaveof 主机ip 主机端口号也可以设置从机,但是这个命令的效果是临时的,当该从机重启时依旧会按照配置文件中设置的主机去绑定

配置文件设置的主机是永久的,通过命令设置的主机是临时的

如果一个从机绑定了服务器1,现在通过命令将其主机设置为服务器2,那从机上的数据如何处置?

答:从机上的数据会被新拷贝的数据覆盖掉,也即是舍弃旧数据复制新数据

链式复制

简单来说就是一个从机也可以作为另一个从机的主机,从而减少直接和主机相连的数量,减轻master的写压力

链式复制之后,作为中转节点的slave依旧是slave,只是逻辑上是另一个从机的master,实际上中转的slave不具备写操作权限 ,而真主机的slave数量将变成1个

反客为主

顾名思义,就是原来的从机不再是从机了,变成一个独立的主机

命令: slaveof no one 

执行命令后,原来的数据依旧保存在该数据库中,只是主从关系断开了

工作流程

 

解释:

  1. slave 启动成功,连接到 master 后会发送一个同步请求(sync)。 如果 slave 是首次连接 master ,将执行全量复制,覆盖原有数据
  2. master 收到同步(sync)命令后,开始后台保存快照(主从复制会触发rdb),同时会收集所有接收到的用于修改数据集命令缓存起来。然后 master 将 rdb快照文件和所有缓存命令发送所有的 slave ,从而实现一次性完全同步。
    而 slave 收到数据库文件后,将其存盘并加载到内存中,从而完成复制和初始化。

  3. 主机按一定频率向从机发送心跳包,保证连接

  4. 进入平稳期后,master会依次将修改同步到每一个slave

  5. 引申出 offset ,存储在 backlog 里面。
    master 和 slave 都会复制一个 offset 和 masterid 。offset 就想象成每条数据的下标索引,每同步一次就会复制一次。master 会将已经复制的 offset 后面的复制给 slave ,类似于断点续传。

第五点不好懂,看gpt的解释更好理解一些:

也就是说主机会根据从机下线时间来判断如何进行同步,如果时间短则将下线期间产生的数据传给从机,也就是断点续传

弊端 

主从复制的弊端其实很明显:

  1. 主机宕机,不会自动从从机中选出一个主机
  2. 从机越多,复制延迟越高,同步速率也越来越慢
  3. 存在性能瓶颈,写性能无法扩展