Docker(10)容器互联-Redis集群部署

Redis(Remote Dictionary Server)是一个开源的内存键值存储数据库,它以键值对的形式存储数据,并提供多种数据结构的支持。Redis 是一个快速、可靠和灵活的数据库解决方案,它被广泛用于构建高性能的应用程序。

Redis集群部署的模型图

部署Redis集群 

删除其他的容器

root@hongpon316:~# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED        STATUS        PORTS                                                  NAMES
07e6f334c321   tomcat             "catalina.sh run"        23 hours ago   Up 23 hours   0.0.0.0:32772->8080/tcp, :::32772->8080/tcp            tomcat05
d472a58bcf26   tomcat             "catalina.sh run"        23 hours ago   Up 23 hours   0.0.0.0:32771->8080/tcp, :::32771->8080/tcp            tomcat04
699cff4e1526   tomcat             "catalina.sh run"        27 hours ago   Up 27 hours   0.0.0.0:32770->8080/tcp, :::32770->8080/tcp            tomcat03
8bd3561ce83e   tomcat             "catalina.sh run"        27 hours ago   Up 27 hours   0.0.0.0:32769->8080/tcp, :::32769->8080/tcp            tomcat02
3a60d303a920   tomcat             "catalina.sh run"        27 hours ago   Up 27 hours   0.0.0.0:32768->8080/tcp, :::32768->8080/tcp            tomcat01
06fc845f47f0   tomcat_build:1.0   "/bin/sh -c '/usr/lo…"   4 days ago     Up 4 days     0.0.0.0:8088->8080/tcp, :::8088->8080/tcp              diytomcat
ef866de2d9f9   mysql              "docker-entrypoint.s…"   13 days ago    Up 10 days    0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
root@hongpon316:~# docker rm -f $(docker ps -aq)
07e6f334c321
d472a58bcf26
699cff4e1526
8bd3561ce83e
3a60d303a920
06fc845f47f0
ef866de2d9f9
9929bcfcca9a
root@hongpon316:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

创建自定义的网络redis 

root@hongpon316:~# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
46c431eaa4b4   bridge    bridge    local
e2ae99a1a00f   host      host      local
c5c9cb55d25f   mynet     bridge    local
65b88f0e593e   none      null      local
root@hongpon316:~# docker network create redis --subnet 172.38.0.0/16
6a5fd2103eff7a63fc0e45f8c6de8bfe57f3b04e6a510b136023e68dda539612
root@hongpon316:~# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
46c431eaa4b4   bridge    bridge    local
e2ae99a1a00f   host      host      local
c5c9cb55d25f   mynet     bridge    local
65b88f0e593e   none      null      local
6a5fd2103eff   redis     bridge    local

通过shell脚本创建redis的配置信息 

脚本是用于在指定目录下创建 Redis 配置文件的脚本,与之前提供的脚本相同。它使用循环创建多个 Redis 节点的配置文件,并设置了一些常见的 Redis 配置选项。

for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379 
bind 0.0.0.0
cluster-enabled yes 
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

脚本的执行步骤如下:

  1. 使用 seq 命令生成一个从 1 到 6 的数字序列,表示要创建的 Redis 节点的数量。

  2. 对于每个节点,执行以下操作:

    • 使用 mkdir -p 命令创建一个目录,路径为 /mydata/redis/node-${port}/conf。这将创建一个用于存放 Redis 配置文件的目录。${port} 是当前循环迭代的端口号。
    • 使用 touch 命令创建一个空的 Redis 配置文件,路径为 /mydata/redis/node-${port}/conf/redis.conf
    • 使用 cat << EOF > /mydata/redis/node-${port}/conf/redis.conf 命令将 Redis 配置内容写入到刚创建的配置文件中。
    • 将 Redis 配置内容写入到文件中。配置包括端口号、绑定 IP 地址、集群配置、主从复制配置等。

总结来说,这个脚本根据循环迭代的端口号,在指定的目录下创建了多个 Redis 节点的配置文件。每个配置文件都包含了一组预定义的 Redis 配置选项。

注意,这只是创建 Redis 配置文件的脚本,还需要进一步的步骤来启动和配置实际的 Redis 节点。

参数说明:

  • port 6379:指定 Redis 服务监听的端口号为 6379。客户端可以通过该端口连接到 Redis 服务。

  • bind 0.0.0.0:将 Redis 服务绑定到所有可用的网络接口上,允许从任意 IP 地址访问 Redis。

  • cluster-enabled yes:启用 Redis 集群模式,允许将多个 Redis 节点组成一个集群。

  • cluster-config-file nodes.conf指定 Redis 集群的配置文件为 nodes.conf。该文件用于存储集群的状态信息。

  • cluster-node-timeout 5000:设置 Redis 集群中节点之间的超时时间,单位为毫秒。如果一个节点在超过该时间内没有收到其他节点的回复,则认为该节点已下线。

  • cluster-announce-ip 172.38.0.11:设置节点在集群中广播的 IP 地址为 172.38.0.11

  • cluster-announce-port 6379:设置节点在集群中广播的端口号

  • cluster-announce-bus-port 16379:设置节点在集群中广播总线的端口号。节点使用总线端口进行内部通信。

  • appendonly yes启用 Redis 的持久化功能,并将数据以追加方式写入到磁盘上的日志文件中,以防止数据丢失。

启动和配置实际的 Redis 节点 

下面启动6个Redis容器,设置对应的容器数据卷挂载

#第1个Redis容器
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
    -v /mydata/redis/node-1/data:/data \
    -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#第2个Redis容器
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
    -v /mydata/redis/node-2/data:/data \
    -v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#第3个Redis容器
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
    -v /mydata/redis/node-3/data:/data \
    -v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#第4个Redis容器
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
    -v /mydata/redis/node-4/data:/data \
    -v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#第5个Redis容器
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
    -v /mydata/redis/node-5/data:/data \
    -v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#第6个Redis容器
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
    -v /mydata/redis/node-6/data:/data \
    -v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

使用脚本替换可一次性创建 

for port in $(seq 1 6); \
do
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \
done

 这段脚本是用于在 Docker 中运行多个 Redis 容器的脚本,它使用循环创建并启动了多个 Redis 容器,并将容器与自定义网络和宿主机目录进行了关联。

脚本的执行步骤如下:

  1. 使用 seq 命令生成一个从 1 到 6 的数字序列,表示要创建的 Redis 容器的数量。

  2. 对于每个容器,执行以下操作:

    • 使用 docker run 命令创建并运行 Redis 容器。
    • -p 637${port}:6379 -p 1637${port}:16379:将宿主机的端口映射到容器内的 Redis 服务端口,${port} 是当前循环迭代的端口号。
    • --name redis-${port}:指定容器的名称,${port} 是当前循环迭代的端口号。
    • -v /mydata/redis/node-${port}/data:/data:将 Redis 容器的数据目录与宿主机上的 /mydata/redis/node-${port}/data 目录进行挂载,以持久化保存数据。
    • -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf:将 Redis 容器的配置文件与宿主机上的 /mydata/redis/node-${port}/conf/redis.conf 文件进行挂载,以提供自定义的配置。
    • -d:在后台运行容器。
    • --net redis --ip 172.38.0.1${port}:将容器连接到名为 redis 的自定义网络,并为容器指定 IP 地址,${port} 是当前循环迭代的端口号。
    • redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf:指定 Redis 镜像和要运行的 Redis 服务命令

注意,该脚本假定你已经在宿主机上创建了相关的目录,并且已经通过 docker network create 命令创建了名为 redis 的自定义网络。在运行脚本之前,请确保满足这些前提条件。 

进入到redis-1容器中创建集群

使用jq工具查看redis-1容器的ip

root@hongpon316:/# docker inspect redis-1 | jq -r '.[].NetworkSettings.Networks[].IPAddress'
172.38.0.11

进入redis-1容器部署集群

root@hongpon316:/# docker exec -it redis-1 /bin/sh
/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 -
-cluster-replicas 1
>>> 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.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: e6838f202f66a6c3ffcaf94470861f506eaf5de6 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: 45d3a0fe669f706b6fbfde656236069b3c22688a 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: d983fe5f7e43d8b91319ee849463d13b5028e05c 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: 2828aeace6dc9cbed315cbd5c0e496b8f7658f77 172.38.0.14:6379
   replicates d983fe5f7e43d8b91319ee849463d13b5028e05c
S: 228dd715068577934040025d0ede551c9a9ac7e3 172.38.0.15:6379
   replicates e6838f202f66a6c3ffcaf94470861f506eaf5de6
S: 69ad2dc98e7f947d718544ec26037c25f149a590 172.38.0.16:6379
   replicates 45d3a0fe669f706b6fbfde656236069b3c22688a
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 172.38.0.11:6379)
M: e6838f202f66a6c3ffcaf94470861f506eaf5de6 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 228dd715068577934040025d0ede551c9a9ac7e3 172.38.0.15:6379
   slots: (0 slots) slave
   replicates e6838f202f66a6c3ffcaf94470861f506eaf5de6
S: 69ad2dc98e7f947d718544ec26037c25f149a590 172.38.0.16:6379
   slots: (0 slots) slave
   replicates 45d3a0fe669f706b6fbfde656236069b3c22688a
S: 2828aeace6dc9cbed315cbd5c0e496b8f7658f77 172.38.0.14:6379
   slots: (0 slots) slave
   replicates d983fe5f7e43d8b91319ee849463d13b5028e05c
M: d983fe5f7e43d8b91319ee849463d13b5028e05c 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 45d3a0fe669f706b6fbfde656236069b3c22688a 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

查看集群信息

redis-cli -c:启动 Redis 客户端,并使用集群模式连接到 Redis 集群

cluster info:查看 Redis 集群的信息

 参数说明:

  • cluster_slots_assigned 表示已分配的哈希槽数量,16384 表示全部哈希槽都已被分配。
  • cluster_slots_ok 表示正常运行的哈希槽数量,16384 表示所有哈希槽都正常运行。
  • cluster_slots_pfail 和 cluster_slots_fail 分别表示部分节点和全部节点故障的哈希槽数量,这两个值都为 0,表示没有故障节点。
  • cluster_known_nodes 表示集群中已知的节点数量,这里是 6 个节点
  • cluster_size 表示集群的大小,这里是 3,表示有 3 个主节点
  • cluster_current_epoch 表示当前的集群纪元(epoch)。
  • cluster_my_epoch 表示当前节点的纪元。
  • cluster_stats_messages 相关的统计信息包括发送和接收的消息数量。

查看节点信息

cluster nodes:查看 Redis 集群中的节点信息

可以很清楚的看到主从节点的信息

 测试主从复制是否生效

set key1 value1:

在主节点上执行了 set key1 value1 命令,并且输出显示已成功执行(OK)。然后,Redis 返回了一个重定向信息,指示该键位于槽位 [9189],位于 IP 地址为 172.38.0.12、端口号为 6379 的节点上。

接下来,可以在 IP 地址为 172.38.0.12、端口号为 6379 的节点上进行操作。

新建一个shell会话,停止172.38.0.12:6379(即redis-2)的容器服务

docker inspect redis-2 | jq -r '.[].NetworkSettings.Networks[].IPAddress'

 返回最开始的shell会话,重新连接redis-cli集群客户端,再次获取key1

参考信息 

Docker网络详解与实战_10.126.130.4/24_Code0cean的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用docker-compose部署Redis集群的步骤: 1.创建一个目录,例如redis-cluster,并在该目录中创建一个docker-compose.yaml文件。 2.在docker-compose.yaml文件中编写以下内容: ```yaml version: '3' services: redis-1: image: redis:6.0.9 command: redis-server /usr/local/etc/redis/redis.conf volumes: - ./redis.conf:/usr/local/etc/redis/redis.conf ports: - "6379" networks: - redis-cluster redis-2: image: redis:6.0.9 command: redis-server /usr/local/etc/redis/redis.conf volumes: - ./redis.conf:/usr/local/etc/redis/redis.conf ports: - "6380" networks: - redis-cluster redis-3: image: redis:6.0.9 command: redis-server /usr/local/etc/redis/redis.conf volumes: - ./redis.conf:/usr/local/etc/redis/redis.conf ports: - "6381" networks: - redis-cluster networks: redis-cluster: driver: bridge ``` 3.在redis-cluster目录中创建一个redis.conf文件,并将以下内容复制到文件中: ```conf bind 0.0.0.0 port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes requirepass 1111 masterauth 1111 ``` 4.在终端中导航到redis-cluster目录,并运行以下命令启动Redis集群: ```shell docker-compose up -d ``` 5.使用以下命令进入redis-1容器: ```shell docker exec -it redis-cluster_redis-1_1 /bin/bash ``` 6.在redis-1容器中,使用以下命令创建Redis集群: ```shell redis-cli --cluster create 172.20.0.2:6379 172.20.0.3:6379 172.20.0.4:6379 --cluster-replicas 0 ``` 7.现在,您已经成功地使用docker-compose部署Redis集群
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值