一 集群规划
对于生产环境,六个节点一般不建议共用机器,即使要共用,也需要错开,并且需要有一定的机制去检查两个主是否落在了同一台机器,如果有则需要手动故障转移一下(即需要确保每台只有一个主),避免一台机器挂掉直接导致两个主挂掉,那集群直接就不可用了。
如果是仅仅是开发环境使用,完全可以把集群的每个节点都部署到同一台机器,以下演示,我们就是部署在同一台机器,脚本可复用,只需要copy到不同的机器执行脚本则是部署到不同机器。
节点 | 节点规划 |
---|---|
192.168.90.221 7001 | redis1 master |
192.168.90.221 7002 | redis2 master |
192.168.90.221 7003 | redis3 master |
192.168.90.221 7004 | redis4 slave |
192.168.90.221 7005 | redis5 slave |
192.168.90.221 7006 | redis6 slave |
支持redis4.x或5.x版本
二 编写快速创建节点脚本
为了避免重复写配置,故通过脚本快速创建redis节点,脚本如下: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
26vim create-redis.sh
HOST=$1
PORT=$2
VERSION=$3
mkdir -p /data/redis-cluster
cd /data/redis-cluster
mkdir data$PORT
eval "cat <<EOF
bind 0.0.0.0
daemonize no
logfile "/data/redis-server.log"
dir "/data"
port ${PORT}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip ${HOST}
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
EOF" > redis$PORT.conf
docker run -dit --name redis$PORT --restart=always -v $PWD/redis$PORT.conf:/etc/redis.conf -v $PWD/data$PORT:/data/ -p $PORT:$PORT -p 1$PORT:1$PORT redis:$VERSION redis-server /etc/redis.conf
二 创建六个节点
创建时,确保机器已经安装了docker,如果未安装请自行先安装。
然后执行以下命令创建六个节点
如果redis是5.0.4 则把下面的 4.0.1 替换为5.0.4即可1
2
3
4
5
6./create-redis.sh 192.168.90.221 7001 4.0.1
./create-redis.sh 192.168.90.221 7002 4.0.1
./create-redis.sh 192.168.90.221 7003 4.0.1
./create-redis.sh 192.168.90.221 7004 4.0.1
./create-redis.sh 192.168.90.221 7005 4.0.1
./create-redis.sh 192.168.90.221 7006 4.0.1
三 创建集群
针对redis5.0以下创建方式如下:
使用redis-trib.rb的ruby脚本操作,命令help如下: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 help
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.
安装ruby和创建集群1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 安装ruby ---- yum install ruby 直接安装的ruby版本是2.0版本 而 redis-trib.rb运行的最低版本要求是2.2
# 会在/etc/yum.repos.d/目录下多出一个CentOS-SCLo-scl-rh.repo源
yum install centos-release-scl-rh
# 直接yum安装即可
yum install rh-ruby23 -y
scl enable rh-ruby23 bash
# 下载对应redis版本的ruby客户端
wget https://rubygems.org/downloads/redis-4.0.1.gem
gem install redis-4.0.1.gem
# 下载对应版本的redis安装包 通过 http://download.redis.io/releases 找到对应的redis版本并下载
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
tar xzf redis-4.0.1.tar.gz
cd redis-4.0.1/src
# 执行集群创建命令
./redis-trib.rb create --replicas 1 192.168.90.221:7001 192.168.90.221:7002 192.168.90.221:7003 192.168.90.221:7004 192.168.90.221:7005 192.168.90.221:7006
查看集群情况1
2
3
4
5
6./redis-trib.rb info 192.168.90.221:7001
192.168.90.221:7001 (2e3f1fc8...) -> 0 keys | 5461 slots | 1 slaves.
192.168.90.221:7003 (c9c5e1ae...) -> 0 keys | 5461 slots | 1 slaves.
192.168.90.221:7002 (6abc468e...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
针对redis5.0及以上版本创建方式如下:
直接使用redis-cli命令操作 查看cluster相关命令help1
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
38docker exec -it redis7001 redis-cli --cluster help
Cluster Manager Commands:
create host1:port1 ... hostN:portN
--cluster-replicas <arg>
check host:port
--cluster-search-multiple-owners
info host:port
fix host:port
--cluster-search-multiple-owners
reshard host:port
--cluster-from <arg>
--cluster-to <arg>
--cluster-slots <arg>
--cluster-yes
--cluster-timeout <arg>
--cluster-pipeline <arg>
--cluster-replace
rebalance host:port
--cluster-weight <node1=w1...nodeN=wN>
--cluster-use-empty-masters
--cluster-timeout <arg>
--cluster-simulate
--cluster-pipeline <arg>
--cluster-threshold <arg>
--cluster-replace
add-node new_host:new_port existing_host:existing_port
--cluster-slave
--cluster-master-id <arg>
del-node host:port node_id
call host:port command arg arg .. arg
set-timeout host:port milliseconds
import host:port
--cluster-from <arg>
--cluster-copy
--cluster-replace
help
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
创建集群命令1
docker exec -it redis7001 redis-cli --cluster create 192.168.90.221:7001 192.168.90.221:7002 192.168.90.221:7003 192.168.90.221:7004 192.168.90.221:7005 192.168.90.221:7006 --cluster-replicas 1
查看集群情况1
2
3
4
5
6docker exec -it redis7001 redis-cli --cluster info 192.168.90.221:7001
192.168.90.221:7001 (0eb0025a...) -> 0 keys | 5461 slots | 1 slaves.
192.168.90.221:7002 (e305c814...) -> 0 keys | 5462 slots | 1 slaves.
192.168.90.221:7003 (2e057aaa...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
三 往现有集群追加节点
追加节点之前,要确保需要追加的节点的redis数据是空的
针对redis5.0以下如下:1
2./redis-trib.rb add-node --slave --master-id 1b676ecf07d6c0101bc894a62440b1dd2effd116 192.168.90.220:7006 192.168.90.220:7001
./redis-trib.rb add-node --slave --master-id e7a4ac94a2a61339e9640eba155cb10d597f656c 192.168.90.220:7007 192.168.90.220:7001
针对redis5.0以上如下:1
2docker exec -it redis7001 redis-cli --cluster add-node --cluster-slave --cluster-master-id e305c8141e21f9ef55933d816ac03beae13fa3f2 192.168.90.220:7006 192.168.90.220:7001
docker exec -it redis7001 redis-cli --cluster add-node --cluster-slave --cluster-master-id e305c8141e21f9ef55933d816ac03beae13fa3f2 192.168.90.220:7007 192.168.90.220:7001
四 如何删除现有集群中的节点
如果需要删除的是主节点,则需要把该主节点对应的从节点手动升为主节点,让需要删除的节点变成从节点后再执行删除,手动切换主从的方式的命令如下:1
2# 把以下ip+端口的节点升为主的命令
redis-cli -h 192.168.90.221 -p 7004 -c cluster failover
针对redis5.0以下如下:
先通过命令 ./redis-trib.rb check 192.168.90.221:7001
获取到需要删除节点的id,直接删除节点1
./redis-trib.rb del-node 192.168.90.221:7001 60ff161980196a0e4b3d66d897878c0666bcf89b
针对redis5.0以上如下:
先通过命令 docker exec -it redis7001 redis-cli --cluster check 192.168.90.221:7001
获取到需要删除节点的id,直接删除节点1
docker exec -it redis7001 redis-cli --cluster del-node 192.168.90.221:7001 60ff161980196a0e4b3d66d897878c0666bcf89b