原生命令安装
步骤预览
1、配置开启节点
2、meet
3、指派槽
4、主从关系分配
安装操作
节点配置
进入 redis/config 目录,准备6个配置文件。
第一个配置文件redis-7000.conf:
1
2
3
4
5
6
7
8
|
port 7000
daemonize yes
dir "/opt/redis/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-require-full-coverage no
|
使用 sed
命令快速生成其他5个配置文件
1
2
3
4
5
|
# sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf
# sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf
# sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf
# sed 's/7000/7004/g' redis-7000.conf > redis-7004.conf
# sed 's/7000/7005/g' redis-7000.conf > redis-7005.conf
|
启动:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# redis-server redis-7000.conf
# redis-server redis-7001.conf
# redis-server redis-7002.conf
# redis-server redis-7003.conf
# redis-server redis-7004.conf
# redis-server redis-7005.conf
# ps -ef | grep redis-
root 3233 1 0 17:47 ? 00:00:00 redis-server *:7000 [cluster]
root 3237 1 0 17:47 ? 00:00:00 redis-server *:7001 [cluster]
root 3241 1 0 17:47 ? 00:00:00 redis-server *:7002 [cluster]
root 3245 1 0 17:47 ? 00:00:00 redis-server *:7003 [cluster]
root 3249 1 0 17:47 ? 00:00:00 redis-server *:7004 [cluster]
root 3253 1 0 17:47 ? 00:00:00 redis-server *:7005 [cluster]
root 3259 301 0 17:48 pts/1 00:00:00 grep --color=auto redis-
|
连接任意一个节点,执行某个命令:
1
2
3
4
|
# redis-cli -p 7000
127.0.0.1:7000> set hello world
(error) CLUSTERDOWN The cluster is down
127.0.0.1:7000>
|
表示当前集群属于下线状态,不可用。集群模式下状态可用的标识是所有节点都分配了槽。
查看集群本地配置:
1
2
3
|
# cat /opt/redis/data/nodes-7000.conf
c3e020394968ea7a7ade871951d244d4db88b155 :0 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0
|
也可以执行下面命令查看接节点信息,和上面结果差不多:
1
2
|
# redis-cli -p 7000 cluster nodes
c3e020394968ea7a7ade871951d244d4db88b155 :7000 myself,master - 0 0 0 connected
|
还可以查看集群信息:
1
2
3
4
5
6
7
8
9
10
11
12
|
# redis-cli -p 7000 cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:1
cluster_size:0
cluster_current_epoch:0
cluster_my_epoch:0
cluster_stats_messages_sent:0
cluster_stats_messages_received:0
|
集群节点 meet 握手配置
首先将 7000 节点和7001 节点进行 meet 操作,连接 7000 节点执行下面命令:
1
2
|
# redis-cli -p 7000 cluster meet 127.0.0.1 7001
OK
|
此时在 7000 或者 7001 节点查看nodes信息,都已经达成了握手,其他节点并没有完成握手:
1
2
3
4
5
6
7
8
|
# redis-cli -p 7000 cluster nodes
c3e020394968ea7a7ade871951d244d4db88b155 127.0.0.1:7000 myself,master - 0 0 0 connected
820b55158df9acd4c3e41c758bdcabc6b0e4509b 127.0.0.1:7001 master - 0 1732010290107 1 connected
# redis-cli -p 7001 cluster nodes
c3e020394968ea7a7ade871951d244d4db88b155 127.0.0.1:7000 master - 0 1732010321733 0 connected
820b55158df9acd4c3e41c758bdcabc6b0e4509b 127.0.0.1:7001 myself,master - 0 0 1 connected
# redis-cli -p 7002 cluster nodes
c074b7dee3455cf9357c99fb3aae6be1992edfdf :7002 myself,master - 0 0 0 connected
|
然后再继续执行其他节点的 meet 操作:
1
2
3
4
5
6
7
8
|
# redis-cli -p 7000 cluster meet 127.0.0.1 7002
OK
# redis-cli -p 7000 cluster meet 127.0.0.1 7003
OK
# redis-cli -p 7000 cluster meet 127.0.0.1 7004
OK
# redis-cli -p 7000 cluster meet 127.0.0.1 7005
OK
|
在7000上查看nodes和cluster信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# redis-cli -p 7000 cluster nodes
c3e020394968ea7a7ade871951d244d4db88b155 127.0.0.1:7000 myself,master - 0 0 3 connected
820b55158df9acd4c3e41c758bdcabc6b0e4509b 127.0.0.1:7001 master - 0 1732010453751 1 connected
e3eec80472f946286c0fbf7e7270ecce6549adf8 127.0.0.1:7004 master - 0 1732010455776 0 connected
b44eba6f9e3db1d78220e565e67bfdd42d61505d 127.0.0.1:7005 master - 0 1732010458816 5 connected
c074b7dee3455cf9357c99fb3aae6be1992edfdf 127.0.0.1:7002 master - 0 1732010457805 2 connected
218afab543610e66b74922975ea38710649f2f74 127.0.0.1:7003 master - 0 1732010459850 4 connected
# redis-cli -p 7000 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:3
cluster_stats_messages_sent:556
cluster_stats_messages_received:556
|
此时到这里集群节点已经达到了互通的效果。但此时集群的状态仍然是不可用,所以接下来需要为集群分配槽。
分配槽
编写脚本 addslot.sh:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 起始slot
start=$1
# 终止slot
end=$2
# 端口
port=$3
for slot in `seq ${start} ${end}`
do
echo "slot: ${slot}"
redis-cli -p ${port} cluster addslots ${slot}
done
|
执行脚本第一个节点分派槽:
1
|
sh addslots.sh 0 5461 7000
|
查看第一个7000节点的集群和节点信息,会看到分配5462个槽:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# redis-cli -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:5462
cluster_slots_ok:5462
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:1
cluster_current_epoch:5
cluster_my_epoch:3
cluster_stats_messages_sent:9448
cluster_stats_messages_received:9448
# redis-cli -p 7000 cluster nodes
c3e020394968ea7a7ade871951d244d4db88b155 127.0.0.1:7000 myself,master - 0 0 3 connected 0-5461
820b55158df9acd4c3e41c758bdcabc6b0e4509b 127.0.0.1:7001 master - 0 1732026371394 1 connected
e3eec80472f946286c0fbf7e7270ecce6549adf8 127.0.0.1:7004 master - 0 1732026369367 0 connected
b44eba6f9e3db1d78220e565e67bfdd42d61505d 127.0.0.1:7005 master - 0 1732026372407 5 connected
c074b7dee3455cf9357c99fb3aae6be1992edfdf 127.0.0.1:7002 master - 0 1732026370380 2 connected
218afab543610e66b74922975ea38710649f2f74 127.0.0.1:7003 master - 0 1732026368356 4 connected
|
接着给其余的节点分配槽:
1
2
|
sh addslots.sh 5462 10922 7001
sh addslots.sh 10923 16383 7002
|
此时再看下集群的状态ok,也已经分配了16384个槽:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
redis-cli -p 7000 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:3
cluster_stats_messages_sent:11727
cluster_stats_messages_received:11727
# redis-cli -p 7000 cluster nodes
c3e020394968ea7a7ade871951d244d4db88b155 127.0.0.1:7000 myself,master - 0 0 3 connected 0-5461
820b55158df9acd4c3e41c758bdcabc6b0e4509b 127.0.0.1:7001 master - 0 1732028930955 1 connected 5462-10922
e3eec80472f946286c0fbf7e7270ecce6549adf8 127.0.0.1:7004 master - 0 1732028928928 0 connected
b44eba6f9e3db1d78220e565e67bfdd42d61505d 127.0.0.1:7005 master - 0 1732028931968 5 connected
c074b7dee3455cf9357c99fb3aae6be1992edfdf 127.0.0.1:7002 master - 0 1732028932375 2 connected 10923-16383
218afab543610e66b74922975ea38710649f2f74 127.0.0.1:7003 master - 0 1732028930448 4 connected
|
最后一步分配主从关系,7003节点为7000的从节点,7004节点为7001的从节点,7005为7002的从节点。
比如让7003作为从,就连接到7003节点执行下面命令:
1
2
|
# redis-cli -p 7003 cluster replicate c3e020394968ea7a7ade871951d244d4db88b155
OK
|
然后查看下节点信息:
1
2
3
4
5
6
7
|
# redis-cli -p 7000 cluster nodes
c3e020394968ea7a7ade871951d244d4db88b155 127.0.0.1:7000 myself,master - 0 0 3 connected 0-5461
820b55158df9acd4c3e41c758bdcabc6b0e4509b 127.0.0.1:7001 master - 0 1732030290643 1 connected 5462-10922
e3eec80472f946286c0fbf7e7270ecce6549adf8 127.0.0.1:7004 master - 0 1732030287606 0 connected
b44eba6f9e3db1d78220e565e67bfdd42d61505d 127.0.0.1:7005 master - 0 1732030291656 5 connected
c074b7dee3455cf9357c99fb3aae6be1992edfdf 127.0.0.1:7002 master - 0 1732030289630 2 connected 10923-16383
218afab543610e66b74922975ea38710649f2f74 127.0.0.1:7003 slave c3e020394968ea7a7ade871951d244d4db88b155 0 1732030292668 4 connected
|
同理设置其他两个节点的主从关系:
1
2
3
4
|
# redis-cli -p 7004 cluster replicate 820b55158df9acd4c3e41c758bdcabc6b0e4509b
OK
# redis-cli -p 7005 cluster replicate c074b7dee3455cf9357c99fb3aae6be1992edfdf
OK
|
再次查看节点信息,发现主从已全部分配:
1
2
3
4
5
6
7
|
# redis-cli -p 7000 cluster nodes
c3e020394968ea7a7ade871951d244d4db88b155 127.0.0.1:7000 myself,master - 0 0 3 connected 0-5461
820b55158df9acd4c3e41c758bdcabc6b0e4509b 127.0.0.1:7001 master - 0 1732030438345 1 connected 5462-10922
e3eec80472f946286c0fbf7e7270ecce6549adf8 127.0.0.1:7004 slave 820b55158df9acd4c3e41c758bdcabc6b0e4509b 0 1732030438852 1 connected
b44eba6f9e3db1d78220e565e67bfdd42d61505d 127.0.0.1:7005 slave c074b7dee3455cf9357c99fb3aae6be1992edfdf 0 1732030440884 5 connected
c074b7dee3455cf9357c99fb3aae6be1992edfdf 127.0.0.1:7002 master - 0 1732030439866 2 connected 10923-16383
218afab543610e66b74922975ea38710649f2f74 127.0.0.1:7003 slave c3e020394968ea7a7ade871951d244d4db88b155 0 1732030440377 4 connected
|
另外还使用下面查看槽分配信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# redis-cli -p 7000 cluster slots
1) 1) (integer) 0
2) (integer) 5461
3) 1) "127.0.0.1"
2) (integer) 7000
4) 1) "127.0.0.1"
2) (integer) 7003
2) 1) (integer) 5462
2) (integer) 10922
3) 1) "127.0.0.1"
2) (integer) 7001
4) 1) "127.0.0.1"
2) (integer) 7004
3) 1) (integer) 10923
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 7002
4) 1) "127.0.0.1"
2) (integer) 7005
|
最后还要做一个关于数据的操作:
1
2
3
|
# redis-cli -c -p 7000
127.0.0.1:7000> set hello world
OK
|
注意:生产环境不会采用这种方式进行安装,但这有利于理解 redis cluster 集群。
官方工具安装
- 下载、编译、安装ruby
- 安装rubygem redis
- 安装redis-trib.rb
1、下载安装
1
2
3
4
5
6
7
|
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
tar -zxvf ruby-2.3.1.tar.gz
cd ruby-2.3.1
./configure --prefix=/usr/local/ruby
make && make install
cp /usr/local/ruby/bin/ruby /usr/local/bin
cp /usr/local/ruby/bin/gem /usr/local/bin
|
2、安装rubygem redis
1
2
3
|
wget https://rubygems.org/downloads/redis-3.3.0.gem
gem install -l redis-3.3.0.gem
gem list -- check redis gem
|
3、安装redis-trib.tb
1
|
cp ${REDIS_HOME}/src/redis-trib.rb /usr/local/bin
|
进入 redis/src/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
# ./redis-trib.rb
Usage: redis-trib <command> <options> <arguments ...>
create host1:port1 ... hostN:portN
--replicas <arg>
check host:port
info host:port
fix host:port
--timeout <arg>
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
--timeout <arg>
--pipeline <arg>
rebalance host:port
--weight <arg>
--auto-weights
--use-empty-masters
--timeout <arg>
--simulate
--pipeline <arg>
--threshold <arg>
add-node new_host:new_port existing_host:existing_port
--slave
--master-id <arg>
del-node host:port node_id
set-timeout host:port milliseconds
call host:port command arg arg .. arg
import host:port
--from <arg>
--copy
--replace
help (show this help)
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
|
接着使用 redis-trib 做集群的搭建。
批量杀死进程:
1
|
ps -ef | grep redis-server | grep 700 | awk '{print $2}' | xargs kill
|
然后将之前 data 目录清理。
1
|
rm -rf /opt/redis/data/*
|
节点配置和以前一样,保持不变。比如redis-7000.conf配置如下,其他节点除了端口其他一致:
1
2
3
4
5
6
7
8
9
|
# cat redis-7000.conf
port 7000
daemonize yes
dir "/opt/redis/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-require-full-coverage no
|
启动节点:
1
2
3
4
5
6
|
redis-server redis-7000.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf
|
redis-trib 安装集群:
1
2
|
cd ../src
./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
|
完整过程如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: f2c72a49dc3f0640154b8018f6ee181f74bd63b6 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: 09a9e52f1def7d9c56bb824b3e06dd3b6be712e8 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: a97e3ac902b2ee221feb296e6bfe38fc1f012bf5 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
S: 203727f14f10c21943ef8262d77455b6925b33b6 127.0.0.1:7003
replicates f2c72a49dc3f0640154b8018f6ee181f74bd63b6
S: 5cffa2e7fb048b2a6ba3d3e568a9d2b49c78e46d 127.0.0.1:7004
replicates 09a9e52f1def7d9c56bb824b3e06dd3b6be712e8
S: 95da5dc272e79f4756ba258308dc8fb73aafaad0 127.0.0.1:7005
replicates a97e3ac902b2ee221feb296e6bfe38fc1f012bf5
Can I set the above configuration? (type 'yes' to accept): 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:7000)
M: f2c72a49dc3f0640154b8018f6ee181f74bd63b6 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: 09a9e52f1def7d9c56bb824b3e06dd3b6be712e8 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: a97e3ac902b2ee221feb296e6bfe38fc1f012bf5 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
M: 203727f14f10c21943ef8262d77455b6925b33b6 127.0.0.1:7003
slots: (0 slots) master
replicates f2c72a49dc3f0640154b8018f6ee181f74bd63b6
M: 5cffa2e7fb048b2a6ba3d3e568a9d2b49c78e46d 127.0.0.1:7004
slots: (0 slots) master
replicates 09a9e52f1def7d9c56bb824b3e06dd3b6be712e8
M: 95da5dc272e79f4756ba258308dc8fb73aafaad0 127.0.0.1:7005
slots: (0 slots) master
replicates a97e3ac902b2ee221feb296e6bfe38fc1f012bf5
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
|
查看集群信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# redis-cli -p 7000 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:6
cluster_my_epoch:1
cluster_stats_messages_sent:430
cluster_stats_messages_received:430
# redis-cli -p 7000 cluster nodes
09a9e52f1def7d9c56bb824b3e06dd3b6be712e8 127.0.0.1:7001 master - 0 1732064983772 2 connected 5461-10922
5cffa2e7fb048b2a6ba3d3e568a9d2b49c78e46d 127.0.0.1:7004 slave 09a9e52f1def7d9c56bb824b3e06dd3b6be712e8 0 1732064982760 5 connected
95da5dc272e79f4756ba258308dc8fb73aafaad0 127.0.0.1:7005 slave a97e3ac902b2ee221feb296e6bfe38fc1f012bf5 0 1732064985792 6 connected
a97e3ac902b2ee221feb296e6bfe38fc1f012bf5 127.0.0.1:7002 master - 0 1732064984783 3 connected 10923-16383
203727f14f10c21943ef8262d77455b6925b33b6 127.0.0.1:7003 slave f2c72a49dc3f0640154b8018f6ee181f74bd63b6 0 1732064983265 4 connected
f2c72a49dc3f0640154b8018f6ee181f74bd63b6 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
|
注意
安装ruby依赖zlib, openssl 等依赖。
总结
原生命令安装
- 可以帮助我们理解 Redis Cluster 架构
- 生产环境一般不使用
ruby-trib官方工具安装
**其他 **
可视化部署