微服务-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主节点数据吗? 答案 显然是不会的

 

 

 


 
 

 

posted @ 2023-12-02 13:32  郎小乐  阅读(463)  评论(0)    收藏  举报