Docker 部署 Redis5.0 集群,以及 ioredis 连接集群

Redis的高可用模式分为两种——集群模式和哨兵模式,本文主要介绍基于docker部署集群的方法。

  • 此处使用docker compose进行部署,首先需要下载redis镜像
1
docker pull redis
  • 创建redis集群文件夹
1
2
3
# 假设集群的slot分配为3份,副本数为1,则共需要6个节点
# 创建7000, 7001, 7002, 7003, 7004, 7005 共6个文件夹
mkdir 7000
  • 在以上6个文件夹中分别创建redis配置文件,其中端口号根据节点文件夹名称保持一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 文件名:redis.conf
## 节点端口:7000, 7001, 7002, 7003, 7004, 7005
port 7000

## cluster集群模式
cluster-enabled yes

## 集群配置名
cluster-config-file nodes.conf

## 关闭保护模式
#protected-mode no

## 超时时间
cluster-node-timeout 5000

## 持久化模式
appendonly yes
  • 创建集群的docker网络
1
2
# 网络名称redis-cluster,下一步用到,默认使用bridge模式
docker network redis-cluster
  • 在集群文件夹根目录下创建docker compose配置文件
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 文件名:docker-compose.yml
redis-7000:
# 基于redis镜像构建
image: redis
# 使用上一步创建的docker网络
net: "redis-cluster"
restart: always
privileged: true
# 对外暴露redis连接端口7000,以及集群间相互通讯的端口17000,通讯端口=连接端口+10000
ports:
- 7000:7000
- 17000:17000
# 映射配置文件和数据存储文件夹到redis节点容器内部
volumes:
- /redis-cluster/7000/redis.conf:/etc/redis/redis.conf
- /redis-cluster/7000/data:/data
# 默认执行命令,使用redis.conf启动redis
command: ["redis-server", "/etc/redis/redis.conf"]
redis-7001:
image: redis
net: "redis-cluster"
restart: always
privileged: true
ports:
- 7001:7001
- 17001:17001
volumes:
- /redis-cluster/7001/redis.conf:/etc/redis/redis.conf
- /redis-cluster/7001/data:/data
command: ["redis-server", "/etc/redis/redis.conf"]
redis-7002:
image: redis
net: "redis-cluster"
restart: always
privileged: true
ports:
- 7002:7002
- 17002:17002
volumes:
- /redis-cluster/7002/redis.conf:/etc/redis/redis.conf
- /redis-cluster/7002/data:/data
command: ["redis-server", "/etc/redis/redis.conf"]
redis-7003:
image: redis
net: "redis-cluster"
restart: always
privileged: true
ports:
- 7003:7003
- 17003:17003
volumes:
- /redis-cluster/7003/redis.conf:/etc/redis/redis.conf
- /redis-cluster/7003/data:/data
command: ["redis-server", "/etc/redis/redis.conf"]
redis-7004:
image: redis
net: "redis-cluster"
restart: always
privileged: true
ports:
- 7004:7004
- 17004:17004
volumes:
- /redis-cluster/7004/redis.conf:/etc/redis/redis.conf
- /redis-cluster/7004/data:/data
command: ["redis-server", "/etc/redis/redis.conf"]
redis-7005:
image: redis
net: "redis-cluster"
restart: always
privileged: true
ports:
- 7005:7005
- 17005:17005
volumes:
- /redis-cluster/7005/redis.conf:/etc/redis/redis.conf
- /redis-cluster/7005/data:/data
command: ["redis-server", "/etc/redis/redis.conf"]
  • 启动docker容器
1
docker-compose up -d

启动完成后,查看容器情况

1
2
3
4
5
docker ps

CONTAINER ID IMAGE COMMAND PORTS NAMES
e3b9b2104d16 redis "docker-entrypoint.s…" 0.0.0.0:7005->7005/tcp, 6379/tcp, 0.0.0.0:17005->17005/tcp redis-cluster_redis-7005_1
......

查看各容器IP

1
2
3
4
5
6
7
8
9
10
11
12
docker network inspect redis-cluster

## 可以查看到redis-cluster网络下,各节点的内网IP,示例如下
"e3b9b2104d16fef938efde2a82da4a919c3fff456657a3c166f79325ceb3969c": {
"Name": "redis-cluster_redis-7005_1",
"EndpointID": "56467236c42862e73f924371fa2145f91c48b0aa6ccd7304b22e7329f00e32d4",
"MacAddress": "02:42:ac:14:00:07",
## 可以看到7005节点的内网IP是172.20.0.7
"IPv4Address": "172.20.0.7/16",
"IPv6Address": ""
},
......
  • 根据上面查到的IP地址构建集群关联命令,并执行,其中需要输入 yes 进行确认
1
2
# 按照 ip:端口 的模式拼接6个节点的信息
redis-cli --cluster create 172.20.0.2:7000 172.20.0.4:7001 172.20.0.5:7002 172.20.0.6:7003 172.20.0.3:7004 172.20.0.7:7005 --cluster-replicas 1
  • 测试集群情况
1
2
3
4
5
6
7
8
9
redis-cli -p 7000 cluster nodes

# 出现以下信息表示集群构建成功
1c5811fde15d56bbbbf68aa55b6b6a6523a7781a 172.20.0.6:7003@17003 slave b9697bec499b47020753397f99d5eb0fb1340616 0 1550471531098 4 connected
b9697bec499b47020753397f99d5eb0fb1340616 172.20.0.2:7000@17000 myself,master - 0 1550471530000 1 connected 0-5460
4b37f8c44aeaab184b423926a384081e27d2d97d 172.20.0.7:7005@17005 slave e991cb1601d557f97fb89b2a8eee3daaa479ef67 0 1550471530000 6 connected
e991cb1601d557f97fb89b2a8eee3daaa479ef67 172.20.0.5:7002@17002 master - 0 1550471529880 3 connected 10923-16383
42ddc0966cc80b9795bf45f4f826c93991db0af2 172.20.0.4:7001@17001 master - 0 1550471529000 2 connected 5461-10922
c11ea451ba7fd6ae21e8ce6043981fa3f2aaddaa 172.20.0.3:7004@17004 slave 42ddc0966cc80b9795bf45f4f826c93991db0af2 0 1550471530896 5 connected
  • ioredis

集群构建成功后,如果使用ioredis连接,需要声明natMap属性,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import Redis from 'ioredis'

// 外部地址和端口
let cluster = [
{host: 'localhost', port: 7000},
{host: 'localhost', port: 7001},
{host: 'localhost', port: 7002},
{host: 'localhost', port: 7003},
{host: 'localhost', port: 7004},
{host: 'localhost', port: 7005}
]
let options = {
// 声明每个内网 IP:端口 对应的外部地址和端口
natMap: {
'172.20.0.2:7000': {host: 'localhost', port: 7000},
'172.20.0.4:7001': {host: 'localhost', port: 7001},
'172.20.0.5:7002': {host: 'localhost', port: 7002},
'172.20.0.6:7003': {host: 'localhost', port: 7003},
'172.20.0.3:7004': {host: 'localhost', port: 7004},
'172.20.0.7:7005': {host: 'localhost', port: 7005}
}
}
const client = new Redis.Cluster(cluster, options)
分享到