Redis的主从复制,哨兵模式

663 阅读4分钟

什么是主从复制

主从复制是指主机数据发生改变后,会根据主从复制策略将其同步到从机的master/slave机制。主从复制是读写分离的,其中主机负责写,从机负责读,从而减小了服务器的压力。其中主机只能有一台,从机可以有多台,目前常用的都是一主多从的模式。

主从复制的简单搭建

一般来说主从复制是在多个服务器上进行的,在每一台服务器上安装Redis,将其中选择其中一台服务器的Redis作为主,其他服务器上的Redis执行slaveof ip:port命令,其中ip和port为主服务器的ip和redis的端口号,若主服务器Redis设置了密码,则需要在redis配置文件中加上masterauth 主机redis密码。执行完此命令后,就可设置本机为ip和port对应主机的从机。对多个服务器上的Redis执行此命令,就算是搭建好了一主多从,执行info replication可以查看当前的主从信息。

一主多从的一些特点:

  • 当一主多从中的某一个或者多个从服务器挂掉后,当重启该服务器后,再次声明为主服务器的从服务器后,从服务器会存有主服务器的所有数据,包括挂掉期间的数据。
  • 一般来说如果没有做特定的配置,当主服务器挂掉之后,从服务器依旧是从服务器,不会升级为主服务器,而当主服务器重启后,依旧是主服务器。

主从复制的原理

1.当slave成功连接上master之后,会向master发送一个同步命令。 2.master在接收到同步命令之后,将存储的数据进行持久化操作,将其读到rdb文件中,同时接收正在到来的命令将其缓存在内存中,在rdb文件生成后,将rdb文件发送给从服务器,从服务器根据此文件完成一次数据完全同步。

  • 全量复制:从服务器拿到主服务器的rdb文件后,先清空自己当前的数据,再将rdb文件存到硬盘上将数据加载到自己的内存中,如果redis开启了aof,则会立即触发重写压缩机制。
  • 增量复制:当在进行全量复制时,如果master-slave的连接断掉,当master和slave重连时会触发增量复制,master会从自己的backlog中获取丢失的数据,将其发送给slave,master根据slave发送的同步命令中的offset来从logback中获取数据的。

薪火相传

上一个slave作为下一个slave的master,同时slave也可以接受其他slave的连接和同步请求,该模式可以减轻master的压力,去中心化降低风险。但是有一个缺点就是,当其中一个slave挂掉之后,在其后面的slave就无法同步master的数据了。

反客为主

当主从复制中的主机挂掉之后,在其后面的从机会升级为主机,不会影响后面slave的数据同步。使用slaveof no one将主机变为从机。

哨兵模式

在上面的反客为主中,当主服务器挂掉后,我们需要手动输入命令将从机升级为主机,而在真正的场景中发生意外时,手动操作很难做到及时处理,而哨兵模式就是反客为主的自动版。

创建哨兵

  • 首先在redis目录下面新建一个哨兵的配置文件sentinel.conf,名字绝对不能错。
  • 在sentinel.conf中添加对应的配置信息sentinel monitor mymaster ip port n,其中mymaster是我们为监视对象起的名字,ip和port则是对应我们要监视的对象,后面的n则是至少同意迁移的哨兵数量。

启动哨兵

  • redis-sentinel sentinel.conf 当主机挂掉之后,会根据优先级别选择从机:slave-priority,原主机重启后会变成从机。

具体过程: 1.当主机挂掉之后,从从机里选取一个成为新的主机,选取的条件依次为:选择优先级靠前的,选择偏移量最大的(指获得主机数据最全的),选择runid最小的从服务(每个redis实例启动后都会生成一个40位的runid),优先级在redis.conf中默认100,值越小优先级越高。 2.挑选出新的主机后,sentinel会给其他从机发送命令,让他们slaveof新的主机,同步新主机的数据。 3.当挂掉的原主机被重启后,sentinel会向其发送命令,让它成为新主机的从机。

  • 一般在实际项目中会设置多个哨兵,防止哨兵挂掉。

主从复制的缺点:

主从复制会导致复制延迟的问题,在master更新数据到slave同步master的数据时会有一定的延迟,当slave过多时会表现得更加严重