Docker desktop安装Redis Cluster集群

本文章将介绍如何在 Windows 系统的 Docker Desktop 环境中搭建 Redis 集群。将创建一个包含 6 个节点(3 主 3 从)的 Redis 集群。

环境准备

  • Windows 10/11 操作系统
  • Docker Desktop 已安装并运行

步骤

清理环境(如之前有尝试)

如果之前已经尝试过创建 Redis 集群,请先执行清理操作:

# 停止并删除所有 Redis 容器
docker stop redis-7001 redis-7002 redis-7003 redis-7004 redis-7005 redis-7006 2>$null
docker rm redis-7001 redis-7002 redis-7003 redis-7004 redis-7005 redis-7006 2>$null# 删除网络
docker network rm redis-cluster-net 2>$null# 删除本地目录和配置文件
Remove-Item -Recurse -Force ~/redis-cluster 2>$null# 确认清理完成
docker ps -a | Select-String "redis-7"
docker network ls | Select-String "redis-cluster-net"

创建 Docker 网络

docker network create redis-cluster-net

创建目录结构

# 创建主目录
mkdir ~/redis-cluster
cd ~/redis-cluster# 为每个节点创建目录
foreach ($port in @(7001, 7002, 7003, 7004, 7005, 7006)) {New-Item -ItemType Directory -Path "$port/conf" -ForceNew-Item -ItemType Directory -Path "$port/data" -Force
}

创建 Redis 配置文件

foreach ($port in @(7001, 7002, 7003, 7004, 7005, 7006)) {$confContent = @"
port $port
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
protected-mode no
bind 0.0.0.0
"@Set-Content -Path "$port/conf/redis.conf" -Value $confContent
}

启动 Redis 容器

# Redis 7001
docker run -d --name redis-7001 -p 7001:7001 -p 17001:17001 -v ${PWD}/7001/conf/redis.conf:/etc/redis/redis.conf -v ${PWD}/7001/data:/data --network redis-cluster-net redis:latest redis-server /etc/redis/redis.conf# Redis 7002
docker run -d --name redis-7002 -p 7002:7002 -p 17002:17002 -v ${PWD}/7002/conf/redis.conf:/etc/redis/redis.conf -v ${PWD}/7002/data:/data --network redis-cluster-net redis:latest redis-server /etc/redis/redis.conf# Redis 7003
docker run -d --name redis-7003 -p 7003:7003 -p 17003:17003 -v ${PWD}/7003/conf/redis.conf:/etc/redis/redis.conf -v ${PWD}/7003/data:/data --network redis-cluster-net redis:latest redis-server /etc/redis/redis.conf# Redis 7004
docker run -d --name redis-7004 -p 7004:7004 -p 17004:17004 -v ${PWD}/7004/conf/redis.conf:/etc/redis/redis.conf -v ${PWD}/7004/data:/data --network redis-cluster-net redis:latest redis-server /etc/redis/redis.conf# Redis 7005
docker run -d --name redis-7005 -p 7005:7005 -p 17005:17005 -v ${PWD}/7005/conf/redis.conf:/etc/redis/redis.conf -v ${PWD}/7005/data:/data --network redis-cluster-net redis:latest redis-server /etc/redis/redis.conf# Redis 7006
docker run -d --name redis-7006 -p 7006:7006 -p 17006:17006 -v ${PWD}/7006/conf/redis.conf:/etc/redis/redis.conf -v ${PWD}/7006/data:/data --network redis-cluster-net redis:latest redis-server /etc/redis/redis.conf

检查容器状态

docker ps

如下图所示
在这里插入图片描述

初始化 Redis 集群

docker exec -it redis-7001 redis-cli --cluster create redis-7001:7001 redis-7002:7002 redis-7003:7003 redis-7004:7004 redis-7005:7005 redis-7006:7006 --cluster-replicas 1

当提示时输入 yes 确认配置。

验证集群状态

docker exec -it redis-7001 redis-cli -c -p 7001 cluster nodes

如下图所示 :
在这里插入图片描述

测试集群功能

docker exec -it redis-7001 redis-cli -c -p 7001

测试Redis是否可用,可用则搭建成功 !


在这里插入图片描述

在 Redis CLI 中执行:

set test1 "hello"
set test2 "world"
get test1
get test2

简化版本(3 节点集群)

如果您只需要 3 个主节点(没有从节点),可以只创建 7001-7003,然后在初始化集群时使用以下命令:

docker exec -it redis-7001 redis-cli --cluster create redis-7001:7001 redis-7002:7002 redis-7003:7003 --cluster-replicas 0

使用

要停止集群,可以使用 docker stop 命令停止所有容器。要重新启动,只需使用 docker start 命令启动容器,集群会自动恢复。

常见问题解决

  1. 端口冲突:确保 7001-7006 以及 17001-17006 端口没有被其他程序占用
  2. 权限问题:如果遇到文件权限问题,尝试以管理员身份运行 PowerShell
  3. 容器启动失败:检查 Docker Desktop 是否正常运行,并确保有足够的内存分配

高级功能

密码认证配置

修改配置文件

  • your_secure_password_here 更换为自己的密码
foreach ($port in @(7001, 7002, 7003, 7004, 7005, 7006)) {$confContent = @"
port $port
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
protected-mode no
bind 0.0.0.0
requirepass your_secure_password_here
masterauth your_secure_password_here
"@Set-Content -Path "$port/conf/redis.conf" -Value $confContent
}

启动带认证的容器

# 示例:Redis 7001 带认证
docker run -d --name redis-7001 -p 7001:7001 -p 17001:17001 `-v ${PWD}/7001/conf/redis.conf:/etc/redis/redis.conf `-v ${PWD}/7001/data:/data `--network redis-cluster-net `redis:latest redis-server /etc/redis/redis.conf

初始化带认证的集群

docker exec -it redis-7001 redis-cli -a your_secure_password_here --cluster create `redis-7001:7001 redis-7002:7002 redis-7003:7003 `redis-7004:7004 redis-7005:7005 redis-7006:7006 `--cluster-replicas 1

持久化配置优化

AOF 和 RDB 混合持久化

foreach ($port in @(7001, 7002, 7003, 7004, 7005, 7006)) {$confContent = @"
port $port
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
save 900 1
save 300 10
save 60 10000
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data
protected-mode no
bind 0.0.0.0
requirepass your_secure_password_here
masterauth your_secure_password_here
"@Set-Content -Path "$port/conf/redis.conf" -Value $confContent
}

内存管理和淘汰策略

foreach ($port in @(7001, 7002, 7003, 7004, 7005, 7006)) {$confContent = @"
port $port
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
maxmemory 1gb
maxmemory-policy volatile-lru
protected-mode no
bind 0.0.0.0
requirepass your_secure_password_here
masterauth your_secure_password_here
"@Set-Content -Path "$port/conf/redis.conf" -Value $confContent
}

监控和慢查询日志

foreach ($port in @(7001, 7002, 7003, 7004, 7005, 7006)) {$confContent = @"
port $port
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 100
protected-mode no
bind 0.0.0.0
requirepass your_secure_password_here
masterauth your_secure_password_here
"@Set-Content -Path "$port/conf/redis.conf" -Value $confContent
}

集群管理和监控工具

安装 redis-cli 工具

# 在 Windows 上安装 Redis CLI
choco install redis-64

使用 RedisInsight 进行可视化监控

  1. 下载并安装 RedisInsight
  2. 连接到集群中的任意节点
  3. 查看集群状态、内存使用情况、慢查询等

使用命令行工具监控集群

# 查看集群信息
docker exec -it redis-7001 redis-cli -c -p 7001 -a your_secure_password_here cluster info# 查看节点信息
docker exec -it redis-7001 redis-cli -c -p 7001 -a your_secure_password_here cluster nodes# 查看内存使用情况
docker exec -it redis-7001 redis-cli -c -p 7001 -a your_secure_password_here info memory# 查看持久化信息
docker exec -it redis-7001 redis-cli -c -p 7001 -a your_secure_password_here info persistence

备份和恢复策略

创建备份脚本

# backup-redis.ps1
$date = Get-Date -Format "yyyyMMdd"
$backupDir = "~/redis-backups/$date"New-Item -ItemType Directory -Path $backupDir -Forceforeach ($port in @(7001, 7002, 7003, 7004, 7005, 7006)) {docker exec redis-$port redis-cli -a your_secure_password_here saveCopy-Item -Path "~/redis-cluster/$port/data/dump.rdb" -Destination "$backupDir/dump-$port.rdb"Copy-Item -Path "~/redis-cluster/$port/data/appendonly.aof" -Destination "$backupDir/appendonly-$port.aof"
}Write-Host "Backup completed to $backupDir"

创建恢复脚本

# restore-redis.ps1
param([Parameter(Mandatory=$true)][string]$backupDate
)$backupDir = "~/redis-backups/$backupDate"if (-not (Test-Path $backupDir)) {Write-Error "Backup directory $backupDir does not exist"exit 1
}foreach ($port in @(7001, 7002, 7003, 7004, 7005, 7006)) {docker stop redis-$portRemove-Item -Path "~/redis-cluster/$port/data/dump.rdb" -Force -ErrorAction SilentlyContinueRemove-Item -Path "~/redis-cluster/$port/data/appendonly.aof" -Force -ErrorAction SilentlyContinueCopy-Item -Path "$backupDir/dump-$port.rdb" -Destination "~/redis-cluster/$port/data/dump.rdb"Copy-Item -Path "$backupDir/appendonly-$port.aof" -Destination "~/redis-cluster/$port/data/appendonly.aof"docker start redis-$port
}Write-Host "Restore completed from $backupDir"

Redis 性能优化

foreach ($port in @(7001, 7002, 7003, 7004, 7005, 7006)) {$confContent = @"
port $port
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
maxmemory 2gb
maxmemory-policy allkeys-lru
maxclients 10000
tcp-backlog 511
timeout 0
tcp-keepalive 300
protected-mode no
bind 0.0.0.0
requirepass your_secure_password_here
masterauth your_secure_password_here
"@Set-Content -Path "$port/conf/redis.conf" -Value $confContent
}

配置解释

  1. port $port

    • 作用:指定 Redis 实例监听的端口号。
    • 说明:在循环中,$port 变量会被替换为 7001, 7002 等,确保每个容器使用独立的端口。
  2. cluster-enabled yes

    • 作用:启用 Redis 的集群模式。
    • 说明:这是将 Redis 实例转变为集群节点的最关键配置,没有它,节点只会以单机模式运行。
  3. cluster-config-file nodes.conf

    • 作用:指定集群自动生成的配置文件名称。
    • 说明:Redis 集群运行时会自动维护这个文件,记录集群的状态、节点信息、持久化变量等。用户不应手动修改此文件
  4. cluster-node-timeout 5000

    • 作用:设置集群节点不可用的超时时间(毫秒)。
    • 说明:如果一个节点在 5000ms(5秒)内无法响应,它将被其他节点视为故障节点,并触发主从切换(failover)。这个值需要根据网络状况调整,太短可能导致不必要的故障转移,太长则会影响故障恢复速度。
  5. appendonly yes

    • 作用:启用 AOF(Append Only File)持久化模式。
    • 说明:相比于默认的 RDB 快照,AOF 通过记录 every 写操作命令来持久化数据,能提供更好的数据安全性,通常最多丢失 1 秒的数据(取决于 appendfsync 配置)。
  6. appendfsync everysec

    • 作用:控制 AOF 文件同步到磁盘的频率。
    • 说明
      • everysec(推荐):每秒同步一次。在性能和数据安全性之间取得了很好的平衡,即使故障,最多丢失 1 秒的数据。
      • always:每个写命令都同步。最安全,但性能最差。
      • no:由操作系统决定何时同步。性能最好,但可能丢失较多数据。
  7. auto-aof-rewrite-percentage 100

    • 作用:与下一项配合,触发 AOF 文件重写(rewrite)的条件之一。
    • 说明:当当前 AOF 文件大小比上一次重写后的大小增长了 100%(即翻了一倍)时,会触发重写。
  8. auto-aof-rewrite-min-size 64mb

    • 作用:触发 AOF 文件重写的另一个条件。
    • 说明:AOF 文件至少要达到 64MB 才会触发重写。这个配置防止文件很小的时候就频繁重写。
    • 两者关系必须同时满足“增长百分比达到 100%” “文件大小超过 64MB” 才会触发重写。重写可以压缩 AOF 文件,移除冗余命令。
  9. maxmemory 2gb

    • 作用:设置 Redis 实例可使用的最大内存容量。
    • 说明这是防止 Redis 占用所有系统内存、导致系统崩溃的关键配置! 你必须根据你的 Docker 容器内存限制和宿主机总内存来设置这个值(例如,设置为容器内存限制的 80-90%)。2gb 只是一个示例值。
  10. maxmemory-policy allkeys-lru

    • 作用:定义当内存使用达到 maxmemory 限制时,Redis 的键淘汰策略(eviction policy)。
    • 说明allkeys-lru 意味着当内存不足时,Redis 会尝试移除所有键中最近最少使用(LRU)的键,以腾出空间。
    • 其他常见策略
      • volatile-lru:只从设置了过期时间的键中移除最近最少使用的键。
      • allkeys-random:随机移除所有键。
      • noeviction(默认):不淘汰任何键,在写操作时返回错误。生产环境通常不推荐
  11. maxclients 10000

    • 作用:设置同一时间最大客户端连接数。
    • 说明:默认是 10000。如果达到此限制,Redis 会拒绝新的连接。需要根据系统资源和应用需求调整。
  12. tcp-backlog 511

    • 作用:设置 TCP 连接队列的长度。
    • 说明:在高连接速率环境下,增大这个值可以帮助处理连接高峰。需要同时调整系统的 /proc/sys/net/core/somaxconn 值(在 Docker 中可能需要通过 sysctls 参数设置)。
  13. timeout 0

    • 作用:客户端空闲 N 秒后关闭连接(0 表示禁用)。
    • 说明:设置为 0 意味着连接将始终保持打开,除非客户端主动断开。这适用于需要长连接的场景,避免了频繁创建连接的开销。
  14. tcp-keepalive 300

    • 作用:向客户端发送 TCP ACK 保活探测的间隔时间(秒)。
    • 说明:设置为 300 表示如果连接空闲,每 300 秒(5分钟)会发送一个保活包,以检测连接是否仍然有效并保持连接活跃。有助于清理僵尸连接。
  15. protected-mode no

    • 作用:是否启用保护模式。
    • 说明:在 Docker 容器或受信任的网络环境中,需要设置为 no 以允许远程连接。如果为 yes(默认),且没有配置密码和绑定 IP,Redis 只会回环地址(127.0.0.1)连接。
  16. bind 0.0.0.0

    • 作用:指定 Redis 监听所有网络接口上的连接。
    • 说明:在 Docker 中,必须设置为 0.0.0.0 才能让容器外的客户端(包括其他容器和宿主机)访问到它。如果只绑定 127.0.0.1,则只能在容器内部访问。
  17. requirepass your_secure_password_here

    • 作用:设置客户端连接 Redis 所需的密码。
    • 说明极大增强了安全性,防止未授权访问。 所有节点应使用相同的密码。your_secure_password_here 应被替换为一个非常强壮且唯一的密码。
  18. masterauth your_secure_password_here

    • 作用:设置从节点(replica)连接主节点进行数据复制时所需的密码。
    • 说明必须requirepass 的密码一致。这样,当主从节点之间需要通信或故障转移时,它们才能成功地进行认证和数据同步。

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

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

相关文章

Zynq开发实践(SDK之第一个纯PS工程)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】学编程的时候,大家一般都比较重视第一个项目的创建和执行。第一个fpga程序一般是led闪烁,第一个c程序一般就是hello world程…

EJS(Embedded JavaScript)(一个基于JavaScript的模板引擎,用于在HTML中嵌入动态内容)

文章目录**1. 什么是 EJS?****2. 核心特点**- **接近原生 HTML**- **动态渲染**- **轻量高效**- **与 Express 深度集成****3. EJS 的基本语法****4. 示例代码****HTML 模板(views/user.ejs)****Express 中渲染模板****5. 使用场景**1. **服务…

Linux:基于阻塞队列的生产者消费模型

文章目录一、生产者消费者模型的基本原则💕💕生产者-消费者模型的 321 原则💕💕二、为何要使用生产者消费者模型1. 解耦2. 支持并发 (提高效率)3. 忙闲不均的支持三、基于 BlockingQueue 的生产者消费者模型…

ensp启动路由器报错40

1. 先关闭 eNSP 模拟器、关闭 Virtualbox2. 在everything里面搜索 .VirtualBox文件夹,然后删掉3. 再打开 eNSP,不添加任何模拟设备,单击“菜单-工具-注册设备”,将 AR_Base 重新注册。4. 关闭 eNSP 模拟器

代码随想录二刷之“图论”~GO

A.深搜与广搜(重点掌握!!!!) 深搜类似于回溯法 搜索方向,是认准一个方向搜,直到碰壁之后再换方向换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程…

基于Echarts+HTML5可视化数据大屏展示-白茶大数据溯源平台V2

效果展示&#xff1a;代码结构&#xff1a;主要代码实现 index.html布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta n…

Linux 系统网络配置及 IP 地址相关知识汇总

Linux 系统网络配置及 IP 地址相关知识汇总 一、IP地址基础 IP地址&#xff1a;在计算机网络中用来唯一标识一台设备的一组数字。 二、IPv4相关知识 1. IPv4的表示方法 采用点分十进制表示&#xff0c;即由4个0-255的十进制数通过点分隔组成&#xff08;如192.168.1.1&#xff…

百度股价突破120美元创年内新高,AI云成为增长新引擎

美东时间9月16日&#xff0c;百度&#xff08;NASDAQ: BIDU&#xff09;美股大涨近8%&#xff0c;收盘价突破120美元&#xff0c;站上124美元高位&#xff0c;创2023年10月以来新高。北京时间9月17日港股开盘&#xff0c;百度&#xff08;09888.HK&#xff09;港股再次暴涨&…

《彩虹六号:围攻》“Siege X”发布会3月14日举行!

使用jQuery的常用方法与返回值分析 jQuery是一个轻量级的JavaScript库&#xff0c;旨在简化HTML文档遍历和操作、事件处理以及动画效果的创建。本文将介绍一些常用的jQuery方法及其返回值&#xff0c;帮助开发者更好地理解和运用这一强大的库。 1. 选择器方法 jQuery提供了多种…

[从青铜到王者] Spring Boot+Redis+Kafka电商场景面试全解析

互联网大厂Java开发岗技术面试实录&#xff1a;严肃面试官VS搞笑程序员谢飞机 文章内容 第一轮&#xff1a;基础框架与并发控制&#xff08;电商系统基础能力&#xff09; 面试官&#xff08;严肃&#xff09;&#xff1a;欢迎进入面试环节&#xff0c;首先请用3句话总结Spring…

【DMA】DMA架构解析

目录 1 DMA架构 1. 芯片架构图一览 2. AHB总线矩阵挂载 3. AHB1/APB1的桥和AHB1/APB2的桥 4. DMA1 和 DMA2 的区别 2 AHB总线矩阵 1 DMA架构 1. 芯片架构图一览 2. AHB总线矩阵挂载 stm32F411 芯片的 AHB 总线矩阵上共挂载了 6 主 5 从 六主&#xff1a; Icode-bus、D…

GPS 定位器:精准追踪的“隐形守护者”

GPS 定位器&#xff1a;精准追踪的“隐形守护者” 一、什么是 GPS 定位器&#xff1f; GPS 定位器是一种基于 全球定位系统&#xff08;Global Positioning System, GPS&#xff09; 的智能追踪设备。 通过接收卫星信号并结合通信模块&#xff08;如 4G、NB-IoT&#xff09;&am…

前端拖拽排序实现

1. 使用 HTML5 事件 触发时机 核心任务 dragstart 开始拖拽时 准备数据&#xff0c;贴上标签 dragover 经过目标上方时 必须 preventDefault()&#xff0c;发出“允许放置”的信号 dragleave 离开目标上方时 清理高亮等临时视觉效果 drop 在目标上松手时 接收数据…

arm coresight

这是一个arm设计的调试基础架构&#xff0c;我们常用的debug基本都包含在内。比如ETM、PTM、ITM、HTM、ETB等。 注意ETM、PTM、ITM、HTM、ETB是coresight的子集。这些工具相比普通debug的断点调试&#xff0c;需要更高的专业水平&#xff0c;因此也用于复杂软件故障定位、性能…

《华为基本法》 —— 企业发展的导航仪

当一家企业从 “小作坊” 向 “规模化组织” 跨越时&#xff0c;最需要的是什么&#xff1f;华为的答案&#xff0c;藏在 1998 年出台的《华为基本法》里。1998 年&#xff0c;《华为基本法》正式颁布&#xff0c;这部凝结华为早期经营智慧的纲领性文件&#xff0c;不仅为华为从…

【完整源码+数据集+部署教程】传统韩文化元素分割系统: yolov8-seg-GFPN

背景意义 研究背景与意义 随着全球化的加速&#xff0c;传统文化的保护与传承面临着前所未有的挑战。尤其是韩国的传统文化&#xff0c;作为东亚文化的重要组成部分&#xff0c;蕴含着丰富的历史、艺术和哲学内涵。然而&#xff0c;随着现代化进程的推进&#xff0c;许多传统文…

构建AI智能体:三十五、决策树的核心机制(一):刨根问底鸢尾花分类中的参数推理计算

一、初识决策树想象一个生活中的场景&#xff0c;我们去水果店买一个西瓜&#xff0c;该怎么判断一个西瓜是不是又甜又好的呢&#xff1f;我们可能会问自己一系列问题&#xff1a;首先看看它的纹路清晰吗&#xff1f;如果“是”&#xff0c;那么它可能是个好瓜。如果“否“&…

c语言中实现线程同步的操作

线程 常见问题 同步权限 在多线程 / 多进程并发时&#xff0c;为避免共享资源&#xff08;如内存变量、硬件设备、文件&#xff09;被同时修改导致的数据不一致&#xff0c;需要通过 “同步机制” 控制谁能访问资源 ——“获取同步权限” 就是线程 / 进程申请这种访问资格的过程…

一台设备管理多个 GitHub 账号:从配置到切换的完整指南

一台设备管理多个 GitHub 账号&#xff1a;从配置到切换的完整指南 在日常开发中&#xff0c;我们经常需要在同一台电脑上使用多个 GitHub 账号&#xff08;比如个人账号和工作账号&#xff09;。但默认情况下&#xff0c;Git 会优先使用全局配置的账号&#xff0c;导致推送代…

即插即用,秒入虚拟:TouchDIVER Pro 触觉手套 赋能 AR/VR 高效交互

一、即插即用&#xff0c;零门槛开启沉浸之旅 在XR&#xff08;扩展现实&#xff09;技术高速发展的今天&#xff0c;用户对“真实感”的追求愈发迫切。Weart公司旗下旗舰产品TouchDIVER Pro触觉手套&#xff0c;凭借无需适配器、无需复杂设置的极简设计&#xff0c;打破传统触…