保姆级教程:Redis 主从复制原理及集群搭建
什么是 Redis 主从复制
简而言之就是一个节点负责写数据(主节点),其他节点负责读数据(从节点),采用负载均衡的集群方式,实现读写分离,更好的解决并发问题。
Redis 主从集群搭建
因为单节点 Redis 的并发能力是有上限的,要进一步提高 Redis 的并发能力,就需要搭建主从集群,实现读写分离。本篇实例架构图如下图所示:
一个主节点,两个从节点,我们现在 tmp 文件下创建三个文件夹,分别是 6001、6002、6003,文件名也就是我们 redis 服务的端口号,可自行随意定义。
如果你本地已经安装了 Redis,需要拷贝 Redis 的配置文件到上述三个文件夹下,我本地的 Redis 的配置文件在/usr/local/etc/redis.conf
,当然也可以一键拷贝,
拷贝完成之后,需要分别修改配置文件中的以下内容:
(1)修改端口号
找到配置文件中port 6379
,分别修改为port 6001
,port 6002
,port 6003
当然也可以一键修改
(2)修改工作目录
找到配置文件中的dir .
目录,修改为dir /temp/6001
(3)声明 IP 地址
我们在每个配置文件中第一行写入 replica-announce-ip "127.0.0.1"
,其中127.0.0.1
,你可以换成你本地 IP 地址,本行表示配置分布式系统或网络中的某个节点或副本的 IP 地址。
接下来,我们要开启主从配置,
主从配置可使用replicaof
或者slaveof
命令,
主从关系有两种模式,临时模式和永久模式
永久生效
在 redis.conf 中添加配置:slaveof<masterip> <masterport>
临时模式
使用 redis-cli 客户端连接到 redis 服务,执行 slaveof
或者 replicaof
命令(重启后生效)
slaveof<masterip> <masterport>
在本篇文章中我们采用临时模式
第一步:启动 Redis server 服务
开启三个命令窗口,分别执行以下命令
我们选择 6001 端口节点作为 master 节点,开启命令行窗口,连接 redis 服务,
此时我们在 master 节点中进行写数据
至此,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 哨兵相关文章。
版权声明: 本文为 InfoQ 作者【小曾同学.com】的原创文章。
原文链接:【http://xie.infoq.cn/article/bc8684a895db4a5e2e22b44d0】。文章转载请联系作者。
评论