Redis In Action —— Advanced —— 数据主从同步原理 —— 全量同步 与 增量同步 工作流程及原理 —— 以及如何利用 docker 容器技术快速模拟单机 Redis 集群

📖 Redis 主从集群架构

搭建 Redis 主从集群

在这里插入图片描述

这里采用的是单台虚拟机上利用 docker 容器技术 进行模拟集群搭建工作

📑 安装 Docker

官方网站:Home - Docker

官方Docker hub: Docker Hub

Docker 官方文档:Docker Documentation | Docker Documentation

什么是docker?

在这里插入图片描述

虚拟化容器的技术,Docker基于镜像,可以秒级启动各种容器每一种容器都是一个完整的运行环境,容器之间互相隔离。

步骤1:卸载系统之前存在的docker

# 卸载系统之前存在的 docker
$ sudo yum remove docker \
  docker-client \
  docker-client-latest \
  docker-common \
  docker-latest \
  docker-latest-logrotate \
  docker-logrotate \
  docker-engine

步骤2:设置 docker 镜像地址

📚 安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

# 安装docker所必需的依赖的软件 如 yum-utils 以及 device mapper 依赖的 device-mapper-persistent-data 和 lvm2
$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

📚 设置对应的下载镜像路径,可以选取国内的仓库地址

# 设置镜像仓库地址
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
# 设置采用 阿里云的镜像仓库地址
$ sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 设置采用 清华大学的镜像仓库地址
$ sudo yum-config-manager \
    --add-repo \
    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

步骤三:安装 docker

# 安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:
$ sudo yum install docker-ce docker-ce-cli containerd.io

📚 注意点:有多个 Docker 仓库吗?

如果启用了多个 Docker 仓库,则在未在 yum install 或 yum update 命令中指定版本的情况下,进行的安装或更新将始终安装最高版本,这可能不适合您的稳定性需求。

# 列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。
$ yum list docker-ce --showduplicates | sort -r

通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。

# 安装指定版本的 docker-ce 以及 docker-ce-cli 和 containerd.io
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

步骤四:启动 docker

$ sudo systemctl start docker
$ docker -v # 显示当前 docker 的版本
Docker version 20.10.17, build 108c701
# 查看当前 docker 镜像
$ sudo docker images
# 开机自动启动 docker
$ sudo systemctl enable docker

步骤五:配置阿里云的docker容器镜像服务

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

在这里插入图片描述

# 创建 配置的 docker 目录
$ sudo mkdir -p /etc/docker
# 配置 docker 镜像
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
# 守护进程重新加载
sudo systemctl daemon-reload
# 重启 docker 服务
sudo systemctl restart docker

📑 通过 Docker 配置模拟 Redis 集群

步骤一:通过docker拉取redis镜像

$ sudo docker pull redis

步骤二:创建实例并启动

# 在linux虚拟机系统中创建对应的容器中镜像redis映射的目录
$ sudo mkdir -r /mydata/redis/192.168.56.7001
$ sudo mkdir -r /mydata/redis/192.168.56.7002
$ sudo mkdir -r /mydata/redis/192.168.56.7003
# 创建映射 redis.conf 的配置文件 
$ sudo touch /mydata/redis/192.168.56.7001/redis.conf
$ sudo touch /mydata/redis/192.168.56.7002/redis.conf
$ sudo touch /mydata/redis/192.168.56.7003/redis.conf

# 创建镜像实例 并且挂载映射位置
$ sudo docker run -p 7001:6379 --name redis7001 \
-v /mydata/redis/192.168.56.7001/redis.conf:/etc/redis/redis.conf \
-v /mydata/redis/192.168.56.7001:/data \
-d redis redis-server /etc/redis/redis.conf
# 重复上述操作将对应的 7001 改变为 7002 、7003

步骤三:测试连接 redis-cli

# 查看当前运行的 docker 容器镜像实例
$ sudo docker ps 
# 登录到 redis-cli 测试
$ sudo docker exec -it redis7001 redis-cli
# 配置作为 192.168.56.103:6379 redis 服务器的从机
127.0.0.1:6379> SLAVEOF 192.168.56.103 6379
OK
127.0.0.1:6379> INFO replication

步骤四:通过映射挂载目录配置持久化Redis

$ vim /mydata/redis/192.168.56.7001/redis.conf

# 配置完成之后 重启docker 容器中 redis镜像实例
$ sudo docker restart redis 

# 通过查看 当前 运行的docker 容器中的镜像实例 检验是否重启成功
$ sudo docker ps

/mydata/redis/192.168.56.7001/redis.conf

appendonly yes

如果需要对 redis 进行配置可以查看相关文档进行客制化配置

Documentation | Redis

https://raw.githubusercontent.com/redis/redis/6.2/redis.conf

⭐ 数据同步原理 —— 全量同步

在这里插入图片描述

主从第一次同步 —— 全量同步

1️⃣ 第一阶段

  • 首先从机执行 REPLICAOF 命令建立连接

  • 此时从机 Slave 会向主机 Master 请求数据同步

  • 主机判断当前从机是否是第一次数据同步,并将自身的数据版本信息发送给从机 Slave

  • Slave 此时会保存版本信息

2️⃣ 第二阶段

  • 主机此时会执行 bgsave 命令,生成 RDB 文件,并且此时一部记录 RDB期间的所有命令到 repl_baklog 的内存缓冲区里。
  • 随后主机会将 RDB 文件进行发送
  • 从机接收到主机发来的 RDB 文件首先会清除本地数据,然后加载 RDB 文件

3️⃣ 第三阶段

  • 主机将 repl_baklog 中的命令发送给从机
  • 从机执行接收到的命令

在这里插入图片描述

在这里插入图片描述

📚 小结

请简述一下全量同步的流程?

  • Slave 节点请求增量同步
  • Master 节点判断 replId,发现不一致就拒绝增量同步
  • Master 将完整的内存数据生成 RDB ,发送 RDB 到 Slave 中
  • Slave 清除本地数据,加载 Master 中的 RDB
  • Master 将 RDB 期间的命令记录在 repl_baklog ,并且持续将 log 中的命令发送给 Slave
  • Slave 执行接收到的命令,保持与 Master 之间的同步

⭐ 数据同步原理 —— 增量同步

数据同步 —— 增量同步

在这里插入图片描述

如何优化 Redis 主从集群

在这里插入图片描述

📚 小结

1️⃣ 请简述全量同步与增量同步的区别?

  • 全量同步:master 将 完整的内存数据生成 RDB ,发送 RDB 到 Slave 。后续命令则记录在 repl_baklog ,逐个发送给 Slave。
  • 增量同步:Slave 提交自己的 offset 到 master ,master 获取 repl_baklog 中从 offset 之后的命令给 slave

2️⃣ 什么时候会执行全量同步?

  • Slave 节点第一次连接 Master 节点时
  • Slave 节点断开时间太久,repl_baklog 中的 offset 已经被覆盖时

3️⃣ 什么时候会执行增量同步?

  • Slave 节点断开又恢复,并且在 repl_baklog 中能找到 offset 时
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Alascanfu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值