写点什么

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

  • 2024-06-04
    上海
  • 本文字数:1928 字

    阅读完需:约 6 分钟

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

什么是 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,当然也可以一键拷贝,

➜  tmp echo 6001 6002 6003 | xargs -t -n 1 cp /usr/local/etc/redis.conf
复制代码

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

(1)修改端口号

找到配置文件中port 6379 ,分别修改为port 6001port 6002port 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<masterip> <masterport>

  • 临时模式

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

slaveof<masterip> <masterport>

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

第一步:启动 Redis server 服务

开启三个命令窗口,分别执行以下命令

redis-server 6001/redis.confredis-server 6002/redis.confredis-server 6003/redis.conf
复制代码

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

#命令行窗口1➜  ~ redis-cli -p 6002127.0.0.1:6002>replicaof 127.0.0.1 6001# 表示6001节点作为6002的master节点#命令行窗口2➜  ~ redis-cli -p 6003127.0.0.1:6003>replicaof 127.0.0.1 6001# 表示6001节点作为6003的master节点
# 建立主从关系后,可以进入6001客户端进行查看#命令行窗口3➜ ~ redis-cli -p 6001127.0.0.1:6001>info replication# 详细结果如下图,展示了当前节点为master节点,绑定了两个从节点,两个从节点均在线状态
复制代码


此时我们在 master 节点中进行写数据

# 在主节点写入127.0.0.1:6001>set num 123456OK
#在从节点获取值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 主从集群就搭建完毕了。接下来我们来聊聊主从间数据是如何同步的。

数据同步原理

全量同步

主从第一次同步称为全量同步,那么 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 才可以判断到底需要同步哪些数据。

全量同步流程可以概括为以下流程:

  • slave 节点请求增量同步

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

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

  • slave 清空本地数据,加载 master 的 RDB

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

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

(上图中左图是从节点 slave,右图是 master 节点)

增量同步

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

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

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

发布于: 22 分钟前阅读数: 6
用户头像

出来乍到的程序猿,有一颗成为IT精英的梦想 2020-08-28 加入

座右铭:不想当开发的测试,不是一个好测试✌️。 我是一个致力于测试开发的博主,主要职责:测试开发、CI/CD,偶尔跟着开发学习音视频知识,希望输出的内容可以帮助和我一样初入职场,经验不足的小白。

评论

发布
暂无评论
保姆级教程:Redis主从复制原理及集群搭建_redis主从_小曾同学.com_InfoQ写作社区