当前位置:首页 > 说编程 > 正文内容

Redis Cluster搭建部署详解

2022-09-23说编程504

依据 Redis Cluster 内部故障转移实现原理,Redis 集群至少需要 3 个主节点,而每个主节点至少有 1 从节点,因此搭建一个集群至少包含 6 个节点,三主三从,并且分别部署在不同机器上。

条件有限,测试环境下我们只能在一台机器上创建一个伪集群,通过不同的 TCP 端口启动多个 Redis 实例,组成集群。

目前 Redis Cluster 的搭建有两种方式:

  • 自动方式搭建,即使用官方提供的集群管理工具快速搭建。

  • 手动方式搭建,即手动执行 cluster 命令,一步步完成搭建流程。

两种方式原理一样,自动搭建方式只是将手动搭建方式中需要执行的 Redis 命令封装到了可执行程序。生产环境下推荐使用自动方式,简单快捷,不易出错。

手动方式搭建

启动节点

规划如下:

节点编号TCP端口节点类型从节点
11700121
12700222
13700323
218001/
228002/
238003/

准备配置文件

进入redis源码包目录并将默认配置文件redis.conf分别复制到六个节点配置存放目录中,作为各自节点启动配置文件。

然后分别修改每个节点的配置文件。下面是节点11的配置文件:/usr/local/redis/conf/redis-7001.conf,其他类似。

bind 127.0.0.1                    # 设置当前节点主机地址
port 7001                              # 设置客户端连接监听端口
pidfile /var/run/redis_7001.pid        # 设置 Redis 实例 pid 文件
daemonize yes                          # 以守护进程运行 Redis 实例
cluster-enabled yes                    # 启用集群模式
cluster-node-timeout 15000             # 设置当前节点连接超时毫秒数
cluster-config-file nodes-7001.conf    # 设置当前节点集群配置文件路径

启动服务

完成后可以通过如下命令启动集群中六个节点

/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-7001.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-8001.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-7002.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-8002.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-7003.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-8003.conf

最后可以通过如下命令查看各节点进程是否正常运行

ps -ef|grep redis

节点握手

虽然上面6个节点都启用了集群支持,但默认情况下他们互不信任没有联系。节点握手就是在各个节点之间创建链接(每个节点与其他节点相连),形成一个完整的网格,即集群。

为了创建集群,不需要发送形成完整网格所需的所有 cluster meet 命令。只要能发送足够的cluster meet消息,可以让每个节点都可以通过一系列已知节点到达每个其他节点,缺失的链接将被自动创建。

例如,如果我们通过cluster meet将节点 A 与节点 B 连接起来,并将 B 与 C 连接起来,则 A 和 C 会自己找到握手方式并创建链接。

我们创建的 6 个节点可以通过 redis-cli 连接到 A 节点执行如下五组命令完成握手,生产环境需要将 IP 127.0.0.1替换成实际 IP。

cluster meet 127.0.0.1 7002
cluster meet 127.0.0.1 7003
cluster meet 127.0.0.1 8001
cluster meet 127.0.0.1 8002
cluster meet 127.0.0.1 8003

然后可以通过如下命令在各节点上查看节点之间的链接状态。

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7002 cluster nodes

分配槽位

此时 Redis 集群还并没有处于上线状态,可以在任意一节点上执行 cluster info 命令来查看目前集群的运行状态。

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7001 cluster info

上面命令会输出:cluster_state:fail。表示当前集群处于下线状态。因为只有给集群中所有主节点分配好槽位(即哈希槽slot)集群才能上线。

根据预先规划,这一步需要使用 cluster addslots 命令手动将 16384 个哈希槽大致均等分配给主节点 11、12、13。

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7001 cluster addslots {0..5461}
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7002 cluster addslots {5462..10922}
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7003 cluster addslots {10923..16383}

上述命令执行完毕,可以再次查看集群的运行状态,应该为正常上线。

主从复制

Redis 集群成功上线,不过还没有给主节点指定从节点,此时如果有一个节点故障,那么整个集群也就挂了,也就无法实现高可用。

集群中需要使用 cluster replicate 命令手动给从节点配置主节点。

集群中各个节点的node-id可以用cluster nodes命令查看,如下输出1b4b3741945d7fed472a1324aaaa6acaa1843ccb即是主节点 12 的node-id

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 8002 cluster nodes
1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552220700255 1 connected
ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220703281 0 connected
19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220700000 2 connected
a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 myself,master - 0 1552220701000 5 connected
61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220702275 4 connected
51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220701265 3 connected

根据预先规划,11主21从;12主22从;13主23从。执行如下三组命令分别为从节点 21、22、23 指定其主节点,使集群可以自动完成主从复制。

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 8001 cluster replicate 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 8002 cluster replicate 1b4b3741945d7fed472a1324aaaa6acaa1843ccb
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 8003 cluster replicate 19147f56e679767bcebb8653262ff7f56ca072a8

至此,我们便完成了通过手动方式搭建一个redis集群。

自动方式搭建

Redis 3.0 版本之后官方发布了一个集群管理工具 redis-trib.rb,集成在 Redis 源码包的src目录下。其封装了 Redis 提供的集群命令,使用简单、便捷。

不过 redis-trib.rb 是 Redis 作者使用 Ruby 语言开发的,故使用该工具之前还需要先在机器上安装 Ruby 环境。后面作者可能意识到这个问题,Redis 5.0 版本开始便把这个工具集成到 redis-cli 中,以--cluster参数提供使用,其中create命令可以用来创建集群。

启动节点

使用集群管理工具搭建集群之前,也是需要先把各个节点启动起来的。节点的启动方式请参见本文「手动方式创建」-「启动节点」一节,此处不再赘述。

集群管理工具搭建

如果您安装的 Redis 是 3.x 和 4.x 的版本可以使用 redis-trib.rb 搭建,不过之前需要安装 Ruby 环境。

先使用 yum 安装 Ruby 环境以及其他依赖项。

yum -y install ruby ruby-devel rubygems rpm-build

确认安装版本。

ruby -v

再使用 redis-trib.rb 脚本搭建集群,具体命令如下所示。

/usr/local/redis-5.0.3/src/redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003

不过,本文实验环境使用的 Redis 版本是 5.0.3,所以我可以直接使用redis-cli --cluster create命令搭建,具体命令如下所示。

/usr/local/redis/bin/redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 --cluster-replicas 1

主节点在前,从节点在后。其中--cluster-replicas参数用来指定一个主节点带有的从节点个数,如上--cluster-replicas 1即表示 1 个主节点有 1 个从节点。

命令执行成功即可。

至此,通过自动方式搭建redis集群完成。


扫描二维码推送至手机访问。

本站内容仅供学习研究,转载请以链接形式注明,如有侵犯请联系处理。

本文链接:https://suyu.net/post/103.html

分享给朋友:

发表评论

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。