Redis Cluster集群搭建

Redis Cluster集群搭建

集群搭建参考官网:

1
https://redis.io/topics/cluster-tutorial

redis集群需要至少三个master节点,我这里搭建三个master节点。并且给每个master再搭建一个slave节点,总共6个redis节点,这里用一台服务器部署(多台服务器部署,修改一下ip地址就可以了) 部署6个redis实例,三主三从,搭建集群的步骤如下:

我使用redis6.2.6版本

1 创建redis节点安装目录

1
mkdir /data/docker-redis-cluster

2 依次创建文件夹,并依次修改配置文件

1
2
3
4
创建文件夹 6381-6386
mkdir /data/docker-redis-cluster/{6381..6386}
复制redis.conf配置文件到6381下。
cp redis.conf /data/docker-redis-cluster/6381/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 修改配置文件 
# 关闭保护模式 用于公网访问
protected-mode no
port 6381
# 开启集群模式
cluster-enabled yes

# 不改也可以
# cluster-config-file nodes-6381.conf
# cluster-node-timeout 5000
#日志文件 也可以不改默认
#pidfile /var/run/redis_6381.pid
#此处绑定ip 可以是阿里云内网IP 和本地 ip 可以直接注释掉
# bind 127.0.0.1
#用于连接主节点密码
masterauth 123.Redis
#设置redis密码 各个节点请保持密码一致
requirepass 123.Redis

分别复制到其他5个文件夹中

1
2
3
4
5
6
7
 cp redis.conf ../6382/
cp redis.conf ../6383/
cp redis.conf ../6384/
cp redis.conf ../6385/
cp redis.conf ../6386/

配置文件的端口分别修改对应的。

3 启动6个docker容器和开通防火墙

目前 Redis Cluster 不支持经过 NAT 处理的环境以及重新映射 IP 地址或 TCP 端口的一般环境。

这里容易采坑。不要自作聪明通过端口映射的方式启动容器,后面会导致集群加入不了。官方不支持。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 开放防火墙
iptables -A INPUT -p tcp -m multiport --dports 6381:6390 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 16381:16390 -j ACCEPT



#分别启动6个容器
1.
docker run --name redis1 --network host -v /data/docker-redis-cluster/6381/data:/data -v /data/docker-redis-cluster/6381/redis.conf:/usr/local/etc/redis/redis.conf -d redis:6.2.6 redis-server /usr/local/etc/redis/redis.conf

2.
docker run --name redis2 --network host -v /data/docker-redis-cluster/6382/data:/data -v /data/docker-redis-cluster/6382/redis.conf:/usr/local/etc/redis/redis.conf -d redis:6.2.6 redis-server /usr/local/etc/redis/redis.conf

3.
docker run --name redis3 --network host -v /data/docker-redis-cluster/6383/data:/data -v /data/docker-redis-cluster/6383/redis.conf:/usr/local/etc/redis/redis.conf -d redis:6.2.6 redis-server /usr/local/etc/redis/redis.conf

4.
docker run --name redis4 --network host -v /data/docker-redis-cluster/6384/data:/data -v /data/docker-redis-cluster/6384/redis.conf:/usr/local/etc/redis/redis.conf -d redis:6.2.6 redis-server /usr/local/etc/redis/redis.conf

5.
docker run --name redis5 --network host -v /data/docker-redis-cluster/6385/data:/data -v /data/docker-redis-cluster/6385/redis.conf:/usr/local/etc/redis/redis.conf -d redis:6.2.6 redis-server /usr/local/etc/redis/redis.conf

6.
docker run --name redis6 --network host -v /data/docker-redis-cluster/6386/data:/data -v /data/docker-redis-cluster/6386/redis.conf:/usr/local/etc/redis/redis.conf -d redis:6.2.6 redis-server /usr/local/etc/redis/redis.conf

也可以编写docker-compose.yml文件启动

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
48
49
50
51
52
53
54
55
version: '3'
services:
redis1:
container_name: redis1
image: redis:6.2.6
command: redis-server /usr/local/etc/redis/redis.conf
network_mode: "host"
volumes:
- /data/docker-redis-cluster/6381/data:/data
- /data/docker-redis-cluster/6381/redis.conf:/usr/local/etc/redis/redis.conf

redis2:
container_name: redis2
image: redis:6.2.6
command: redis-server /usr/local/etc/redis/redis.conf
network_mode: "host"
volumes:
- /data/docker-redis-cluster/6382/data:/data
- /data/docker-redis-cluster/6382/redis.conf:/usr/local/etc/redis/redis.conf

redis3:
container_name: redis3
image: redis:6.2.6
command: redis-server /usr/local/etc/redis/redis.conf
network_mode: "host"
volumes:
- /data/docker-redis-cluster/6383/data:/data
- /data/docker-redis-cluster/6383/redis.conf:/usr/local/etc/redis/redis.conf

redis4:
container_name: redis4
image: redis:6.2.6
command: redis-server /usr/local/etc/redis/redis.conf
network_mode: "host"
volumes:
- /data/docker-redis-cluster/6384/data:/data
- /data/docker-redis-cluster/6384/redis.conf:/usr/local/etc/redis/redis.conf

redis5:
container_name: redis5
image: redis:6.2.6
command: redis-server /usr/local/etc/redis/redis.conf
network_mode: "host"
volumes:
- /data/docker-redis-cluster/6385/data:/data
- /data/docker-redis-cluster/6385/redis.conf:/usr/local/etc/redis/redis.conf

redis6:
container_name: redis6
image: redis:6.2.6
command: redis-server /usr/local/etc/redis/redis.conf
network_mode: "host"
volumes:
- /data/docker-redis-cluster/6386/data:/data
- /data/docker-redis-cluster/6386/redis.conf:/usr/local/etc/redis/redis.conf

docker-compose启动

1
docker-compose up -d

4 创建集群

1
2
3
4
5
6
7
8
9
10
创建集群命令
--cluster create
--cluster-replicas 1

通过redis-cli 客户端命令来创建集群
redis-cli --cluster create -a '123.Redis' 122.152.250.233:6381 122.152.250.233:6382 122.152.250.233:6383 122.152.250.233:6384 122.152.250.233:6385 122.152.250.233:6386 --cluster-replicas 1

通过进入容器命令来创建

docker exec -it redis1 redis-cli --cluster create -a '123.Redis' 122.152.250.233:6381 122.152.250.233:6382 122.152.250.233:6383 122.152.250.233:6384 122.152.250.233:6385 122.152.250.233:6386 --cluster-replicas 1

5 Redis Cluster 集群验证

在某台机器上(或)连接集群6381端口的节点

1
2
3
4
5
普通redis方式:
redis-cli -h 122.152.25.233 -c -p 6381 -a 123.Redis # 加参数 -c 可以连接到集群

Docker方式:
docker exec -it redis1 redis-cli -h 122.152.25.233 -c -p 6381 -a 123.Redis

基础命令

1
2
3
4
info replication 通过这个命令来查看集群效果。
cluster nodes 整个集群的信息。

每个redis的节点都有一个ID值,此ID值将被此特定的redis实例永久使用,以便实例在集群上下文中具有唯一的名称,每个节点都会记住使用此ID的每个其他节点,而不是通过IP或端口。IP或端口可能会发生变化,但唯一的节点标识符在节点的整个生命周期内都不会改变。我们简单的称这个标识符为节点id。

到此集群就搭建完毕了。

6 集群扩容

假设我们近期可能要流量大增,所以需要扩大一组redis,一主一从。注意哈希槽的重新分配。

假设实际工作中新增是两台机器

1
2
3
4
5
6
7
8
9
mkdir /data/docker-redis-cluster/6387
mkdir /data/docker-redis-cluster/6388
分别复制一份redis.conf文件到对应的目录。修改端口号。

7.
docker run --name redis7 --network host -v /data/docker-redis-cluster/6387/data:/data -v /data/docker-redis-cluster/6387/redis.conf:/usr/local/etc/redis/redis.conf -d redis:6.2.6 redis-server /usr/local/etc/redis/redis.conf

7.
docker run --name redis8 --network host -v /data/docker-redis-cluster/6388/data:/data -v /data/docker-redis-cluster/6388/redis.conf:/usr/local/etc/redis/redis.conf -d redis:6.2.6 redis-server /usr/local/etc/redis/redis.conf

新加入集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
将新增的6387作为master节点加入集群。
redis-cli --cluster add-node ip:6387 ip:6381 #6387要作为master新增节点,而6381是原来集群节点里面的领路人,相当于6387需要找到6381来作为领路人来加入到集群这个组织。

docker exec -it redis1 redis-cli --cluster add-node -a '123.Redis' 122.152.250.233:6387 122.152.250.233:6381

以下是提示信息:
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 122.152.250.233:6387 to make it join the cluster.
注意加入到集群之后,有个问题是它没有获取到槽位

#查看是否有槽位
docker exec -it redis1 redis-cli --cluster check 122.152.250.233:6381

重新分配槽位

1
2
3
4
5
6
7
8
9
10
11
命令: redis-cli --cluster reshard 122.152.250.233:6381

docker exec -it redis1 redis-cli --cluster reshard -a '123.Redis' 122.152.250.233:6381

How many slots do you want to move (from 1 to 16384) 16384除以4 = 4096
What is the receiving node ID? #接收点的id是什么?
637f60c94ae1d0049383503bccec0f4b0e7f708e 输入新节点的ID

Source node #1: all #注意这里的all

最后输入yes

然后再次查看是否分配槽位

1
docker exec -it redis1 redis-cli --cluster check 122.152.250.233:6381 -a 123.Redis

但是要注意,我们新加入的这个节点分配了4096个槽位,但是它的槽位部署连续的:

1
slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master 分成了三段。是之前上一次的三个主机master都分割点过来凑起来了4096个槽位,并不是4个主机重新从0开始分配哈。

主节点下添加从节点

1
2
3
4
5
6
7
命令:redis-cli --cluster add-node ip:新slave端口 (空格) ip:新master端口--cluster-slave --cluster-master-id 新主机节点ID

docker exec -it redis1 bash

redis-cli -a 123.Redis --cluster add-node 122.152.250.233:6388 122.152.250.233:6387 --cluster-slave --cluster-master-id 637f60c94ae1d0049383503bccec0f4b0e7f708e

这个命令的意思就是新节点6388,要加入到6387下作为从节点,--cluster-master-id 表示具体的你要加入到哪个maser节点下面,master节点有节点id.

加入了从机之后我们可以看到:

1
redis-cli --cluster check 122.152.250.233:6381 -a 123.Redis

7 集群缩容

现在的需求是我们流量高峰过了。为了节省资源所以我们就来把6387和6388这两台机器撤掉。

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
48
49
50
51
先删除从机6388
命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID

redis-cli -a 123.Redis --cluster del-node 122.152.25.233:6388 2577b4e7140f8d83eb36a8c8d6ed6fd17de048d2


redis-cli -p 6388 -c -a Redis

cluster nodes #查看节点ID

删除了后。重新分配槽位
redis-cli --cluster reshard -a '123.Redis' 122.152.25.233:6381

root@look:/data# redis-cli --cluster reshard -a '123.Redis' 122.152.25.233:6381Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing Cluster Check (using node 122.152.25.233:6381)
M: 25a77b2ff812e77d11003a705db8b117a251cbca 122.152.25.233:6381 slots:[1365-5460] (4096 slots) master
1 additional replica(s)
M: ff548df96b7c21c870c45c1a1c5c4e7d6809020c 122.152.25.233:6382
slots:[6827-10922] (4096 slots) master
1 additional replica(s)
S: edef23f4c74af20b35768a5a4b5c7a9e9b8150a1 122.152.25.233:6384
slots: (0 slots) slave
replicates dc2da432af01aa6bcb2799a69b1bc1decc4fb408
S: 8c804b78e553e5ad75dde8a3809d3417881c5a09 122.152.25.233:6386
slots: (0 slots) slave
replicates ff548df96b7c21c870c45c1a1c5c4e7d6809020c
M: dc2da432af01aa6bcb2799a69b1bc1decc4fb408 122.152.25.233:6383
slots:[12288-16383] (4096 slots) master
1 additional replica(s)
S: 086621222eafbdcea8f86437ad0de4b80f7a4fc3 122.152.25.233:6385
slots: (0 slots) slave
replicates 25a77b2ff812e77d11003a705db8b117a251cbca
M: 637f60c94ae1d0049383503bccec0f4b0e7f708e 122.152.25.233:6387
slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master # 这里是4096 slots,下面就选择4096。
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? #4096
What is the receiving node ID? 25a77b2ff812e77d11003a705db8b117a251cbca #6381的ID
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: 637f60c94ae1d0049383503bccec0f4b0e7f708e #这里是6387要删除的节点ID,不是6388的。
然后选择done

查看节点id
redis-cli --cluster check 122.152.25.233:6381 -a 123.Redis

# 然后再删除第七个节点 6387 命令:redis-cli --cluster del-node ip:端口 6387节点ID
redis-cli -a 123.Redis --cluster del-node 122.152.25.233:6387 637f60c94ae1d0049383503bccec0f4b0e7f708e

评论


:D 一言句子获取中...

加载中,最新评论有1分钟缓存...