【Docker】Docker Compose方式搭建分布式内存数据库(Redis)集群

news2025/5/15 14:55:36

文章目录

  • 开发环境
  • 开发流程
  • 运行效果
    • Docker Desktop桌面中的Redis结点启动图
    • Redis结点1的打印日志情况图
  • 配置代码
    • 命令行启动配置文件: README.md
      • 删除集群信息
      • 新建数据目录
      • 本地Redis的结点的域名,并添加到/etc/hosts文件的末尾
      • 域名映射
      • 启动集群结点
      • 创建集群
      • 关闭集群结点
    • redis-cluster.yaml
  • 引用图
    • 启动集群结点运行图
    • 创建集群命令图

开发微服务应用时,往往用到内存数据库,而内存数据库离不开Redis.Redis在日常搭建时有四种模式(单机、主备、哨兵、集群),生产环境往往采用哨兵或集群方式搭建,集群方式的资源利用率比哨兵方式高.开发者对使用虚拟机或物理机搭建集群模式往往比较熟悉,但现代应用往往使用云原生技术进行搭建.如何用Docker搭建Redis集群,这里介绍使用Docker Compose方式搭建分布式内存数据库(Redis)集群,适用于单机Docker环境,无论是本地单机开发、测试环境单机验证,还是生产环境单机运行.

开发环境

  1. macOS For Apple Silicon;
  2. Idea;
  3. Docker Desktop: 4.41.2,Engine: 28.1.1,Compose: v2.35.1-desktop.1;
  4. Docker镜像: redis:8.0;
  5. Docker Compose配置文件: redis-cluster.yaml;
  6. 命令行启动配置文件: README.md,见命令行启动配置文件: README.md

开发流程

  1. 下载Docker Desktop并安装,Docker Desktop For Mac Apple Silicon地址;
  2. 编写本地Redis的结点的域名,并添加到/etc/hosts文件的末尾,见编写本地Redis的结点的域名,并添加到/etc/hosts文件的末尾;
  3. 编写Docker Compose配置文件,用来启动Redis集群,其中集群共6个结点,3个主结点,3个备份结点.启动命令(command)中,redis-server启动,集群配置为打开,镜像地址使用redis:8.0,六个结点分别配置,端口从7001-7006,宣布主机域名配置为从redis-node-1到redis-node-6,数据目录映射为主目录从~/seen/redis/data_1到~/seen/redis/data_6,工程文件见redis-cluster.yaml;
  4. 执行启动集群结点和创建集群命令,见启动集群结点和创建集群命令,启动集群结点运行见启动集群结点运行图;
  5. 创建集群时选择yes,见创建集群命令图.

运行效果

Docker Desktop桌面中的Redis结点启动图

Docker Desktop桌面中的Redis结点启动图

Redis结点1的打印日志情况图

Redis结点1的打印日志情况图

配置代码

命令行启动配置文件: README.md

删除集群信息

rm -rf ~/seen/redis/

新建数据目录

mkdir -p ~/seen/redis/data_1 ~/seen/redis/data_2 ~/seen/redis/data_3 ~/seen/redis/data_4 ~/seen/redis/data_5 ~/seen/redis/data_6

本地Redis的结点的域名,并添加到/etc/hosts文件的末尾

sudo vi /etc/hosts

域名映射

127.0.0.1 redis-node-1
127.0.0.1 redis-node-2
127.0.0.1 redis-node-3
127.0.0.1 redis-node-4
127.0.0.1 redis-node-5
127.0.0.1 redis-node-6

启动集群结点

docker-compose -f redis-cluster.yaml up -d

创建集群

docker exec -it redis-node-1 redis-cli --cluster create \
  redis-node-1:7001 redis-node-2:7002 redis-node-3:7003 \
  redis-node-4:7004 redis-node-5:7005 redis-node-6:7006 \
  --cluster-replicas 1

关闭集群结点

docker-compose -f redis-cluster.yaml down

redis-cluster.yaml

version: '3.8'
services:
  redis-node-1:
    image: redis:8.0
    container_name: redis-node-1
    ports:
      - "7001:7001"
    command: redis-server --cluster-enabled yes --port 7001 --cluster-announce-hostname redis-node-1 --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
    volumes:
      - ~/seen/redis/data_1:/data
    networks:
      - redis-cluster-net
  redis-node-2:
    image: redis:8.0
    container_name: redis-node-2
    ports:
      - "7002:7002"
    command: redis-server --cluster-enabled yes --port 7002 --cluster-announce-hostname redis-node-2 --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
    volumes:
      - ~/seen/redis/data_2:/data
    networks:
      - redis-cluster-net
  redis-node-3:
    image: redis:8.0
    container_name: redis-node-3
    ports:
      - "7003:7003"
    command: redis-server --cluster-enabled yes --port 7003 --cluster-announce-hostname redis-node-3 --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
    volumes:
      - ~/seen/redis/data_3:/data
    networks:
      - redis-cluster-net
  redis-node-4:
    image: redis:8.0
    container_name: redis-node-4
    ports:
      - "7004:7004"
    command: redis-server --cluster-enabled yes --port 7004 --cluster-announce-hostname redis-node-4 --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
    volumes:
      - ~/seen/redis/data_4:/data
    networks:
      - redis-cluster-net
  redis-node-5:
    image: redis:8.0
    container_name: redis-node-5
    ports:
      - "7005:7005"
    command: redis-server --cluster-enabled yes --port 7005 --cluster-announce-hostname redis-node-5 --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
    volumes:
      - ~/seen/redis/data_5:/data
    networks:
      - redis-cluster-net
  redis-node-6:
    image: redis:8.0
    container_name: redis-node-6
    ports:
      - "7006:7006"
    command: redis-server --cluster-enabled yes --port 7006 --cluster-announce-hostname redis-node-6 --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
    volumes:
      - ~/seen/redis/data_6:/data
    networks:
      - redis-cluster-net
networks:
  redis-cluster-net:
    driver: bridge

引用图

启动集群结点运行图

启动集群结点运行图

创建集群命令图

创建集群命令图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Bash 中使用 =~ 操作符 ?

在 Bash 脚本世界中,有各种操作符可供我们使用,使我们能够操作、比较和测试数据。其中一个操作符是 ~ 操作符。这个操作符经常被忽视,但功能非常强大,它为我们提供了一种使用正则表达式匹配字符串模式的方法。 ~ 操作符语法 语法…

科学养生指南:打造健康生活

在快节奏的现代生活中,健康养生成为人们关注的焦点。科学养生无需复杂理论,掌握以下几个关键要素,就能为身体构筑坚实的健康防线。​ 合理饮食是健康的基础。世界卫生组织建议,每天应摄入至少 5 份蔬菜和水果,保证维生…

华为OD机试真题——单词接龙(首字母接龙)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

计算机网络-MPLS VPN基础概念

前面几篇文章我们学习了MPLS的标签转发原理,有静态标签分发和LDP动态标签协议,可以实现LSR设备基于标签实现数据高效转发。现在开始学习MPLS在企业实际应用的场景-MPLS VPN。 一、MPLS VPN概念 MPLS(多协议标签交换)位于TCP/IP协…

【Linux系列】bash_profile 与 zshrc 的编辑与加载

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Spring Boot中的拦截器!

每次用户请求到达Spring Boot服务端,你是否需要重复写日志、权限检查或请求格式化代码?这些繁琐的“前置后置”工作让人头疼!好在,Spring Boot拦截器如同一道智能关卡,统一处理请求的横切逻辑,让代码优雅又…

基于 Spring Boot 瑞吉外卖系统开发(十五)

基于 Spring Boot 瑞吉外卖系统开发(十五) 前台用户登录 在登录页面输入验证码,单击“登录”按钮,页面会携带输入的手机号和验证码向“/user/login”发起请求。 定义UserMapper接口 Mapper public interface UserMapper exte…

计算机网络笔记(二十三)——4.5IPv6

4.5.1IPv6的基本首部 IPv6 的基本首部相对于 IPv4 进行了重大简化和优化,固定长度为 40 字节,大幅提升了路由器的处理效率。以下是各字段的详细说明: IPv6 基本首部字段组成 字段名位数作用描述版本 (Version)4 bits固定值为 6&#xff0c…

推荐一个Winform开源的UI工具包

从零学习构建一个完整的系统 推荐一个开源、免费的适合.NET WinForms 控件的套件。 项目简介 Krypton是一套开源的.Net组件,用于快速构建具有丰富UI交互的WinForms应用程序。 丰富的UI控件,提供了48个基础控件,如按钮、文本框、标签、下拉…

位与运算

只有当除数是 2 的幂次方(如 2、4、8、16...)时,取模运算才可以转换为位运算。 int b 19;int a1 b % 16; // 传统取模运算int a2 b & 15; // 位运算替代取模printf("b %d\n", b);printf("b %% 8 %d\n",…

趣味编程:四叶草

概述:在万千三叶草中寻觅,只为那一抹独特的四叶草之绿,它象征着幸运与希望。本篇博客主要介绍四叶草的绘制。 1. 效果展示 绘制四叶草的过程是一个动态的过程,因此博客中所展示的为绘制完成的四叶草。 2. 源码展示 #define _CR…

城市生命线综合管控系统解决方案-守护城市生命线安全

一、政策背景 国务院办公厅《城市安全风险综合监测预警平台建设指南》‌要求:将燃气、供水、排水、桥梁、热力、综合管廊等纳入城市生命线监测体系,建立"能监测、会预警、快处置"的智慧化防控机制。住建部‌《"十四五"全国城市基础…

# 2-STM32F103-复位和时钟控制RCC

STM32-复位和时钟控制RCC 2-STM32-复位和时钟控制RCC摘要说明本文参考资料如下: 一、STM32最小系统回顾STM32F103C8T6核心板原理图 二、复位三、时钟3.1 时钟树3.2 STM32启动过程3.2 SystemInit()函数3.2.1 SystemInit()第1句:3.2.2 SystemInit()第2句&a…

多模态大语言模型arxiv论文略读(七十五)

PosterLLaVa: Constructing a Unified Multi-modal Layout Generator with LLM ➡️ 论文标题:PosterLLaVa: Constructing a Unified Multi-modal Layout Generator with LLM ➡️ 论文作者:Tao Yang, Yingmin Luo, Zhongang Qi, Yang Wu, Ying Shan, C…

使用frp实现客户端开机自启(含静默运行脚本)

本文整理了如何使用 frp 客户端并实现 Windows 系统下的开机静默自启,适合远程桌面、内网穿透等场景。 📁 目录结构 我将 frp 客户端文件放置在以下路径: F:\git\frp>tree /f 卷 其它 的文件夹 PATH 列表 卷序列号为 A123-0F4E F:. │ …

list 容器常见用法及实现

文章目录 1. list 的介绍与使用1.1 list 的介绍1.2 list 的使用1.2.1 list 的构造1.2.2 list iterator 的使用1.2.3 list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 迭代器失效问题 2. list 的模拟实现2.1 值得注意的点:2.2 std::initializer_li…

iOS视频编码详细步骤(视频编码器,基于 VideoToolbox,支持硬件编码 H264/H265)

iOS视频编码详细步骤流程 1. 视频采集阶段 视频采集所使用的代码和之前的相同,所以不再过多进行赘述 初始化配置: 通过VideoCaptureConfig设置分辨率1920x1080、帧率30fps、像素格式kCVPixelFormatType_420YpCbCr8BiPlanarFullRange设置摄像头位置&am…

浅析 Golang 内存管理

文章目录 浅析 Golang 内存管理栈(Stack)堆(Heap)堆 vs. 栈内存逃逸分析内存逃逸产生的原因避免内存逃逸的手段 内存泄露常见的内存泄露场景如何避免内存泄露?总结 浅析 Golang 内存管理 在 Golang 当中,堆…

C++ 并发编程(1)再学习,为什么子线程不调用join方法或者detach方法,程序会崩溃? 仿函数的线程启动问题?为什么线程参数默认传参方式是值拷贝?

本文的主要学习点,来自 这哥们的视频内容,感谢大神的无私奉献。你可以根据这哥们的视频内容学习,我这里只是将自己不明白的点,整理记录。 C 并发编程(1) 线程基础,为什么线程参数默认传参方式是值拷贝?_哔…

【Python 算法零基础 2.模拟 ④ 基于矩阵】

目录 基于矩阵 Ⅰ、 2120. 执行所有后缀指令 思路与算法 ① 初始化结果列表 ② 方向映射 ③ 遍历每个起始位置 ④ 记录结果 Ⅱ、1252. 奇数值单元格的数目 思路与算法 ① 初始化矩阵 ② 处理每个操作 ③ 统计奇数元素 Ⅲ、 832. 翻转图像 思路与算法 ① 水平翻转图像 ② 像素值…