手动搭建一个 Redis 集群

手动搭建一个 Redis 集群

Redis 集群一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群。

建立 6 个配置文件,并启动6个 redis 实例

  • 在 redis-conf 目录创建 Redis 配置文件 redis-6379.conf,配置内容如下
#节点端口
port 6379
# 开启集群模式
cluster-enabled yes
# 节点超市时间,单位毫秒
cluster-node-timeout 15000
# 集群内部配置文件
cluster-config-file "node-6379.conf"
  • 启动所有节点
redis-server redis-conf/redis-6379.conf
redis-server redis-conf/redis-6380.conf
redis-server redis-conf/redis-6381.conf
redis-server redis-conf/redis-6382.conf
redis-server redis-conf/redis-6383.conf
redis-server redis-conf/redis-6384.conf

请添加图片描述

我们启动了6个节点,但每个节点彼此并不知道对方的存在,下面通过节点握手彼此建立联系从而组成一个集群。

节点握手

节点握手是指一批运行在集群模式下的节点通过Gossip协议彼此通信,达到感知对方的过程。节点握手是集群彼此通
信的第一步,由客户端发起命令:cluster meet{ip}{port}。

  1. 在节点 6379 发起与 6380 的握手
➜  ~ redis-cli -p 6379
127.0.0.1:6379> cluster meet 127.0.0.1 6380
OK
127.0.0.1:6379> 

在 6379 节点,查看集群节点 cluster nodes

127.0.0.1:6379> cluster nodes
8ed60323879ada3f41a8828cb6005db4d4e80084 127.0.0.1:6380@16380 master - 0 1633400771811 0 connected
1e88e9d4a02ddf98f30c651893b508e77901a4e1 127.0.0.1:6379@16379 myself,master - 0 0 1 connected
127.0.0.1:6379> 

在 6380 节点,查看集群节点 cluster nodes

首先连接到 6380 节点,redis-cli -p 6380

➜  ~ redis-cli -p 6380
127.0.0.1:6380> cluster nodes
ERR This instance has cluster support disabled

然后 6380 节点出现了这个错误

  1. 在 6379 节点发起与 6381 节点的握手
127.0.0.1:6379> cluster meet 127.0.0.1 6381
OK
127.0.0.1:6379> cluster nodes
a1bcb17b56a69fce51ec04ebcf376a7d1cc51b29 127.0.0.1:6381@16381 master - 0 1633401235000 0 connected
8ed60323879ada3f41a8828cb6005db4d4e80084 127.0.0.1:6380@16380 master - 0 1633401235517 2 connected
1e88e9d4a02ddf98f30c651893b508e77901a4e1 127.0.0.1:6379@16379 myself,master - 0 1633401234000 1 connected
127.0.0.1:6379> 

在 6381 节点,查看集群节点数

➜  ~ redis-cli -p 6381
127.0.0.1:6381> cluster nodes
1e88e9d4a02ddf98f30c651893b508e77901a4e1 127.0.0.1:6379@16379 master - 0 1633401354000 1 connected
a1bcb17b56a69fce51ec04ebcf376a7d1cc51b29 127.0.0.1:6381@16381 myself,master - 0 1633401353000 0 connected
8ed60323879ada3f41a8828cb6005db4d4e80084 127.0.0.1:6380@16380 master - 0 1633401354317 2 connected
127.0.0.1:6381> 

这里,6381 节点正常,没有出现类似 6380 节点的异常。

  1. 在 6379 节点依次执行 meet 命令,让其他节点加入集群
127.0.0.1:6379> cluster meet 127.0.0.1 6382
OK
127.0.0.1:6379> cluster meet 127.0.0.1 6383
OK
127.0.0.1:6379> cluster meet 127.0.0.1 6384
OK
127.0.0.1:6379> 

在 6379 节点,查看节点数 cluster nodes

127.0.0.1:6379> cluster nodes
1e88e9d4a02ddf98f30c651893b508e77901a4e1 127.0.0.1:6379@16379 myself,master - 0 1633401625000 1 connected
d937c61a5eb8994b51b5b5514201db1325f91f96 127.0.0.1:6384@16384 master - 0 1633401627000 0 connected
8ed60323879ada3f41a8828cb6005db4d4e80084 127.0.0.1:6380@16380 master - 0 1633401627504 2 connected
a1bcb17b56a69fce51ec04ebcf376a7d1cc51b29 127.0.0.1:6381@16381 master - 0 1633401627000 5 connected
9c099f5368c71c229e64c3f69c190d4dcaf2460d 127.0.0.1:6383@16383 master - 0 1633401627000 4 connected
7e6b075ea194277f5b407530f1f201c01b8d7bb5 127.0.0.1:6382@16382 master - 0 1633401625453 3 connected
127.0.0.1:6379> 

在 6380 节点,查看节点数 cluster nodes

127.0.0.1:6380> cluster nodes
ERR This instance has cluster support disabled
127.0.0.1:6380> 

发现还报这个错,后面将 6380 节点redis 进程停止了。然后再通过 redis-cli -p 6380,发现还可以连接。那就是说明之前
以单例模式启动过了。

通过 ps -ef | grep redis 命令查一下 redis 相关的进程

➜  ~ ps -ef | grep redis
  501   579     1   0 三08下午 ??         0:38.60 /usr/local/opt/redis/bin/redis-server 127.0.0.1:6380
  501 29664 29632   0 10:11上午 ttys002    0:02.57 redis-server *:6381 [cluster]
  501 31584 27820   0 10:53上午 ttys007    0:00.01 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox redis
  501 29703 29671   0 10:11上午 ttys011    0:02.49 redis-server *:6382 [cluster]
  501 29538 28396   0 10:10上午 ttys012    0:02.77 redis-server *:6379 [cluster]
  501 31153 28427   0 10:22上午 ttys013    0:00.03 redis-cli -p 6379
  501 29740 29708   0 10:12上午 ttys014    0:02.49 redis-server *:6383 [cluster]
  501 29777 29745   0 10:12上午 ttys015    0:02.48 redis-server *:6384 [cluster]
  501 31330 31309   0 10:35上午 ttys018    0:00.01 redis-cli -p 6381
  501 31408 31387   0 10:41上午 ttys019    0:00.01 redis-cli -p 6382

发现确实有一个 501 579 1 0 三08下午 ?? 0:38.60 /usr/local/opt/redis/bin/redis-server 127.0.0.1:6380

通过 kill 579 将这个 redis server 停止。再通过 ps -ef | grep redis 查看一遍,发现已经被停止了。

➜  ~ kill 579
➜  ~ ps -ef | grep redis
  501 29664 29632   0 10:11上午 ttys002    0:02.97 redis-server *:6381 [cluster]
  501 31596 27820   0 10:55上午 ttys007    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox redis
  501 29703 29671   0 10:11上午 ttys011    0:02.90 redis-server *:6382 [cluster]
  501 29538 28396   0 10:10上午 ttys012    0:03.18 redis-server *:6379 [cluster]
  501 31153 28427   0 10:22上午 ttys013    0:00.03 redis-cli -p 6379
  501 29740 29708   0 10:12上午 ttys014    0:02.89 redis-server *:6383 [cluster]
  501 29777 29745   0 10:12上午 ttys015    0:02.88 redis-server *:6384 [cluster]
  501 31330 31309   0 10:35上午 ttys018    0:00.01 redis-cli -p 6381
  501 31408 31387   0 10:41上午 ttys019    0:00.01 redis-cli -p 6382
➜  ~=

重新启动 redis 6380,redis-server redis-conf/redis-6380.conf, 在 6379 节点将 6380 节点加入

127.0.0.1:6379> cluster meet 127.0.0.1 6380
OK

再次在 cluster 6380 查看 cluster nodes, 发现成功加入集群

127.0.0.1:6380> cluster nodes
9c099f5368c71c229e64c3f69c190d4dcaf2460d 127.0.0.1:6383@16383 master - 0 1633402763218 4 connected
7e6b075ea194277f5b407530f1f201c01b8d7bb5 127.0.0.1:6382@16382 master - 0 1633402763000 3 connected
8ed60323879ada3f41a8828cb6005db4d4e80084 127.0.0.1:6380@16380 myself,master - 0 1633402758000 2 connected
a1bcb17b56a69fce51ec04ebcf376a7d1cc51b29 127.0.0.1:6381@16381 master - 0 1633402765258 5 connected
d937c61a5eb8994b51b5b5514201db1325f91f96 127.0.0.1:6384@16384 master - 0 1633402764238 0 connected
1e88e9d4a02ddf98f30c651893b508e77901a4e1 127.0.0.1:6379@16379 master - 0 1633402762204 1 connected
127.0.0.1:6380> 

在 6381 节点,查看节点数 cluster nodes

127.0.0.1:6381> cluster nodes
9c099f5368c71c229e64c3f69c190d4dcaf2460d 127.0.0.1:6383@16383 master - 0 1633401796000 4 connected
a1bcb17b56a69fce51ec04ebcf376a7d1cc51b29 127.0.0.1:6381@16381 myself,master - 0 1633401792000 5 connected
1e88e9d4a02ddf98f30c651893b508e77901a4e1 127.0.0.1:6379@16379 master - 0 1633401795000 1 connected
7e6b075ea194277f5b407530f1f201c01b8d7bb5 127.0.0.1:6382@16382 master - 0 1633401796141 3 connected
d937c61a5eb8994b51b5b5514201db1325f91f96 127.0.0.1:6384@16384 master - 0 1633401797170 0 connected
8ed60323879ada3f41a8828cb6005db4d4e80084 127.0.0.1:6380@16380 master - 0 1633401795123 2 connected
127.0.0.1:6381> 

在 6382 节点,查看节点数 cluster nodes

➜  ~ redis-cli -p 6382
127.0.0.1:6382> cluster nodes
9c099f5368c71c229e64c3f69c190d4dcaf2460d 127.0.0.1:6383@16383 master - 0 1633401677523 4 connected
7e6b075ea194277f5b407530f1f201c01b8d7bb5 127.0.0.1:6382@16382 myself,master - 0 1633401678000 3 connected
1e88e9d4a02ddf98f30c651893b508e77901a4e1 127.0.0.1:6379@16379 master - 0 1633401680000 1 connected
d937c61a5eb8994b51b5b5514201db1325f91f96 127.0.0.1:6384@16384 master - 0 1633401678000 0 connected
a1bcb17b56a69fce51ec04ebcf376a7d1cc51b29 127.0.0.1:6381@16381 master - 0 1633401679000 5 connected
8ed60323879ada3f41a8828cb6005db4d4e80084 127.0.0.1:6380@16380 master - 0 1633401680588 2 connected
127.0.0.1:6382> 

节点建立握手后,集群还不能正常工作,这时集群处于下线状态,所有的数据读写命令都被禁止。通过以下命令可以看到。

127.0.0.1:6379> set hello redis
(error) CLUSTERDOWN Hash slot not served
127.0.0.1:6379> 

cluster info 命令,获取当前集群状态

127.0.0.1:6379> cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1368
cluster_stats_messages_pong_sent:1298
cluster_stats_messages_meet_sent:7
cluster_stats_messages_sent:2673
cluster_stats_messages_ping_received:1298
cluster_stats_messages_pong_received:1313
cluster_stats_messages_received:2611
127.0.0.1:6379> 

从输出内容可以看到,被分配的槽是 0,由于目前所有的槽没有分配到节点,因此集群无法完成槽到节点的映射。
只有当16384个槽全部分配给节点后,集群才进入在线状态。

分配槽

redis-cli -p 6379 cluster addslots {0..5461}
redis-cli -p 6380 cluster addslots {5462..10922}
redis-cli -p 6381 cluster addslots {10923..16383}
➜  Learning git:(master) ✗ redis-cli -p 6379 cluster addslots 0       
OK
➜  Learning git:(master) ✗ redis-cli -p 6379 cluster addslots 1
OK
➜  Learning git:(master) ✗ redis-cli -p 6379 cluster addslots 1
(error) ERR Slot 1 is already busy
➜  Learning git:(master) ✗ redis-cli -p 6379 cluster addslots {2..5461}
OK
➜  Learning git:(master) ✗ redis-cli -p 6380 cluster addslots {5462..10922}
OK
➜  Learning git:(master) ✗ redis-cli -p 6381 cluster addslots {10923..16383}
OK

分配完槽后,查看集群状态 cluster info

127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_ping_sent:7135
cluster_stats_messages_pong_sent:2806
cluster_stats_messages_meet_sent:9
cluster_stats_messages_fail_sent:4
cluster_stats_messages_sent:9954
cluster_stats_messages_ping_received:2806
cluster_stats_messages_pong_received:2789
cluster_stats_messages_fail_received:2
cluster_stats_messages_received:5597
127.0.0.1:6379> 

再查看下集群及各节点id cluster nodes

127.0.0.1:6379> cluster nodes
1e88e9d4a02ddf98f30c651893b508e77901a4e1 127.0.0.1:6379@16379 myself,master - 0 1633403726000 1 connected 0-5461
d937c61a5eb8994b51b5b5514201db1325f91f96 127.0.0.1:6384@16384 master - 0 1633403726763 0 connected
8ed60323879ada3f41a8828cb6005db4d4e80084 127.0.0.1:6380@16380 master - 0 1633403725000 2 connected 5462-10922
a1bcb17b56a69fce51ec04ebcf376a7d1cc51b29 127.0.0.1:6381@16381 master - 0 1633403727796 5 connected 10923-16383
9c099f5368c71c229e64c3f69c190d4dcaf2460d 127.0.0.1:6383@16383 master - 0 1633403725000 4 connected
7e6b075ea194277f5b407530f1f201c01b8d7bb5 127.0.0.1:6382@16382 master - 0 1633403726000 3 connected
127.0.0.1:6379> 

目前还有三个节点没有使用,作为一个完整的集群,每个负责处理槽的节点应该具有从节点,保证当它出现故障时可以自动进行故障转移。
集群模式下,Reids节点角色分为主节点和从节点。首次启动的节点和被分配槽的节点都是主节点,从节点负责复制主节点槽信息和相关
的数据。使用cluster replicate{nodeId}命令让一个节点成为从节点。其中命令执行必须在对应的从节点上执行,nodeId是要复制主节点的节点ID,
命令如下:

redis-cli -p 6382 cluster replicate 1e88e9d4a02ddf98f30c651893b508e77901a4e1
redis-cli -p 6383 cluster replicate 8ed60323879ada3f41a8828cb6005db4d4e80084
redis-cli -p 6384 cluster replicate a1bcb17b56a69fce51ec04ebcf376a7d1cc51b29
➜  Learning git:(master) ✗ redis-cli -p 6382 cluster replicate 1e88e9d4a02ddf98f30c651893b508e77901a4e1
OK
➜  Learning git:(master) ✗ redis-cli -p 6383 cluster replicate 8ed60323879ada3f41a8828cb6005db4d4e80084
OK
➜  Learning git:(master) ✗ redis-cli -p 6384 cluster replicate a1bcb17b56a69fce51ec04ebcf376a7d1cc51b29
OK

通过 cluster nodes 命令查看集群状态和复制关系

127.0.0.1:6379> cluster nodes
1e88e9d4a02ddf98f30c651893b508e77901a4e1 127.0.0.1:6379@16379 myself,master - 0 1633403907000 1 connected 0-5461
d937c61a5eb8994b51b5b5514201db1325f91f96 127.0.0.1:6384@16384 slave a1bcb17b56a69fce51ec04ebcf376a7d1cc51b29 0 1633403910000 5 connected
8ed60323879ada3f41a8828cb6005db4d4e80084 127.0.0.1:6380@16380 master - 0 1633403910820 2 connected 5462-10922
a1bcb17b56a69fce51ec04ebcf376a7d1cc51b29 127.0.0.1:6381@16381 master - 0 1633403908000 5 connected 10923-16383
9c099f5368c71c229e64c3f69c190d4dcaf2460d 127.0.0.1:6383@16383 slave 8ed60323879ada3f41a8828cb6005db4d4e80084 0 1633403909000 4 connected
7e6b075ea194277f5b407530f1f201c01b8d7bb5 127.0.0.1:6382@16382 slave 1e88e9d4a02ddf98f30c651893b508e77901a4e1 0 1633403909794 3 connected
127.0.0.1:6379> 

可以看到如下对应关系:

6379 --- replication ---> 6382
6380 --- replication ---> 6383
6381 --- replication ---> 6384

目前为止,我们依照Redis协议手动建立一个集群。它由6个节点构成,3个主节点负责处理槽和相关数据,3个从节点负责故障转移。手动搭建
集群便于理解集群建立的流程和细节,不过读者也从中发现集群搭建需要很多步骤,当集群节点众多时,必然会加大搭建集群的复杂度和运维成本。
因此Redis官方提供了redis-trib.rb工具方便我们快速搭建集群。

参考

  • Redis 开发与运维(数据库技术丛书)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搭建一个 Redis Cluster 集群的步骤如下: 1. 下载并安装 Redis:在 Redis 官网下载 Redis 并安装。安装完成后,可以通过 redis-cli 命令来测试 Redis 是否正常工作。 2. 配置 Redis:编辑 redis.conf 文件,设置 Redis 的端口号、密码、数据存储路径等参数。如果需要启用集群功能,需要在配置文件中添加 cluster-enabled yes 和 cluster-config-file 路径等配置信息。 3. 创建 Redis Cluster:使用 create-cluster 脚本创建 Redis Cluster,该脚本可以在 Redis 安装目录的 utils/create-cluster 目录下找到。需要指定 Redis Cluster 的端口号、节点数量等参数。例如,执行以下命令可以创建一个 3 个节点的 Redis Cluster: ``` $ create-cluster start --port 7000 --replicas 0 --num-nodes 3 ``` 4. 添加节点:使用 add-node 脚本向 Redis Cluster 添加新的节点。例如,执行以下命令可以将一个新的节点添加到 Redis Cluster 中: ``` $ redis-cli --cluster add-node 127.0.0.1:7000 127.0.0.1:7001 ``` 5. 删除节点:使用 del-node 脚本从 Redis Cluster 删除节点。例如,执行以下命令可以将一个节点从 Redis Cluster 中删除: ``` $ redis-cli --cluster del-node 127.0.0.1:7000 1234567890abcdef1234567890abcdef12345678 ``` 6. 扩展 Redis Cluster:使用 reshard 脚本可以扩展 Redis Cluster 的节点数量。例如,执行以下命令可以将 Redis Cluster 的节点数量扩展到 6 个: ``` $ redis-cli --cluster reshard 127.0.0.1:7000 ``` 在实际应用中,需要根据具体的业务场景和需求,选择合适的 Redis Cluster 集群方案。同时,在搭建 Redis Cluster 集群时,需要考虑到分布式环境下的各种异常情况,如网络延迟、节点故障等,从而设计出高可用、高性能、高可靠的 Redis Cluster 集群方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值