2024年2月笔记:Redis7.2.4版本在Mac电脑的Docker里安装Redis集群,但是SprintBoot连接不到Docker内部网络IP地址的Redis集群
本文环境:Mac电脑,Brew和Docker都已安装好,Redis版本: 7.2.4
第1步,验证Docker和Brew
docker --version // 查看docker版本,此处忽略安装Docker步骤
brew --version //查看版本号
第2步,创建Redis集群网络
docker network create redis-cluster-net // 创建一个名为redis-cluster-net的集群网络
第3步,安装6个Redis节点
在CMD里依次分6次执行下面6行命令:
第1行命令: docker run -d --name redis_node_1 --net redis-cluster-net -p 7001:6379 redis redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --masterauth myredis --requirepass myredis
第2行命令: docker run -d --name redis_node_2 --net redis-cluster-net -p 7002:6379 redis redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --masterauth myredis --requirepass myredis
第3行命令: docker run -d --name redis_node_3 --net redis-cluster-net -p 7003:6379 redis redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --masterauth myredis --requirepass myredis
第4行命令: docker run -d --name redis_node_4 --net redis-cluster-net -p 7004:6379 redis redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --masterauth myredis --requirepass myredis
第5行命令: docker run -d --name redis_node_5 --net redis-cluster-net -p 7005:6379 redis redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --masterauth myredis --requirepass myredis
第6行命令: docker run -d --name redis_node_6 --net redis-cluster-net -p 7006:6379 redis redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --masterauth myredis --requirepass myredis
以上指令参数分析:
--name redis_node_1 // 节点名称,六个节点,6个名称
--net redis-cluster-net // 设置集群网络
-p 7001:6379 // 端口映射:把docker容器里的6379端口映射到宿主机的7001
--port 6379 // redis端口
--cluster-enabled yes // 启用集群
--cluster-config-file nodes.conf // 集群配置
--cluster-node-timeout 5000 // 集群5秒超时时间
--appendonly yes
--bind 0.0.0.0 // 所有IP都通用
--requirepass myredis // 设置redis访问密码,用于后续redis cluster,这里设置的密码是:myredis
第4步,获取6个节点的Docker容器IP地址
docker ps // 执行该指令获得每一个节点的container ID
zhuw118@DWN4T9CF61 ~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
91a40f55111c redis "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:7006->6379/tcp redis_node_6
1c5ab47d21e6 redis "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:7005->6379/tcp redis_node_5
eb845a117356 redis "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:7004->6379/tcp redis_node_4
f0ae829078ec redis "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:7003->6379/tcp redis_node_3
81d5b5648902 redis "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:7002->6379/tcp redis_node_2
2e8631603678 redis "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:7001->6379/tcp redis_node_1
以节点1为例,获得节点1容器的IP地址指令为:
docker inspect 2e8631603678 // 执行完指令之后,从一大堆返回的Json对象里找到IPAddress字段的值就是IP,举例:"IPAddress": "172.18.0.7"
第5步,创建Redis集群
参数-a myredis表明指定redis cluster的密码为myredis,从第4步为每一个节点获取IP之后,创建Redis集群指令:
docker exec -it redis_node_1 redis-cli --cluster create 172.18.0.2:6379 172.18.0.3:6379 172.18.0.4:6379 172.18.0.5:6379 172.18.0.6:6379 172.18.0.7:6379 --cluster-replicas 1 -a myredis
以下是执行上述指令的整个执行过程,过程中需要手动输入yes:
zhuw118@DWN4T9CF61 ~ % docker exec -it redis_node_1 redis-cli --cluster create 172.18.0.2:6379 172.18.0.3:6379 172.18.0.4:6379 172.18.0.5:6379 172.18.0.6:6379 172.18.0.7:6379 --cluster-replicas 1 -a myredis
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.18.0.6:6379 to 172.18.0.2:6379
Adding replica 172.18.0.7:6379 to 172.18.0.3:6379
Adding replica 172.18.0.5:6379 to 172.18.0.4:6379
M: 6e3def316890a3199250abb5939d83eb8e08167a 172.18.0.2:6379
slots:[0-5460] (5461 slots) master
M: 5e505fb61243affe0be53e460162a7d21453cb00 172.18.0.3:6379
slots:[5461-10922] (5462 slots) master
M: 620cc2469d42fe7ad5926e97a2592540e0d84d81 172.18.0.4:6379
slots:[10923-16383] (5461 slots) master
S: f6fbf813273a01967751460b4abd8ebde5d21954 172.18.0.5:6379
replicates 620cc2469d42fe7ad5926e97a2592540e0d84d81
S: e4ab08c6d21283ebb4b6583744f5727e51d5e9c5 172.18.0.6:6379
replicates 6e3def316890a3199250abb5939d83eb8e08167a
S: 531a72fac638744f4a755962058a64f3ef062cfb 172.18.0.7:6379
replicates 5e505fb61243affe0be53e460162a7d21453cb00
Can I set the above configuration? (type 'yes' to accept): yes // 需要手动输入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 172.18.0.2:6379)
M: 6e3def316890a3199250abb5939d83eb8e08167a 172.18.0.2:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 620cc2469d42fe7ad5926e97a2592540e0d84d81 172.18.0.4:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: f6fbf813273a01967751460b4abd8ebde5d21954 172.18.0.5:6379
slots: (0 slots) slave
replicates 620cc2469d42fe7ad5926e97a2592540e0d84d81
S: e4ab08c6d21283ebb4b6583744f5727e51d5e9c5 172.18.0.6:6379
slots: (0 slots) slave
replicates 6e3def316890a3199250abb5939d83eb8e08167a
M: 5e505fb61243affe0be53e460162a7d21453cb00 172.18.0.3:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 531a72fac638744f4a755962058a64f3ef062cfb 172.18.0.7:6379
slots: (0 slots) slave
replicates 5e505fb61243affe0be53e460162a7d21453cb00
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered. // 所有slot分配完毕,Redis集群创建成功
第6步,删除Docker里的Redis集群和网络
第6步只有创建错了集群才需要执行,否则跳过第6步-
首先,使用
docker ps -a
命令查看当前正在运行的容器列表。确认Redis集群相关的容器已经处于停止状态。如果没有停止,则需要先停止这些容器。 -
然后,使用
docker rm <container_id>
命令来删除每个Redis节点对应的容器。其中,为每个Redis节点所对应的容器ID。重复此步骤直到删除完所有Redis节点的容器。 -
接下来,使用
docker network ls
命令查看网络列表,并记录Redis集群所属的网络名称(network name)。 -
最后,使用
docker network rm <network_name>
命令来删除该网络。其中,为第三步中获取到的Redis集群所属的网络名称。 -
至此,Redis集群及其相关容器都被成功从Docker中删除了。
第7步,SpringBoot连接不上Docker内部网络IP的Redis集群
感谢参考文章:Docker环境下秒建Redis集群,连SpringBoot也整上了!
之前几个步骤创建出来的Redis Cluster是基于Docker内网IP(172.18.0.2, 172.18.0.3, 172.18.0.4, 172.18.0.5, 172.18.0.6, 172.18.0.7)去创建的,但是宿主机的Sprintboot要想连接上Docker的IP,会访问不通,SrintBoot项目启动会报IP连接不上的time out错误: