Redis Cluster搭建部署详解
依据 Redis Cluster 内部故障转移实现原理,Redis 集群至少需要 3 个主节点,而每个主节点至少有 1 从节点,因此搭建一个集群至少包含 6 个节点,三主三从,并且分别部署在不同机器上。
条件有限,测试环境下我们只能在一台机器上创建一个伪集群,通过不同的 TCP 端口启动多个 Redis 实例,组成集群。
目前 Redis Cluster 的搭建有两种方式:
自动方式搭建,即使用官方提供的集群管理工具快速搭建。
手动方式搭建,即手动执行 cluster 命令,一步步完成搭建流程。
两种方式原理一样,自动搭建方式只是将手动搭建方式中需要执行的 Redis 命令封装到了可执行程序。生产环境下推荐使用自动方式,简单快捷,不易出错。
手动方式搭建
启动节点
规划如下:
节点编号 | TCP端口 | 节点类型 | 从节点 |
11 | 7001 | 主 | 21 |
12 | 7002 | 主 | 22 |
13 | 7003 | 主 | 23 |
21 | 8001 | 从 | / |
22 | 8002 | 从 | / |
23 | 8003 | 从 | / |
准备配置文件
进入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集群完成。