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步
  1. 首先,使用docker ps -a命令查看当前正在运行的容器列表。确认Redis集群相关的容器已经处于停止状态。如果没有停止,则需要先停止这些容器。

  2. 然后,使用docker rm <container_id>命令来删除每个Redis节点对应的容器。其中,为每个Redis节点所对应的容器ID。重复此步骤直到删除完所有Redis节点的容器。

  3. 接下来,使用docker network ls命令查看网络列表,并记录Redis集群所属的网络名称(network name)。

  4. 最后,使用docker network rm <network_name>命令来删除该网络。其中,为第三步中获取到的Redis集群所属的网络名称。

  5. 至此,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错误:

 

end.
posted on 2024-02-03 14:12  梦幻朵颜  阅读(491)  评论(0编辑  收藏  举报