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

本文详细介绍了主从复制在Redis中的实现、配置步骤、作用,包括读写分离、容灾恢复和哨兵模式。还涵盖了主从复制的工作原理、实例演示和常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主从复制

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

image-20221216110153613

作用:

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

主从复制的配置

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

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

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

第一步:

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

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

image-20221216115503204

第二步:

启动三台服务器

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

image-20221216120141496

第三步:

客户端连接服务器

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

image-20221216170539365

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

image-20221216170704023

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

一主二从配置实例

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

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

image-20221216171233161

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

image-20221216171442608

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

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

image-20221216171632094

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

主机宕机的现象

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

image-20221216171928579

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

从服务器挂掉的现象

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

image-20221216172250391

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

image-20221216172642751

薪火相传和反客为主机制

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

image-20221216174255419

特点:

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

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

image-20221216175510349

反客为主机制:

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

image-20221216175827316

主从复制的原理

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

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

image-20221217114132183

第一阶段

建立链接,协商同步。

从服务器执行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连接

image-20221217115324059

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

哨兵模式

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

image-20221216180052985

配置实例

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

第一步:

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

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

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

image-20221216180718309

第二步:

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

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

redis-sentinel sentinel.conf

image-20221216181104314

第三步:

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

image-20221216181252011

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

哨兵模式的问题:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影中人lx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值