Docker搭建RedisCluster集群
部署Redis节点
拉取镜像
docker pull leaon/redis-cluster:0.0.1
创建节点
准备工作
- 配置redis.conf
- 每个节点的配置文件都需要修改文章最后会提供node1的redis. conf
# 不能设置密码,否则集群启动时会连接不上
# Redis服务器可以跨网络访问
bind 0.0.0.0
# 修改端口号(6个容器,分别配置7001,7002,7003,7004,7005,7006)
port 7001
# Redis后台启动
daemonize yes
# 开启aof持久化
appendonly yes
# 开启集群
cluster-enabled yes
# 集群的配置 配置文件首次启动自动生成(可以不配置)
cluster-config-file nodes_7001.conf
# 请求超时(可以不配置)
cluster-node-timeout 5000
- 配置文件不能设置密码,等集群创建完成后,通过命令设置密码
- 设置挂载配置目录和挂载数据目录
- 配置redis.conf目录
# ${local_path} 替换自己电脑的目录,将修改好的redis.conf 放置到该目录下
${local_path}/node1/redis-conf
- 配置数据目录
# ${local_path} 替换自己电脑的目录
${local_path}/node1/data
知识点
Redis集群TCP端口
每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比如7001,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,比如17001。第二个端口(本例中就是17001)用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权,等等。客户端从来都不应该尝试和这些集群总线端口通信,它们只应该和正常的Redis命令端口进行通信。注意,确保在你的防火墙中开放着两个端口,否则,Redis集群节点之间将无法通信。
命令端口和集群总线端口的偏移量总是10000。
-
注意,如果想要集群按照你想的那样工作,那么集群中的每个节点应该:
- 正常的客户端通信端口(通常是7001)用于和所有可到达集群的所有客户端通信
- 集群总线端口(the client port + 10000)必须对所有的其它节点是可到达的
-
也就是,要想集群正常工作,集群中的每个节点需要做到以下两点:
- 正常的客户端通信端口(通常是7001)必须对所有的客户端都开放,换言之,所有的客户端都可以访问
- 集群总线端口(客户端通信端口 + 10000)必须对集群中的其它节点开放,换言之,其它任意节点都可以访问
-
如果你没有开放TCP端口,你的集群可能不会像你期望的那样工作。集群总线用一个不同的二进制协议通信,用于节点之间的数据交换
启动创建节点
- node1
docker run -id \
--restart=always \
-p 7001:7001 \
-p 17001:17001 \
--name redis-node1 \
-v ${local_path}/node1/redis-conf:/usr/local/redis-conf \
-v ${local_path}/node1/data:/var/opt/redis leaon/redis-cluster:0.0.1
- node2
docker run -id \
--restart=always \
-p 7002:7002 \
-p 17002:17002 \
--name redis-node2 \
-v ${local_path}/node2/redis-conf:/usr/local/redis-conf \
-v ${local_path}/node2/data:/var/opt/redis leaon/redis-cluster:0.0.1
- node3
docker run -id \
--restart=always \
-p 7003:7003 \
-p 17003:17003 \
--name redis-node3 \
-v ${local_path}/node3/redis-conf:/usr/local/redis-conf \
-v ${local_path}/node3/data:/var/opt/redis leaon/redis-cluster:0.0.1
- node4
docker run -id \
--restart=always \
-p 7004:7004 \
-p 17004:17004 \
--name redis-node4 \
-v ${local_path}/node4/redis-conf:/usr/local/redis-con \
-v ${local_path}/node4/data:/var/opt/redis leaon/redis-cluster:0.0.1
- node5
docker run -id \
--restart=always \
-p 7005:7005 \
-p 17005:17005 \
--name redis-node5 \
-v ${local_path}/node5/redis-conf:/usr/local/redis-conf \
-v ${local_path}/node5/data:/var/opt/redis leaon/redis-cluster:0.0.1
- node6
docker run -id \
--restart=always \
-p 7006:7006 \
-p 17006:17006 \
--name redis-node6 \
-v ${local_path}/node6/redis-conf:/usr/local/redis-conf \
-v ${local_path}/node6/data:/var/opt/redis leaon/redis-cluster:0.0.1
查看容器状态
docker ps

部署集群
拉取镜像
docker pull leaon/redis-cluster-manager:0.0.1
创建集群
docker run -it \
--rm \
-e PASSWORD="leon"\
-e SLAVE_NODE_COUNT=1 \
-e NODES_ADDR="192.168.2.87:7001 192.168.2.87:7002 192.168.2.87:7003 192.168.2.87:7004 192.168.2.87:7005 192.168.2.87:7006" \
-e REDIS_CLI="redis-cli -h 192.168.2.87 -p 7001 -a leon -c"\
-e SINGLE_NODE_ADDR="192.168.2.87:7001"\
--name redis-cluster-manager \
leaon/redis-cluster-manager:0.0.1 create
-
创建需要使用到以下两个环境变量
SLAVE_NODE_COUNT: 每个主节点有几个从节点NODES_ADDR: 使用各个节点来创建集群
-
其他环境变量
PASSWORD: 设置密码需要的环境变量REDIS_CLI: 使用redis客户端命令连接redis集群SINGLE_NODE_ADDR: 单个节点测连接地址,用于测试集成各个节点是否正常
-
成功显示的日志
Can I set the above configuration?输入yes
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.2.87:7001
192.168.2.87:7002
192.168.2.87:7003
Adding replica 192.168.2.87:7005 to 192.168.2.87:7001
Adding replica 192.168.2.87:7006 to 192.168.2.87:7002
Adding replica 192.168.2.87:7004 to 192.168.2.87:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 60cf975871484e1ecf2e4eb3c1981ea2d666cc22 192.168.2.87:7001
slots:0-5460 (5461 slots) master
M: e7fe5954d2a3270a302b6ef21c43e0250997176d 192.168.2.87:7002
slots:5461-10922 (5462 slots) master
M: 5899457dc8744b30047e5bc3d1ca65333aaba736 192.168.2.87:7003
slots:10923-16383 (5461 slots) master
S: db51b5fa0f85f49cb99105121914c79649ded6f6 192.168.2.87:7004
replicates e7fe5954d2a3270a302b6ef21c43e0250997176d
S: 98c057216ebda124f8257270f753897cf151c42f 192.168.2.87:7005
replicates 5899457dc8744b30047e5bc3d1ca65333aaba736
S: ef09b78086ffcc08ec5fcbe4bfcb2465b5bed899 192.168.2.87:7006
replicates 60cf975871484e1ecf2e4eb3c1981ea2d666cc22
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 192.168.2.87:7001)
M: 60cf975871484e1ecf2e4eb3c1981ea2d666cc22 192.168.2.87:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 5899457dc8744b30047e5bc3d1ca65333aaba736 172.17.0.1:7003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: ef09b78086ffcc08ec5fcbe4bfcb2465b5bed899 172.17.0.1:7006
slots: (0 slots) slave
replicates 60cf975871484e1ecf2e4eb3c1981ea2d666cc22
S: 98c057216ebda124f8257270f753897cf151c42f 172.17.0.1:7005
slots: (0 slots) slave
replicates 5899457dc8744b30047e5bc3d1ca65333aaba736
M: e7fe5954d2a3270a302b6ef21c43e0250997176d 172.17.0.1:7002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: db51b5fa0f85f49cb99105121914c79649ded6f6 172.17.0.1:7004
slots: (0 slots) slave
replicates e7fe5954d2a3270a302b6ef21c43e0250997176d
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
显示集群信息
docker run -it \
--rm \
leaon/redis-cluster:0.0.1 \
redis-cli -h 192.168.2.87 -p 7001 cluster nodes
- 日志
5899457dc8744b30047e5bc3d1ca65333aaba736 172.17.0.1:7003@17003 master - 0 1626240193858 3 connected 10923-16383
ef09b78086ffcc08ec5fcbe4bfcb2465b5bed899 172.17.0.1:7006@17006 slave 60cf975871484e1ecf2e4eb3c1981ea2d666cc22 0 1626240194880 6 connected
60cf975871484e1ecf2e4eb3c1981ea2d666cc22 172.17.0.2:7001@17001 myself,master - 0 1626240193000 1 connected 0-5460
98c057216ebda124f8257270f753897cf151c42f 172.17.0.1:7005@17005 slave 5899457dc8744b30047e5bc3d1ca65333aaba736 0 1626240195890 5 connected
e7fe5954d2a3270a302b6ef21c43e0250997176d 172.17.0.1:7002@17002 master - 0 1626240194000 2 connected 5461-10922
db51b5fa0f85f49cb99105121914c79649ded6f6 172.17.0.1:7004@17004 slave e7fe5954d2a3270a302b6ef21c43e0250997176d 0 1626240192837 4 connected
- 每个主从节点分配情况
slave ef09b78086ffcc08ec5fcbe4bfcb2465b5bed899 master 60cf975871484e1ecf2e4eb3c1981ea2d666cc22 0-5460
slave db51b5fa0f85f49cb99105121914c79649ded6f6 master e7fe5954d2a3270a302b6ef21c43e0250997176d 5461-10922
slave 98c057216ebda124f8257270f753897cf151c42f master 5899457dc8744b30047e5bc3d1ca65333aaba736 10923-16383
设置每个节点的密码
设置密码相关命令
192.168.2.87:7001> config set masterauth leon
192.168.2.87:7001> config set requirepass leon
192.168.2.87:7001> auth leon
192.168.2.87:7001> config rewrite
节点设置
- node1
docker run -it \
--rm \
leaon/redis-cluster:0.0.1 \
redis-cli -h 192.168.2.87 -p 7001 -c

操作完成退出容器执行exit
- node2
docker run -it \
--rm \
leaon/redis-cluster:0.0.1 \
redis-cli -h 192.168.2.87 -p 7002 -c

- node3
docker run -it \
--rm \
leaon/redis-cluster:0.0.1 \
redis-cli -h 192.168.2.87 -p 7003 -c

- node4
docker run -it \
--rm \
leaon/redis-cluster:0.0.1 \
redis-cli -h 192.168.2.87 -p 7004 -c

- node5
docker run -it \
--rm \
leaon/redis-cluster:0.0.1 \
redis-cli -h 192.168.2.87 -p 7005 -c

- node6
docker run -it \
--rm \
leaon/redis-cluster:0.0.1 \
redis-cli -h 192.168.2.87 -p 7006 -c

通过密码连接集群
docker run -it \
--rm \
leaon/redis-cluster:0.0.1 \
redis-cli -h 192.168.2.87 -p 7001 -a leon -c

执行 set name leon 连接的是7001节点数据被分配到了5798槽在7002 节点上
检查集群状态
docker run -it \
--rm \
-e PASSWORD="leon"\
-e SLAVE_NODE_COUNT=1 \
-e NODES_ADDR="192.168.2.87:7001 192.168.2.87:7002 192.168.2.87:7003 192.168.2.87:7004 192.168.2.87:7005 192.168.2.87:7006" \
-e REDIS_CLI="redis-cli -h 192.168.2.87 -p 7001 -a leon -c"\
-e SINGLE_NODE_ADDR="192.168.2.87:7001"\
--name redis-cluster-manager \
leaon/redis-cluster-manager:0.0.1 checkNode

浙公网安备 33010602011771号