😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍
文章目录
- 一 什么是 Redis 主从复制❓
- 二 Redis 主从集群搭建👊
- 三 数据同步原理🙏
- 3.1 全量同步✨
- 3.2 增量同步 ✨
一 什么是 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 哨兵相关文章。