使用docker-compose搭建redis7集群-3主3从

ops/2024/10/25 2:11:07/

在这里插入图片描述

dockercomposeyml__6__Redis_3___3__Redis__1">下面是一个用于搭建 Redis 集群的 docker-compose.yml 示例文件,它会启动 6 个 Redis 节点(3 主节点 + 3 从节点)来构成一个最小的 Redis 集群。

同一个容器内网通讯没问题,但是你要是需要暴露到外网你需要用第二个yml

内网的

version: '3.8'
services:redis-node1:image: redis:7.0container_name: redis-node1command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--cluster-announce-ip", "redis-node1", "--cluster-announce-port", "6379", "--cluster-announce-bus-port", "16379"]ports:- "6379:6379"- "16379:16379"volumes:- ./data/redis-node1:/datanetworks:- redis-clusterredis-node2:image: redis:7.0container_name: redis-node2command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--cluster-announce-ip", "redis-node2", "--cluster-announce-port", "6379", "--cluster-announce-bus-port", "16379"]ports:- "6380:6379"- "16380:16379"volumes:- ./data/redis-node2:/datanetworks:- redis-clusterredis-node3:image: redis:7.0container_name: redis-node3command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--cluster-announce-ip", "redis-node3", "--cluster-announce-port", "6379", "--cluster-announce-bus-port", "16379"]ports:- "6381:6379"- "16381:16379"volumes:- ./data/redis-node3:/datanetworks:- redis-clusterredis-node4:image: redis:7.0container_name: redis-node4command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--cluster-announce-ip", "redis-node4", "--cluster-announce-port", "6379", "--cluster-announce-bus-port", "16379"]ports:- "6382:6379"- "16382:16379"volumes:- ./data/redis-node4:/datanetworks:- redis-clusterredis-node5:image: redis:7.0container_name: redis-node5command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--cluster-announce-ip", "redis-node5", "--cluster-announce-port", "6379", "--cluster-announce-bus-port", "16379"]ports:- "6383:6379"- "16383:16379"volumes:- ./data/redis-node5:/datanetworks:- redis-clusterredis-node6:image: redis:7.0container_name: redis-node6command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--cluster-announce-ip", "redis-node6", "--cluster-announce-port", "6379", "--cluster-announce-bus-port", "16379"]ports:- "6384:6379"- "16384:16379"volumes:- ./data/redis-node6:/datanetworks:- redis-clusternetworks:redis-cluster:driver: bridge

外网的

version: '3.3'
services:redis-node1:image: rediscontainer_name: redis-node1command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--cluster-announce-ip", "你的外网ip或者域名", "--cluster-announce-port", "6379", "--cluster-announce-bus-port", "16379"]ports:- "26379:6379"- "16379:16379"volumes:- ./data/redis-node1:/datanetworks:- redis-cluster-composeredis-node2:image: rediscontainer_name: redis-node2command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--cluster-announce-ip", "你的外网ip或者域名", "--cluster-announce-port", "6380", "--cluster-announce-bus-port", "16380"]ports:- "26380:6379"- "16380:16379"volumes:- ./data/redis-node2:/datanetworks:- redis-cluster-composeredis-node3:image: rediscontainer_name: redis-node3command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--cluster-announce-ip", "你的外网ip或者域名", "--cluster-announce-port", "6381", "--cluster-announce-bus-port", "16381"]ports:- "26381:6379"- "16381:16379"volumes:- ./data/redis-node3:/datanetworks:- redis-cluster-composeredis-node4:image: rediscontainer_name: redis-node4command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--cluster-announce-ip", "你的外网ip或者域名", "--cluster-announce-port", "6382", "--cluster-announce-bus-port", "16382"]ports:- "26382:6379"- "16382:16379"volumes:- ./data/redis-node4:/datanetworks:- redis-cluster-composeredis-node5:image: rediscontainer_name: redis-node5command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--cluster-announce-ip", "你的外网ip或者域名", "--cluster-announce-port", "6383", "--cluster-announce-bus-port", "16383"]ports:- "26383:6379"- "16383:16379"volumes:- ./data/redis-node5:/datanetworks:- redis-cluster-composeredis-node6:image: rediscontainer_name: redis-node6command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--cluster-announce-ip", "你的外网ip或者域名", "--cluster-announce-port", "6384", "--cluster-announce-bus-port", "16384"]ports:- "26384:6379"- "16384:16379"volumes:- ./data/redis-node6:/datanetworks:- redis-cluster-composenetworks:redis-cluster-compose:driver: bridge

使用步骤:

  1. 创建目录:
    在你想放置 docker-compose.yml 文件的目录下创建数据目录,例如:
mkdir -p ./data/redis-node1 ./data/redis-node2 ./data/redis-node3 ./data/redis-node4 ./data/redis-node5 ./data/redis-node6
  1. 启动集群:
    docker-compose.yml 文件所在的目录中运行:
docker-compose up -d
  1. 初始化 Redis 集群: 启动所有 Redis 容器后,你需要使用 redis-cli 创建集群:
docker exec -it redis-node1 redis-cli --cluster create \redis-node1:6379 redis-node2:6379 redis-node3:6379 \redis-node4:6379 redis-node5:6379 redis-node6:6379 \--cluster-replicas 1
  1. 验证 Redis 集群:
    你可以通过以下命令来验证 Redis 集群是否成功创建:
docker exec -it redis-node1 redis-cli -c cluster nodes

这会列出集群中的所有节点及其状态。

搭建中遇到的问题

Node redis-node2:6379 replied with error:
ERR Invalid node address specified: redis-node1:6379
在这里插入图片描述
问题的原因可能是 redis-cli --cluster create 命令中的节点地址 redis-node1:6379 这样的主机名在 Redis 集群内部可能无法被解析。这种情况通常发生在 Docker 容器中,因为每个容器有自己的网络配置,而 Redis 集群要求节点间能通过 IP 地址相互通信。
要解决这个问题,可以尝试以下步骤:
**解决方法:**替换成容器的内网ip就行了
获取IP方法

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node1
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node2
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node3
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node4
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node5
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node6

重要提示:

  • Redis 集群使用多个节点,因此你需要确保每个节点的端口(如 6379, 6380, 6381 等)在宿主机上可用。
  • 如果需要持久化数据,确保在 ./data 目录下有写权限,并且这些目录可以正确映射到容器中的 /data 路径。

http://www.ppmy.cn/ops/128208.html

相关文章

『完整代码』坐骑召唤

创建一个按钮 作为召唤/消失坐骑的开关 将预制体放入指定文件夹 命名为Mount01 创建脚本并编写:CallMount.cs using UnityEngine; using UnityEngine.UI; public class CallMount : MonoBehaviour{public Button callBtn;GameObject mountPrefab;GameObject mountIn…

uniapp移动端优惠券! 附源码!!!!

本文为常见的移动端uniapp优惠券,共有6种优惠券样式(参考了常见的优惠券),文本内容仅为示例,您可在此基础上调整为你想要的文本 预览效果 通过模拟数据,实现点击使用优惠券让其变为灰色的效果(模…

LeetCode 第420场周赛个人题解

目录 Q1. 出现在屏幕上的字符串序列 原题链接 思路分析 AC代码 Q2. 字符至少出现 K 次的子字符串 I 原题链接 思路分析 AC代码 Q3. 使数组非递减的最少除法操作次数 原题链接 思路分析 AC代码 Q4. 判断 DFS 字符串是否是回文串 原题链接 思路分析 AC代码 Q1. 出…

ReactNative项目根据平台去判断允许用户是热更新还是强更新或者若更新

在 React Native 项目中,根据平台(iOS 或 Android)来决定是否允许用户进行热更新、强更新或弱更新,通常需要考虑以下几个因素: 平台政策: iOS:App Store 严格限制了热更新的能力,因此…

大数据新视界 --大数据大厂之数据脱敏技术在大数据中的应用与挑战

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

实战:大数据冷热分析

实战:大数据冷热分析 冷热分析(Hot and Cold Data Analysis)的目的主要在于优化存储系统的性能和成本。通过识别并区分访问频率和存储需求不同的数据,可以采取适当的存储策略,进而提高系统的效率和用户体验。终极目的…

【golang】学习文档整理

Binding | Echo 传值时注意零值和传空的区别 需要validate require 和 设置指针配合使用 保证不同值的返回不同 不能客户端传0值被判断为空 测试时要空值零值去测试字段是否正确返回 返回错误是否符合预期

后端消息推送方案方案(轮询,长轮询,websocket,SSE)

1.轮询: 轮询是一种客户端定期向服务器发送HTTP请求,服务器实时返回数据给浏览器,用以检查是否有新的数据或更新的方式。客户端会设置一个固定的时间间隔,不停地向服务器发起HTTP请求,无论是否有新数据返回&#xff0…