微服务-18 缓存高可用使用Docker Compose搭建Redis分片集群6台节点
使用DockerCompose搭建6节点Redis分片集群
1、首先要保证我们本地安装了Docker 和Docker-compose服务,具备搭建的环境


或者使用 docker compose version 命令,具体看你是怎么安装的docker compose

2、 配置docker-compose.yml文件,这里我们使用docker-comnpose来管理6个节点
是否起开集群 "--cluster-enabled", "yes",
保存集群中的状态由redis生成 --cluster-config-file", "/data/nodes.conf"
集群之间链接超时时间 "--cluster-node-timeout", "5000"
开启写入磁盘操作 "--appendonly", "yes"
version: '3'
services:
redis-node1:
image: redis:latest
ports:
- "7001:6379"
networks:
- redis-net
command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
redis-node2:
image: redis:latest
ports:
- "7002:6380"
networks:
- redis-net
command: ["redis-server", "--port", "6380", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
redis-node3:
image: redis:latest
ports:
- "7003:6381"
networks:
- redis-net
command: ["redis-server", "--port", "6381", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
redis-node4:
image: redis:latest
ports:
- "7004:6382"
networks:
- redis-net
command: ["redis-server", "--port", "6382", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
redis-node5:
image: redis:latest
ports:
- "7005:6383"
networks:
- redis-net
command: ["redis-server", "--port", "6383", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
redis-node6:
image: redis:latest
ports:
- "7006:6384"
networks:
- redis-net
command: ["redis-server", "--port", "6384", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
networks:
redis-net:
3、在和docker-compose.yml文件同文件夹下 执行 docker-compose up -d 启动服务,等一会 查看 docker ps 查看 redis状态是否运行

使用docker ps 来看我们的容器是否成功运行起来了如下

4、如果想关闭docker-compose 请使用 docker-compose down 命令 (如果想继续测试就不要关了)

5、创建集群
接下来 我们需要进入到某个node节点里进行创建集群,这里我们先查看已经启动的6个redis节点的ip地址
5.1使用命令 来查看6台节点的内网IP地址,我的6台节点名称分别是
redis-cluster-redis-node1-1 redis-cluster-redis-node2-1 redis-cluster-redis-node3-1 redis-cluster-redis-node4-1 redis-cluster-redis-node5-1 redis-cluster-redis-node6-1
我们分别获取这6台节点的内网IP (这个IP是docker容器分配的,每次都可能会变)
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 节点名称

5.2获取到了所有节点的IP之后 我们进入到redis-cluster-redis-node1-1节点创建集群 --cluster-replicas 0 代表每个主节点有0个副本节点 1代表着每个主节点有1个副本
docker exec -it redis-cluster-redis-node1-1 redis-cli --cluster create 172.21.0.7:6379 172.21.0.2:6380 172.21.0.3:6381 172.21.0.4:6382 172.21.0.5:6383 172.21.0.6:6384 --cluster-replicas 1
5.3 集群分槽确定 redis集群会自动分配主节点和从节点,并且按照比例给主节点分槽,如果你同意他的方式请输入 YES

6、检查集群是否启动 ,可以随意进入到一个节点里 输入 cluster info 命令 就能看到 集群是否集群成功了,看到如下 cluster_state:ok 这是已经创建完成了
docker exec -it redis-cluster-redis-node4-1 redis-cli -p 6382 cluster info

解释一下 上面打印出来的信息
cluster_state: ok: 表示 Redis 集群的状态正常,一切正常运行。 cluster_slots_assigned: 16384: 表示集群中有多少个槽位被分配。在 Redis 集群中,数据被划分为一系列的槽位,每个槽位负责存储一部分数据。 cluster_slots_ok: 16384: 表示所有槽位都正常运行,没有出现问题的槽位数量。 cluster_slots_pfail: 0: 表示处于 PFAIL(partial fail)状态的槽位数量。PFAIL 表示槽位的某个节点认为槽位的主节点可能已经失效,但还没有达到完全失败的状态。 cluster_slots_fail: 0: 表示处于 FAIL 状态的槽位数量。FAIL 表示槽位的主节点已经完全失效。 cluster_known_nodes: 6: 表示集群中已知的节点数量,即集群中有多少个节点。 cluster_size: 3: 表示集群的规模,即集群中有多少个节点是处于激活状态的。 cluster_current_epoch: 6: 表示集群的当前纪元(epoch),纪元用于管理节点间的通信和集群的状态变更。 cluster_my_epoch: 3: 表示当前节点所处的纪元。 cluster_stats_messages_ping_sent: 1453: 表示发送的 ping 消息的数量。 cluster_stats_messages_pong_sent: 1452: 表示发送的 pong 消息的数量。 cluster_stats_messages_meet_sent: 1: 表示发送的 meet 消息的数量。MEET 消息用于节点发现。 cluster_stats_messages_sent: 2906: 表示总共发送的消息数量。 cluster_stats_messages_ping_received: 1452: 表示接收到的 ping 消息的数量。 cluster_stats_messages_pong_received: 1454: 表示接收到的 pong 消息的数量。 cluster_stats_messages_received: 2906: 表示总共接收到的消息数量。
7、检查集群中各个节点的状态、 可以看到每个槽位在节点中分布的情况
docker exec -it redis-cluster-redis-node3-1 redis-cli -p 6381 cluster nodes

8、检查分槽
docker exec -it redis-cluster-redis-node3-1 redis-cli -p 6381 cluster slots

9、测试redis集群 进入到某个主节点下 去写入数据
docker exec -it redis-cluster-redis-node1-1 redis-cli -p 6379
注意:因为Redis存储数据的槽位被平均分配到三台主节点上,所以你写要写入的数据 Key 也会提前判断属于哪个槽上的,如果不是当前主节点槽位会报错MOVED。以下这个key 'name'就很明显 应该从
6380的节点写入,

我们换一个key 'lang' 就写成功了,那是因为根据reids 的hash得出的结果lang的槽位就在本台机器上,所以写成功了

注意: 如果你的key 不是在当前节点的槽位上 执行写入或者查询就会报错 使用 使用 CLUSTER KEYSLOT 命令可以获取 key 即将会落到那个槽位上

10、查看被写入主节点的从节点是否准确的同步到了数据,
我们刚刚是在6379这台主节点上写入的数据 set lang jacklang 同时也写入成功了,那么我们去对应的从节点上看看有没有这个数据,可以看到6379的从节点是6383 ,并且 6383 的容器名称是
redis-cluster-redis-node5-1 如下图① 和 图②
①

②
进入到6383节点里 使用命令 docker exec -it redis-cluster-redis-node5-1 redis-cli -p 6383 进入后使用 keys * 来查看主节点复制过来的key 信息

因为从节点默认是开启协助读取的,所以get 可能会报错,你需要先设置 readonly 允许从节点读 才能使用 get 读取数据,如下图

11、其它片的从节点会同步到6379主节点数据吗? 答案 显然是不会的


浙公网安备 33010602011771号