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
脚本的执行步骤如下:
-
使用
seq
命令生成一个从 1 到 6 的数字序列,表示要创建的 Redis 节点的数量。 -
对于每个节点,执行以下操作:
- 使用
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 容器,并将容器与自定义网络和宿主机目录进行了关联。
脚本的执行步骤如下:
-
使用
seq
命令生成一个从 1 到 6 的数字序列,表示要创建的 Redis 容器的数量。 -
对于每个容器,执行以下操作:
- 使用
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