Redis复制(replica)主从模式

Redis主从复制

Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master) ,而通过复制创建出来的服务器复制品则为从服务器(slave) 。 只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步给从服务器 ,从而一直保证主从服务器的数据相同。

一句话:就是主从复制,master以写为主,slave以读为主。当master数据变化的时候,自动将新的数据异步同步 到其他slavve数据库。
主从复制的作用

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

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

docker-compose.yml的配置信息

bash 复制代码
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环境

bash 复制代码
docker exec -it redis-master redis-cli -a root

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

bash 复制代码
 docker exec -it redis-slave1 redis-cli -a root

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

bash 复制代码
info replication

主节点的信息

从节点的信息

主从同步的演示,在主节点上写入值,从节点可以读取到相关的值

主节点写入值:

从节点读取值


从节点可以执行写命令么?

从节点不可以写

bash 复制代码
(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 集群架构

相关推荐
Hello.Reader23 分钟前
Redis 延迟监控深度指南
数据库·redis·缓存
ybq1951334543124 分钟前
Redis-主从复制-分布式系统
java·数据库·redis
马里奥Marioぅ30 分钟前
Redis主从切换踩坑记:当Redisson遇上分布式锁的“死亡连接“
redis·分布式锁·redisson·故障转移
好奇的菜鸟3 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
tan180°3 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
满昕欢喜4 小时前
SQL Server从入门到项目实践(超值版)读书笔记 20
数据库·sql·sqlserver
Hello.Reader5 小时前
Redis 延迟排查与优化全攻略
数据库·redis·缓存
简佐义的博客6 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang
爬山算法6 小时前
MySQL(116)如何监控负载均衡状态?
数据库·mysql·负载均衡
老纪的技术唠嗑局8 小时前
OceanBase PoC 经验总结(二)—— AP 业务
数据库