Docker搭建RedisCluster集群

部署Redis节点

拉取镜像

 docker pull leaon/redis-cluster:0.0.1

创建节点

准备工作

  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
  • 配置文件不能设置密码,等集群创建完成后,通过命令设置密码
  1. 设置挂载配置目录和挂载数据目录
  • 配置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

获取 node1- redis.conf

posted @ 2021-07-14 14:01  LeonDai  阅读(206)  评论(0)    收藏  举报