本文通过图解的方式讲解redis集群的搭建流程。
-
讲解以3主3从的集群规模为例
-
假设有6台网络互通的机器(物理机、vm 或者docker 都可以), ip地址分别为: ip1, ip2, ip3 ,ip4, ip5, ip6。
redis集群搭建流程源码剖析可见: Redis 集群创建流程与源码实现剖析
1. 创建实例
以–cluster-enabled yes 模式启动6 个实例 。
# 在每台机器启动一个redis实例, 实例端口都是6379
$BIN_PATH/redis-server --port 6379 --cluster-enabled yes --daemonize yes #... 其它配置项
2. 集群拓扑配置规划
有了6个运行实例, 根据3主3从的集群要求,确定节点的主从关系和 数据(slot)的分布:
-
三个主节点分别为: ip1, ip3, ip5; 对应的从节点为: ip2, ip4, ip6
-
16384个slot分布: ip1负责 0~5460; ip3负责: 5461~10921; ip5负责: 10922~16383
分配原则
-
主节点尽量分配在不同机器节点上(尽量避免两个主节点在一台机器上部署, 提高可用性)
-
主从关系的节点尽量分配在不同机器节点上(尽量避免主从关系的节点在一台机器上部署, 提高可用性)
3. slot和config-epoch 配置
(主)节点slot 设置
对3个主节点分别调用cluster addslots命令设置其管理的slot
cluster addslots 0 1 2 3 ... 5460
节点config-epoch 设置
遍历6个实例, 设置不同的config-epoch值
cluster set-config-epoch 1 # 比如 ip1为1, ip2为2,ip3为3,依次递增
4. 节点互联
ip1握手其他节点
-
调用ip1 实例 cluster meet, 让ip1 主动与其它节点握手建立集群关系
cluster meet ip2 6379
-
ip1 执行meet 命令后, 会向ip2 发送meet消息包
-
ip2 收到ip1 的 meet消息包后向ip1返回pong消息包; 最后ip2也向ip1发送meet消息包进行握手;
-
ip1收到ip2的pong消息包后, ip1认为ip2是正常集群节点,握手成功。
-
ip1收到ip2 的meet消息包后向ip2返回pong消息包;
-
ip2收到ip1的pong消息包后, ip2认为ip1是正常集群节点,握手成功; 至此ip1, ip2 互相接纳对方为集群节点
-
p3~ip6节点与ip2类似,最终ip2~p6 都认为p1是同一集群节点; 反之ip1 也认为ip2~p6是同一集群节点; 通过以上流程, p1与集群其他节点建立了链接。
ip2~ip6节点之间互联
-
p1与所有节点握手成功后, p1 联通所有集群节点, ip2~p6 只联通p1
-
p1 定时 与集群其它节点 发ping/pong消息时,随机携带除自身外其他节点信息
-
其他节点比如p2, 收到p1的ping消息中其他节点信息p3; 认为p3是正常集群节点
-
p2 与 p3 主动建立链接并且发送ping消息, p3收到p2的ping消息,认为p2是正常集群节点; 至此p2和p3 互联成功。
-
其它节点的互联 与 p2跟p3 互联类似; 最终集群中每个节点都知道整个集群的拓扑, 集群最终互联。
5. 建立主从
在集群中,每个节点都有一个唯一的node-id。
调用主节点( ip2, ip4, ip6)cluster myid 或者各个主节点的node-id
cluster myid #NODE_ID分别为对应主节点的node-id
调用从节点( ip2, ip4, ip6)cluster replicate 建立对应主从关系
cluster replicate $NODE_ID #NODE_ID分别为对应主节点的node-id, 比如ip2主节点未ip1, 传ip1的node-id
至此,3主3从的集群搭建完毕,可以直接接收客户端访问。
原文始发于微信公众号(吃瓜技术派):图解-5步搭建高可用Redis Cluster
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/236009.html