【Redis】主从复制和哨兵模式

主从复制

主从复制:主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主

【Redis】主从复制和哨兵模式_第1张图片

作用:

  • 读写分离,性能扩展
  • 容灾快速恢复

主从复制的配置

在我的/myredis目录中,存在redis.conf配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LcJw1p1j-1671250147140)(https://pg3993-1311808981.cos.ap-nanjing.myqcloud.com/img/image-20221216112825444.png)]

接下来配置一个主机两个从机

第一步:

配置三个不同的redis配置文件;三台服务器对应的端口号,dump文件等信息要不同。

三台服务器对应的端口号分别是:6379,6380,6381

【Redis】主从复制和哨兵模式_第2张图片

第二步:

启动三台服务器

使用命令:redis-server 配置文件 启动redis服务器

【Redis】主从复制和哨兵模式_第3张图片

第三步:

客户端连接服务器

使用命令 :redis-cli -p port 连接redis服务器

【Redis】主从复制和哨兵模式_第4张图片

使用info replication命令查看当前服务器状和各种消息

【Redis】主从复制和哨兵模式_第5张图片

目前每台服务器都是主服务器,没有从服务器。

一主二从配置实例

下面将6379redis服务器作为主服务器,6380和6381服务器作为从服务器。

只需要在6380和6381服务器上执行命令: slaveof ip port 挂载主服务器

【Redis】主从复制和哨兵模式_第6张图片

在主服务器上写入数据,观察从服务器的数据变化

【Redis】主从复制和哨兵模式_第7张图片

主服务器在执行命令后,从服务器的数据也会相应的发生改变。

从机无法进行写操作,只能执行读操作。

【Redis】主从复制和哨兵模式_第8张图片

当我们在从机上进行写操作时,从机会报错。

主机宕机的现象

当主机宕机,三个服务器会有什么现象?

【Redis】主从复制和哨兵模式_第9张图片

当主机宕机后,从服务器会等待主服务器的重新连接。

从服务器挂掉的现象

在从服务器6380上执行shutdown命令。

【Redis】主从复制和哨兵模式_第10张图片

从服务挂掉后,需要重新执行slaveof ip port命令挂载主服务器。

【Redis】主从复制和哨兵模式_第11张图片

薪火相传和反客为主机制

上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险。

【Redis】主从复制和哨兵模式_第12张图片

特点:

  • 中途变更转向:会清除之前的数据,重新建立拷贝最新的
  • 风险是一旦某个slave宕机,后面的slave都没法备份
  • 主机挂了,从机还是从机,无法写数据了

下面我们将6381服务器配置为6380服务器的从机

【Redis】主从复制和哨兵模式_第13张图片

反客为主机制:

当6379服务器挂掉后。可以使用命令slaveof no one 让从机6380会成为主服务器:

【Redis】主从复制和哨兵模式_第14张图片

主从复制的原理

主从服务器间第一次同步的过程分为三个阶段:

  • 第一阶段:建立链接,协商同步;
  • 第二阶段:主服务器同步数据给从服务器;
  • 第三阶段:主服务器发送新写操作命令给服务器

【Redis】主从复制和哨兵模式_第15张图片

第一阶段

建立链接,协商同步。

从服务器执行slaveof ip port命令后,向主服务器发送psync命令,请求同步。psync包含两个参数:主服务器runID和复制进度offset。这两个参数是传入类型参数

  • runID,每个 Redis 服务器在启动时都会自动生产一个随机的 ID 来唯一标识自己。当从服务器和主服务器第一次同步时,因为不知道主服务器的 run ID,所以将其设置为 “?”。
  • offset,表示复制的进度,第一次同步时,其值为 -1。

主服务器收到psync命令后,向从服务器发送FULLRESYNC 作为响应命令返回给从服务器。该响应命令会传递两个参数:主服务器的 runID 和主服务器目前的复制进度 offset。从服务器收到响应后,会记录这两个值。

FULLRESYNC 响应命令的意图是采用全量复制的方式,主服务器会把所有的数据都同步给从服务器

第二阶段

主服务器同步数据给从服务器

服务器会执行 bgsave 命令来生成 RDB 文件,然后把文件发送给从服务器。从服务器收到 RDB 文件后,会先清空当前的数据,然后载入 RDB 文件。

第三阶段

同步主服务器的命令到从服务器中。

在主服务器生成的 RDB 文件发送完,从服务器收到 RDB 文件后,丢弃所有旧数据,将 RDB 数据载入到内存。完成 RDB 的载入后,会回复一个确认消息给主服务器。至此,第一次同步工作结束。

第一次同步结束后,主从服务器之间会建立一个TCP连接

【Redis】主从复制和哨兵模式_第16张图片

后续主服务器可以通过这个连接继续将写操作命令传播给从服务器,然后从服务器执行该命令,使得与主服务器的数据库状态相同。

哨兵模式

哨兵模式:反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

【Redis】主从复制和哨兵模式_第17张图片

配置实例

先让6379redis服务器成为主服务器,6380和6381成为6379的从服务器。

第一步:

创建一个sentinel.conf文件(文件名不能出错);在文件中填写相关的配置内容:

sentinel monitor 主服务器名 主服务器ip 主服务器port n

  • 这里的n表示,至少有n个哨兵同意迁移的数量

【Redis】主从复制和哨兵模式_第18张图片

第二步:

执行命令:redis-sentinel 配置文件路径

该命令作用是启动哨兵服务器

redis-sentinel sentinel.conf

【Redis】主从复制和哨兵模式_第19张图片

第三步:

测试:让主服务器6379shutdown,查看6380和6381的情况。

【Redis】主从复制和哨兵模式_第20张图片

6379服务器挂掉后,6381按照一定的规则成为了新的服务器;选举主服务器的规则在原理一节中将会详细讲解。

哨兵模式的问题:

  • 复制延时:由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

你可能感兴趣的:(中间件,redis,数据库)