如需转载,请根据 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 许可,附上本文作者及链接。
本文作者: 执笔成念
作者昵称: zbcn
本文链接: https://1363653611.github.io/zbcn.github.io/2021/02/13/redis_08%E9%9B%86%E7%BE%A4%E9%83%A8%E7%BD%B2/
导读
redis集群需要使用集群管理脚本redis-trib.rb,它的执行相应依赖ruby环境。
安装
安装ruby
1 | yum install ruby |
2 | yum install rubygems |
将redis-3.2.9.gen拖近Linux系统
安装ruby和redis的接口程序redis-3.2.9.gem
1 | gem install redis-3.2.9.gem |
复制redis-3.2.9/src/redis-trib.rb 文件到/usr/local/redis目录
1 | cp redis-3.2.9/src/redis-trib.rb /usr/local/redis/ -r |
安装Redis集群(RedisCluster)
Redis集群最少需要三台主服务器,三台从服务器,端口号分别为7001~7006。
创建7001实例,并编辑redis.conf文件,修改port为7001。
[
修改redis.conf配置文件,打开Cluster-enable yes
[
重复以上2个步骤,完成7002~7006实例的创建,注意端口修改
启动所有的实例
创建Redis集群
1 | ./redis-trib.rb create --replicas 1 192.168.242.129:7001 192.168.242.129:7002 192.168.242.129:7003 192.168.242.129:7004 192.168.242.129:7005 192.168.242.129:7006 |
2 | >>> Creating cluster |
3 | Connecting to node 192.168.242.129:7001: OK |
4 | Connecting to node 192.168.242.129:7002: OK |
5 | Connecting to node 192.168.242.129:7003: OK |
6 | Connecting to node 192.168.242.129:7004: OK |
7 | Connecting to node 192.168.242.129:7005: OK |
8 | Connecting to node 192.168.242.129:7006: OK |
9 | >>> Performing hash slots allocation on 6 nodes... |
10 | Using 3 masters: |
11 | 192.168.242.129:7001 |
12 | 192.168.242.129:7002 |
13 | 192.168.242.129:7003 |
14 | Adding replica 192.168.242.129:7004 to 192.168.242.129:7001 |
15 | Adding replica 192.168.242.129:7005 to 192.168.242.129:7002 |
16 | Adding replica 192.168.242.129:7006 to 192.168.242.129:7003 |
17 | M: d8f6a0e3192c905f0aad411946f3ef9305350420 192.168.242.129:7001 |
18 | slots:0-5460 (5461 slots) master |
19 | M: 7a12bc730ddc939c84a156f276c446c28acf798c 192.168.242.129:7002 |
20 | slots:5461-10922 (5462 slots) master |
21 | M: 93f73d2424a796657948c660928b71edd3db881f 192.168.242.129:7003 |
22 | slots:10923-16383 (5461 slots) master |
23 | S: f79802d3da6b58ef6f9f30c903db7b2f79664e61 192.168.242.129:7004 |
24 | replicates d8f6a0e3192c905f0aad411946f3ef9305350420 |
25 | S: 0bc78702413eb88eb6d7982833a6e040c6af05be 192.168.242.129:7005 |
26 | replicates 7a12bc730ddc939c84a156f276c446c28acf798c |
27 | S: 4170a68ba6b7757e914056e2857bb84c5e10950e 192.168.242.129:7006 |
28 | replicates 93f73d2424a796657948c660928b71edd3db881f |
29 | Can I set the above configuration? (type 'yes' to accept): yes |
30 | >>> Nodes configuration updated |
31 | >>> Assign a different config epoch to each node |
32 | >>> Sending CLUSTER MEET messages to join the cluster |
33 | Waiting for the cluster to join.... |
34 | >>> Performing Cluster Check (using node 192.168.242.129:7001) |
35 | M: d8f6a0e3192c905f0aad411946f3ef9305350420 192.168.242.129:7001 |
36 | slots:0-5460 (5461 slots) master |
37 | M: 7a12bc730ddc939c84a156f276c446c28acf798c 192.168.242.129:7002 |
38 | slots:5461-10922 (5462 slots) master |
39 | M: 93f73d2424a796657948c660928b71edd3db881f 192.168.242.129:7003 |
40 | slots:10923-16383 (5461 slots) master |
41 | M: f79802d3da6b58ef6f9f30c903db7b2f79664e61 192.168.242.129:7004 |
42 | slots: (0 slots) master |
43 | replicates d8f6a0e3192c905f0aad411946f3ef9305350420 |
44 | M: 0bc78702413eb88eb6d7982833a6e040c6af05be 192.168.242.129:7005 |
45 | slots: (0 slots) master |
46 | replicates 7a12bc730ddc939c84a156f276c446c28acf798c |
47 | M: 4170a68ba6b7757e914056e2857bb84c5e10950e 192.168.242.129:7006 |
48 | slots: (0 slots) master |
49 | replicates 93f73d2424a796657948c660928b71edd3db881f |
50 | [OK] All nodes agree about slots configuration. |
51 | >>> Check for open slots... |
52 | >>> Check slots coverage... |
53 | [OK] All 16384 slots covered. |
54 | [root@localhost-0723 redis]# |
命令客户端连接集群
命令:
1 | ./redis-cli -h 127.0.0.1 -p 7001 -c |
2 | |
3 | |
4 | 注:-c表示是以redis集群方式进行连接 |
5 | ./redis-cli -p 7006 -c |
6 | 127.0.0.1:7006> set key1 123 |
7 | -> Redirected to slot [9189] located at 127.0.0.1:7002 |
8 | OK |
9 | 127.0.0.1:7002> |
查看集群的命令
查看集群状态
1 | 127.0.0.1:7003> cluster info |
2 | cluster_state:ok |
3 | cluster_slots_assigned:16384 |
4 | cluster_slots_ok:16384 |
5 | cluster_slots_pfail:0 |
6 | cluster_slots_fail:0 |
7 | cluster_known_nodes:6 |
8 | cluster_size:3 |
9 | cluster_current_epoch:6 |
10 | cluster_my_epoch:3 |
11 | cluster_stats_messages_sent:926 |
12 | cluster_stats_messages_received:926 |
查看集群中的节点
1 | 127.0.0.1:7003> cluster nodes |
2 | 7a12bc730ddc939c84a156f276c446c28acf798c 127.0.0.1:7002 master - 0 1443601739754 2 connected 5461-10922 |
3 | 93f73d2424a796657948c660928b71edd3db881f 127.0.0.1:7003 myself,master - 0 0 3 connected 10923-16383 |
4 | d8f6a0e3192c905f0aad411946f3ef9305350420 127.0.0.1:7001 master - 0 1443601741267 1 connected 0-5460 |
5 | 4170a68ba6b7757e914056e2857bb84c5e10950e 127.0.0.1:7006 slave 93f73d2424a796657948c660928b71edd3db881f 0 1443601739250 6 connected |
6 | f79802d3da6b58ef6f9f30c903db7b2f79664e61 127.0.0.1:7004 slave d8f6a0e3192c905f0aad411946f3ef9305350420 0 1443601742277 4 connected |
7 | 0bc78702413eb88eb6d7982833a6e040c6af05be 127.0.0.1:7005 slave 7a12bc730ddc939c84a156f276c446c28acf798c 0 1443601740259 5 connected |
8 | 127.0.0.1:7003> |
维护节点
集群创建完成后可以继续向集群中添加节点。
添加主节点
添加7007节点作为新节点
命令:./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7001
[
查看集群节点发现7007已加到集群中
[
hash槽重新分配
添加完主节点需要对主节点进行hash槽分配,这样该主节才可以存储数据。
查看集群中槽占用情况
redis集群有16384个槽,集群中的每个节点分配自己槽,通过查看集群节点可以看到槽占用情况。
[
给刚添加的7007节点分配槽
第一步:连上集群(连接集群中任意一个可用节点都行)
1 | ./redis-trib.rb reshard 192.168.101.3:7001 |
第二步:输入要分配的槽数量
[](
输入500,表示要分配500个槽
第三步:输入接收槽的节点id
[
输入:15b809eadae88955e36bcdbb8144f61bbbaf38fb
ps:这里准备给7007分配槽,通过cluster node查看7007节点id为:
15b809eadae88955e36bcdbb8144f61bbbaf38fb
第四步:输入源节点id
[
输入:all
第五步:输入yes开始移动槽到目标节点id
[
输入:yes
添加从节点
添加7008从节点,将7008作为7007的从节点
命令:
1 | ./redis-trib.rb add-node --slave --master-id 主节点id 新节点的ip和端口 旧节点ip和端口 |
执行如下命令:
1 | ./redis-trib.rb add-node --slave --master-id cad9f7413ec6842c971dbcc2c48b4ca959eb5db4 192.168.101.3:7008 192.168.101.3:7001 |
cad9f7413ec6842c971dbcc2c48b4ca959eb5db4 是7007结点的id,可通过cluster nodes查看。
nodes查看
[
注意:如果原来该节点在集群中的配置信息已经生成到cluster-config-file指定的配置文件中(如果cluster-config-file没有指定则默认为nodes.conf),这时可能会报错
1 | [ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0 |
解决办法是删除生成的配置文件nodes.conf,删除后再执行./redis-trib.rb add-node指令
查看集群中的节点,刚添加7008为7007的从节点
[
删除节点
命令:
1 | ./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017 |
删除已经占用hash槽的节点会失败,报错如下
1 | [ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again. |
需要将该节点占用的hash槽分配出去