Redis 快速集群环境搭建

Redis 快速集群环境搭建

环境

  • Linux :centos 7

  • redis:redis-5.0.9

Redis 集群环境搭建步骤

早期 redis 版本集群环境搭建需要安装 ruby 运行环境,搭建步骤比较繁琐; redis 5.x 版本集群搭建已不需要我们安装 ruby 就可以搭建成功,并且 redis 给我们提供了快速搭建集群脚本

步骤一:找到快速搭建 create-cluster 脚本
[root@dtinone create-cluster]# cd /opt/redis-5.0.9/utils/create-cluster

进入 create-cluster 目录后查看如下:

[root@dtinone create-cluster]# ll
总用量 8
-rwxrwxr-x. 1 root root 2344 4月 17 2020 create-cluster #这就是快速搭建集群脚本
-rw-rw-r--. 1 root root 1317 4月 17 2020 README

create-cluster 脚本提供以下几个命令:

  • start :创建redis集群实例
  • create :搭建redis集群
  • stop :停止redis集群实例
  • watch :查看集群节点
  • clean :删除生成的日志,配置,数据文件
  • clean-logs :只删除日志
步骤二:运行 create-cluste 脚本快速搭建集群环境
  • 运行 ./create-cluster start 命令脚本将自动为我们创建 6 个redis 进程实例(集群环境至少 6 个 redis 实例,3 master / 3 slave),而且自动为我们分配端口(30001-30006)
[root@dtinone create-cluster]# ./create-cluster start
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006
  • 运行 ./create-cluster create 命令脚本将自动搭建集群环境(分配 6 个 slot 并配置好 6 个 redis 实例的主从关系)

    redis 集群支持16384 个 slots,即最大支持 16384 个 redis 实例组成的集群环境)

    遇到以下提示信息,是询问你是否可以使用分配的配置,输入yes 回车即可

    Can I set the above configuration? (type 'yes' to accept): yes # 输入 yes 回车即可

[root@dtinone create-cluster]# ./create-cluster create
>>> Performing hash slots allocation on 6 nodes...
# 分配集群槽位
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383 # 分配主从关系
Adding replica 127.0.0.1:30005 to 127.0.0.1:30001
Adding replica 127.0.0.1:30006 to 127.0.0.1:30002
Adding replica 127.0.0.1:30004 to 127.0.0.1:30003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master # 显示槽位和主从关系
M: 68472ec54dba34b08cd6d4f987f8b97e5de00411 127.0.0.1:30001
slots:[0-5460] (5461 slots) master
M: a05be1b0ee3f33d0fdba1c4624484659df71ba9c 127.0.0.1:30002
slots:[5461-10922] (5462 slots) master
M: 4ebf676146947b59063b7474f3bf706e4319cc01 127.0.0.1:30003
slots:[10923-16383] (5461 slots) master
S: 3cb2dae684fb9fa7393cf7a7b8c6ee401db80f05 127.0.0.1:30004
replicates 68472ec54dba34b08cd6d4f987f8b97e5de00411
S: 41c6962bf0f80dcd3ccd07ec758a949b55938248 127.0.0.1:30005
replicates a05be1b0ee3f33d0fdba1c4624484659df71ba9c
S: bef3b70608bbae26f20b0de5915e7c2f521f18c3 127.0.0.1:30006
replicates 4ebf676146947b59063b7474f3bf706e4319cc01
Can I set the above configuration? (type 'yes' to accept): yes #输入yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 127.0.0.1:30001)
M: 68472ec54dba34b08cd6d4f987f8b97e5de00411 127.0.0.1:30001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: bef3b70608bbae26f20b0de5915e7c2f521f18c3 127.0.0.1:30006
slots: (0 slots) slave
replicates 4ebf676146947b59063b7474f3bf706e4319cc01
M: a05be1b0ee3f33d0fdba1c4624484659df71ba9c 127.0.0.1:30002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: 4ebf676146947b59063b7474f3bf706e4319cc01 127.0.0.1:30003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 41c6962bf0f80dcd3ccd07ec758a949b55938248 127.0.0.1:30005
slots: (0 slots) slave
replicates a05be1b0ee3f33d0fdba1c4624484659df71ba9c
S: 3cb2dae684fb9fa7393cf7a7b8c6ee401db80f05 127.0.0.1:30004
slots: (0 slots) slave
replicates 68472ec54dba34b08cd6d4f987f8b97e5de00411
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
主节点端口 槽位 从节点端口
30001 0-5460 30005
30002 5461-10922 30006
30003 10923 - 16383 30004
步骤三:查看进程
[root@dtinone create-cluster]# ps -ef | grep redis
[root@node-01 create-cluster]# ps -ef | grep redis
root 2392 1 0 17:14 ? 00:00:00 ../../src/redis-server *:30001 [cluster]
root 2394 1 0 17:14 ? 00:00:00 ../../src/redis-server *:30002 [cluster]
root 2402 1 0 17:14 ? 00:00:00 ../../src/redis-server *:30003 [cluster]
root 2404 1 0 17:14 ? 00:00:00 ../../src/redis-server *:30004 [cluster]
root 2409 1 0 17:14 ? 00:00:00 ../../src/redis-server *:30005 [cluster]
root 2417 1 0 17:14 ? 00:00:00 ../../src/redis-server *:30006 [cluster]
root 2431 1495 0 17:18 pts/0 00:00:00 grep --color=auto redis

说明已经创建了 6 个 redis 进程实例,端口号分别是 30001- 30006

步骤四:查看集群环境
[root@node-01 redis-5.0.9]# src/redis-cli -c -p 30001  # -c:表示连接的集群环境
127.0.0.1:30001> cluster nodes # 查看集群节点信息
127.0.0.1:30003@40003 master - 0 1615540917054 3 connected 10923-16383
127.0.0.1:30005@40005 slave 0 1615540917054 5 connected
127.0.0.1:30006@40006 slave 0 1615540917254 6 connected
127.0.0.1:30002@40002 master - 0 1615540917153 2 connected 5461-10922
127.0.0.1:30004@40004 slave 0 1615540916449 4 connected
127.0.0.1:30001@40001 myself,master - 0 1615540916000 1 connected 0-5460

集群中确实是 3 个主节点,3 个 从节点

步骤五:测试集群环境

向集群端口 30001 的主节点存储数据,如下:

127.0.0.1:30001> set name zhangsan
-> Redirected to slot [5798] located at 127.0.0.1:30002
OK
127.0.0.1:30002>

结果显示,数据存储到端口为 30002 的主节点。

原因是存储数据分配的槽位是 5798,30002主节点的槽位是 [5461-10922],所以应该存储到 30002 主节点上。

127.0.0.1:30002> get name
"zhangsan"

在 30002 主节点上确实可以查看数据。

步骤六:测试集群故障转移

为了触发故障转移,我们可以做的最简单的事情(也就是在分布式系统中可能出现的语义上最简单的故障)是使单个进程崩溃,如下:

[root@node-01 redis-5.0.9]# src/redis-cli -c -p 30001 debug segfault
Error: Server closed the connection

可以看到,端口号为 30001 的主节点被我们搞崩溃了,这时查看集群节点状态,如下

[root@node-01 redis-5.0.9]# src/redis-cli -c  -p 30002
127.0.0.1:30002> cluster nodes
127.0.0.1:30003@40003 master - 0 1615541662157 3 connected 10923-16383
127.0.0.1:30004@40004 slave 0 1615541661655 4 connected
127.0.0.1:30005@40005 master - 0 1615541661655 7 connected 0-5460 # 成为新的主节点
127.0.0.1:30002@40002 myself,master - 0 1615541662000 2 connected 5461-10922
127.0.0.1:30006@40006 slave 0 1615541661655 6 connected
127.0.0.1:30001@40001 master,fail - 1615541651480 1615541651077 1 disconnected

可以看到,端口 30001的主节点,显示为 fail,而它的从节点是端口 30005,现在已经切换为主节点,说明集群故障转移成功。

上一篇:Block入门


下一篇:SendMail如何签名