保姆级教程:Redis 主从复制原理及集群搭建

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

一 什么是 Redis 主从复制❓

简而言之就是一个节点负责写数据(主节点),其他节点负责读数据(从节点),采用负载均衡的集群方式,实现读写分离,更好的解决并发问题。

二 Redis 主从集群搭建👊

因为单节点 Redis 的并发能力是有上限的,要进一步提高 Redis 的并发能力,就需要搭建主从集群,实现读写分离。本篇实例架构图如下图所示:
在这里插入图片描述
一个主节点,两个从节点,我们现在 tmp 文件下创建三个文件夹,分别是 6001、6002、6003,文件名也就是我们 redis 服务的端口号,可自行随意定义。

➜  ~ mkdir tmp
➜  ~ cd tmp
➜  tmp mkdir 6001 6002 6003

如果你本地已经安装了 Redis,需要拷贝 Redis 的配置文件到上述三个文件夹下,我本地的 Redis 的配置文件在/usr/local/etc/redis.conf,当然也可以一键拷贝,

echo 6001 6002 6003 | xargs -t -n 1 cp /usr/local/etc/redis.conf

拷贝完成之后,需要分别修改配置文件中的以下内容:

(1)修改端口号

找到配置文件中port 6379 ,分别修改为port 6001,port 6002,port 6003

当然也可以一键修改

sed -i -e 's/6379/6001/g' 6001/redis.conf 
sed -i -e 's/6379/6002/g' 6002/redis.conf 
sed -i -e 's/6379/6003/g' 6003/redis.conf 

(2)修改工作目录

找到配置文件中的dir .目录,修改为dir /temp/6001

(3)声明 IP 地址

我们在每个配置文件中第一行写入 replica-announce-ip "127.0.0.1" ,其中127.0.0.1,你可以换成你本地 IP 地址,本行表示配置分布式系统或网络中的某个节点或副本的 IP 地址。

接下来,我们要开启主从配置

主从配置可使用replicaof或者slaveof命令,

replicaof <主机> <端口>
replicaof 127.0.0.1 6379
# 或者
slaveof <主机> <端口>
slaveof 127.0.0.1 6379

主从关系有两种模式,临时模式和永久模式

  • 永久模式

    在 redis.conf 中添加配置:slaveof

  • 临时模式

    使用 redis-cli 客户端连接到 redis 服务,执行 slaveof 或者 replicaof 命令(重启后生效)

slaveof<masterip> <masterport>

在本篇文章中我们采用临时模式

第一步:启动 Redis server 服务
开启三个命令窗口,分别执行以下命令

redis-server 6001/redis.conf
redis-server 6002/redis.conf
redis-server 6003/redis.conf

我们选择 6001 端口节点作为 master 节点,开启命令行窗口,连接 redis 服务,

#命令行窗口1
➜  ~ redis-cli -p 6002
127.0.0.1:6002>replicaof 127.0.0.1 6001
# 表示6001节点作为6002的master节点
#命令行窗口2
➜  ~ redis-cli -p 6003
127.0.0.1:6003>replicaof 127.0.0.1 6001
# 表示6001节点作为6003的master节点

# 建立主从关系后,可以进入6001客户端进行查看
#命令行窗口3
➜  ~ redis-cli -p 6001
127.0.0.1:6001>info replication

详细结果如下图,展示了当前节点为master节点,绑定了两个从节点,两个从节点均在线状态
在这里插入图片描述
此时我们在 master 节点中进行写数据

# 在主节点写入
127.0.0.1:6001>set num 123456
OK

#在从节点获取值
127.0.0.1:6002> get num
"123456"

127.0.0.1:6003>get num
"123456"

# 如果在从节点写入,则会报错
127.0.0.1:6002> set name zeng
(error) READONLY You can't write against a read only replica.

至此,Redis 主从集群就搭建完毕了。接下来我们来聊聊主从间数据是如何同步的

三 数据同步原理🙏

3.1 全量同步✨

主从第一次同步称为全量同步,那么 master 节点是如何判断从节点(slave)是第一次来同步数据的呢,这块有两个比较重要的概念:

  • Replication ld:简称 replid,是数据集的标记,id 一致则说明是同一数据集。每一个 master 都有唯一的 replid,slave 则会继承 master 节点的 replid

  • offset:偏移量,随着记录在 repl_baklog 中的数据增多而逐渐增大,slave 完成同步时也会记录当前同步的 offset。如果 slave 的 offset 小于 master 的 ofset,说明 slave 数据落后于 master,需要更新。

因此 slave 做数据同步,必须向 master 声明自己的 replication id 和 offset, master 才可以判断到底需要同步哪些数据。
在这里插入图片描述
全量同步流程可以概括为以下流程:

(1)slave 节点请求增量同步

(2)master 节点判断 replid,发现不一致,则拒绝增量同步

(3)master 将完整内存数据生成 RDB,发送 RDB 到 slave

(4)slave 清空本地数据,加载 master 的 RDB

(5) master 将 RDB 期间的命令记录在 repl_baklog,并持续将 log 中的命令发送给 slave

(6)slave 执行接收到的命令,保持与 master 之间的同步。

在这里插入图片描述
(上图中左图是从节点 slave,右图是 master 节点)

3.2 增量同步 ✨

主从第一次同步称为全量同步,但如果 slave 重启后同步,则执行增量同步。流程如下:

在这里插入图片描述

slave 提交自己的 offset 到 master,master 获取 repl_baklog 中从 offset 之后到命令给 slave。

思考🤔:slave 节点宕机恢复后可以找 master 节点同步数据,那么 master 节点宕机该怎么办呢?那么 Redis 哨兵就要闪耀登场了,请参考 Redis 哨兵相关文章。

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小曾同学.com

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

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

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

打赏作者

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

抵扣说明:

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

余额充值