Redis复制(replica)主从模式

Redis主从复制

在这里插入图片描述

在这里插入图片描述
Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。 只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步给从服务器,从而一直保证主从服务器的数据相同。
一句话:就是主从复制,master以写为主,slave以读为主。当master数据变化的时候,自动将新的数据异步同步到其他slavve数据库。
主从复制的作用

  • 读写分离
  • 容灾恢复
  • 数据备份
  • 水平扩容支持高并发

利用docker搭建一主两从的redis集群

docker-compose.yml的配置信息

version: '3.8'
services:
  master:
    image: docker.1ms.run/library/redis:7.0.0
    container_name: redis-master
    ports:
      - "6379:6379"
    command: redis-server --protected-mode no --requirepass root  # 主节点密码
  slave1:
    image: docker.1ms.run/library/redis:7.0.0
    container_name: redis-slave1
    ports:
      - "6380:6379"
    command: 
      - redis-server 
      - --protected-mode no 
      - --replicaof redis-master 6379 
      - --masterauth root   # 从节点连接主节点的密码
      - --requirepass root  # 从节点自身的密码(可选,但建议与主节点一致)
  slave2:
    image: docker.1ms.run/library/redis:7.0.0
    container_name: redis-slave2
    ports:
      - "6381:6379"
    command: 
      - redis-server 
      - --protected-mode no 
      - --replicaof redis-master 6379 
      - --masterauth root 
      - --requirepass root

其中在每个从节点上需要配置master主节点的密码,–masterauth 的参数指定。以及–replicaof指定主节点的地址

docker-compose up -d启动后
在这里插入图片描述
在master主节点上执行以下命令进入主节点的redis环境

docker exec -it redis-master redis-cli -a root

在redis从节点上执行以下命令进入从节点的redis环境

 docker exec -it redis-slave1 redis-cli -a root

进入redis集群后,可以执行info replication的命令查看节点的状态信息

info replication

主节点的信息
在这里插入图片描述
从节点的信息在这里插入图片描述
主从同步的演示,在主节点上写入值,从节点可以读取到相关的值
主节点写入值:
在这里插入图片描述
从节点读取值
在这里插入图片描述
在这里插入图片描述
从节点可以执行写命令么?
从节点不可以写

(error) READONLY You can't write against a read only replica.

在这里插入图片描述
第三个节点挂了,前两个节点还是正常的,再往主机写入多个值,第三个节点然后再启动,数据会同步过来么?
第三个节点挂了
在这里插入图片描述
往第一个节点写入多个值
在这里插入图片描述
查看第二个节点的数据,数据正常同步
在这里插入图片描述
启动第三个节点
在这里插入图片描述
查看第三个节点的数据信息,数据正常同步过来
在这里插入图片描述
主节点shutdown后,从节点是否会上位?

在这里插入图片描述
读取从机的值,数据并没有丢,身份也没有变
在这里插入图片描述
在这里插入图片描述
主机shutdown后,重启后主从关系还在吗?从机还能否顺利复制?
在这里插入图片描述
主节点再设置值
在这里插入图片描述
从节点再去读取值
在这里插入图片描述
某台从机down后,master继续,从机重启后他能跟上大部队么?答:能
除了从配置文件的角度设置持久有效的主从关系外,还可以通过命令salveof 主机ip以及端口号指定主机的挂载,但是临时有效,当redis重启中,主从关系将不复存在。
薪火相传的架构演示
类似于爷爷->爸爸-> 儿子的主从关系
slaveof 新主库IP 新主库端口
在这里插入图片描述
第三个节点选取第二个节点作为master节点
在这里插入图片描述
第一个爷爷级别的主节点信息变化
在这里插入图片描述
第二个中间爸爸级别的节点信息变化
在这里插入图片描述
中间的爸爸节点,仅仅是数据的同步方向的指定,仍然不可以执行写入操作的
在这里插入图片描述

上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻主master的写压力。
中途变更转向:会清除之前的数据,重新建立拷贝最新的。
反客为主
使用命令: slaveof no one
在这里插入图片描述
写入数据
在这里插入图片描述
主从复制原理和工作流程

  • salve启动,同步初请(slave启动成功连接到master会发送一个sync命令,slave首次全新连接master,一次完全同步(全量复制)将被自动执行,slave自身原有数据会被master数据覆盖清除
  • 首次连接,全量复制(master节点收到sync命令后会开始在后台保存快照(即RDB持久化,主从复制时会触发RDB),同时收集所有接收到的用于修改数据集命令缓存起来,master节点执行RDB持久化完成后,master将RDB快照文件和所有缓存的命令发送到所有slave,以完成一次完全同步。而slave服务在接收到数据库文件后,将其存盘并加载到内存中,从而完成复制初始化)
  • 心跳持续,保持通信(master发出PING包的周期,默认10s。repl-ping-replica-period 10
  • 进入平稳,增量复制(master继续将新的所有收集到的修改命令自动依次传递给slave,完成同步)
  • 从机下线,重连续传(master会检查backlog里面的offset,master和slave都会保存一个复制的offset还有一个masterId,offset是保存在backlog中的Master只会把已复制的offset后面的数据复制给slave,类似断点续传

主从复制的缺点

  • 复制延时,信号衰减
    在这里插入图片描述

  • master挂了,如何办?(默认情况下,不会在slave节点中自动重选一个master,那每次人工选举?? 无人值守安装成为刚需 哨兵模式

参考视频
Redis 集群架构

### 如何在 Docker 中配置 Redis 主从复制 #### 创建必要的目录和文件 为了实现主从复制,需先创建用于挂载的目录以及相应的配置文件。对于主节点(端口6379),应建立如下路径并添加配置文件: ```bash mkdir -p /home/docker/redis6379/conf mkdir -p /home/docker/redis6379/data vi /home/docker/redis6379/conf/redis.conf ``` 同样地,针对从节点也需要执行相似的操作来准备环境[^2]。 #### 修改 `redis.conf` 文件 编辑 `/home/docker/redis6379/conf/redis.conf` 和对应的从节点配置文件,在其中指定 masterauth 密码、requirepass 密码以及其他必要参数以确保安全性和正常工作。例如: ```conf masterauth 123456 requirepass 123456 replicaof 172.17.0.2 6379 ``` 这里假设主服务器 IP 地址为 `172.17.0.2` 并监听默认端口 `6379`;而从机则会连接到这台主机来进行数据同步[^4]。 #### 使用 Docker Compose 设置服务 编写一个简单的 `docker-compose.yml` 来定义两个 Redis 实例之间的关系: ```yaml version: '3' services: redis-master: image: "redis:6.0.20" container_name: redis- "6379:6379" volumes: - "/home/docker/redis6379/conf:/usr/local/etc/redis" - "/home/docker/redis6379/data:/data" redis-replica: image: "redis:6.0.20" container_name: redis-replica environment: REDIS_REPLICAOF_HOST: "redis-master" REDIS_REPLICAOF_PORT: "6379" command: ["sh", "-c", "echo 'replicaof $$REDIS_REPLICAOF_HOST $$REDIS_REPLICAOF_PORT' | tee -a /usr/local/etc/redis/redis.conf && exec redis-server"] depends_on: - redis-master links: - redis-master ``` 此 YAML 定义了一个名为 `redis-master` 的主实例和服务名叫做 `redis-replica` 的副本实例,并通过链接使它们能够相互通信[^1]。 #### 测试主从状态 启动上述的服务之后可以进入任意一台机器内部查看其角色信息: 对于主节点而言, ```bash docker exec -a 123456 -c info replication ``` 而对于从节点来说,则可以通过命令验证是否成功成为跟随者: ```bash docker exec -it redis-replica redis-cli -p 6380 ``` 如果一切顺利的话,应该可以看到关于 slave 或 replica 的相关信息显示出来,表明已经建立了有效的主从关系[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值