使用 Docker Compose 部署 Redis Cluster 集群,轻松搭建高可用分布式缓存
Redis Cluster(Redis 集群)是 Redis 分布式解决方案的一部分,它旨在提供高可用性、高性能和横向扩展的功能。Redis Cluster 能够将多个 Redis 节点组合成一个分布式集群,实现数据分片和负载均衡,从而确保在大规模应用场景下的稳定性和可靠性。我们这篇文章了将为大家介绍如何使用 docker-compose 搭建 redis 集群。
Redis Cluster 介绍
-
Redis Cluster 介绍将数据划分为多个槽(slot),默认情况下共有 16384 个槽。每个 Redis 节点负责处理其中的一部分槽。当客户端请求访问某个键时,Redis Cluster 会根据键的哈希值决定它应该位于哪个槽,并将请求转发到负责该槽的 Redis 节点上。
-
在 Redis Cluster 中,每个槽都可以有多个副本,通常有一个主节点和一个或多个从节点。主节点负责处理客户端请求,并将数据同步到从节点上。这样,即使主节点出现故障,系统仍然可以继续工作,从节点可以接管主节点的工作,并保持数据的一致性。Redis Cluster 提供了自动分片和数据复制的机制,无需手动管理数据分片和节点复制。
-
Redis Cluster 使用 Gossip 协议进行节点间的通信,节点之间互相交换信息以保持集群的状态一致性。通过 Gossip 协议,Redis 节点可以动态发现新的节点加入或者节点离开集群,从而实现集群的自动伸缩和高可用性。
-
Redis Cluster 具有良好的扩展性。当数据量增加或请求量增大时,可以简单地增加新的 Redis 节点,并让集群自动重新分片和重新分配槽。这种横向扩展方式能够无缝地增加集群的容量和性能,而无需停机或对现有节点进行复杂的迁移操作。
-
Redis Cluster 具有很强的容错性。即使有部分节点宕机,只要主节点的数量仍然满足半数以上,集群仍然可以继续工作。当集群检测到主节点不可用时,会自动将从节点提升为主节点,确保服务的连续性和可用性。
docker-compose
创建一个 redis-cluster 的文件夹,在其中在创建一个 redis6479 的一个文件夹,在 redis6479 中创建 docker-compose.yml 文件,文件如下:
version: '3.3'
services:redis6479:network_mode: 'host'image: rediscontainer_name: redis6479restart: alwayslogging:driver: 'json-file'options:max-size: '5g'volumes:- ./data:/data- ./redis.conf:/usr/local/etc/redis/redis.conf- ./logs:/logscommand: redis-server /usr/local/etc/redis/redis.conf
我们在这network用的是host模式,redis节点之间通信直接用宿主机的ip即可
我们在这还有一个关于日志的配置
logging:driver: 'json-file'options:max-size: '5g'
我们的从节点一直会检测主节点的状态,一直输出日志,所以我们在这配置下日志的大小,不然我们的服务器很快就会被日志文件占用很多的磁盘
在 redis6479 下创建 redis.conf 文件
创建脚本部署其他节点
在redis-cluster 下创建脚本 build.sh
#!/bin/bash
cd /home/xiuji/docker/redis-cluster;
cp -r redis6479 redis6579;
sed -i "s/6479/6579/g" /home/xiuji/docker/redis-cluster/redis6579/docker-compose.yml;
sed -i "s/6479/6579/g" /home/xiuji/docker/redis-cluster/redis6579/redis.conf;
cd /home/xiuji/docker/redis-cluster/redis6579;
sudo rm -rf data;
sudo rm -rf logs;
docker-compose up -d;cd /home/xiuji/docker/redis-cluster;
cp -r redis6479 redis6679;
sed -i "s/6479/6679/g" /home/xiuji/docker/redis-cluster/redis6679/docker-compose.yml;
sed -i "s/6479/6679/g" /home/xiuji/docker/redis-cluster/redis6679/redis.conf;
cd /home/xiuji/docker/redis-cluster/redis6679;
sudo rm -rf data;
sudo rm -rf logs;
docker-compose up -d;cd /home/xiuji/docker/redis-cluster;
cp -r redis6479 redis6779;
sed -i "s/6479/6779/g" /home/xiuji/docker/redis-cluster/redis6779/docker-compose.yml;
sed -i "s/6479/6779/g" /home/xiuji/docker/redis-cluster/redis6779/redis.conf;
cd /home/xiuji/docker/redis-cluster/redis6779;
sudo rm -rf data;
sudo rm -rf logs;
docker-compose up -d;cd /home/xiuji/docker/redis-cluster;
cp -r redis6479 redis6879;
sed -i "s/6479/6879/g" /home/xiuji/docker/redis-cluster/redis6879/docker-compose.yml;
sed -i "s/6479/6879/g" /home/xiuji/docker/redis-cluster/redis6879/redis.conf;
cd /home/xiuji/docker/redis-cluster/redis6879;
sudo rm -rf data;
sudo rm -rf logs;
docker-compose up -d;cd /home/xiuji/docker/redis-cluster;
cp -r redis6479 redis6979;
sed -i "s/6479/6979/g" /home/xiuji/docker/redis-cluster/redis6979/docker-compose.yml;
sed -i "s/6479/6979/g" /home/xiuji/docker/redis-cluster/redis6979/redis.conf;
cd /home/xiuji/docker/redis-cluster/redis6979;
sudo rm -rf data;
sudo rm -rf logs;
docker-compose up -d;
创建好之后给脚本可执行权限,我者直接简单粗暴
chmod -R 777 build.sh
执行脚本
./build.sh
执行成功后我们可以看到多了5个文件夹

查看容器
docker ps -a | grep ‘redis’

可以看到,我们的6个节点已经全部启动了
创建集群
rediscluster默认最少三个主节点,我们在这启动了6个节点,我们创建一个3主3从的集群
在服务器上执行集群创建命令
redis-cli --cluster create 192.168.10.108:6479 192.168.10.108:6579 192.168.10.108:6679 192.168.10.108:6779 192.168.10.108:6879 192.168.10.108:6979 --cluster-replicas 1 -a ‘xj2022’
–cluster-replicas 1:每个主节点下的从节点的数量
-a ‘xj2022’ redis有密码(所有redis设置相同的密码),如果没有密码,则不需要这个参数
执行完之后会出现如下页面

这块了可能会比较久
创建完成之后我们就可以使用如下命令连接到rediscluster 集群了
redis-cli -c -h 192.168.10.108 -p 6479 -a ‘xj2021’ --raw
查看集群状态
cluster nodes
cluster info
测试读写是否正常
set xj ‘修己’
get xj
到此,我们3主3从的cluster集群已经部署完成了
总结
通过 Docker Compose,我们可以快速搭建 Redis 集群,实现高可用性和高性能的分布式缓存。这种部署方式不仅方便,而且易于扩展。希望本文对您理解如何使用 Docker Compose 部署 Redis 集群有所帮助。如果您对 Redis 集群的更多功能和高级配置感兴趣,可以深入研究 Redis 官方文档。https://redis.io/
谢谢阅读!如果您有任何问题或建议,欢迎在评论区留言。
相关文章:
使用 Docker Compose 部署 Redis Cluster 集群,轻松搭建高可用分布式缓存
Redis Cluster(Redis 集群)是 Redis 分布式解决方案的一部分,它旨在提供高可用性、高性能和横向扩展的功能。Redis Cluster 能够将多个 Redis 节点组合成一个分布式集群,实现数据分片和负载均衡,从而确保在大规模应用场…...
在Spring Boot框架中集成 Spring Security
在Spring Boot框架中集成 Spring Security 目录 技术介绍SpringSecurity的核心功能:SpringSecurity特点:具体实现 1、集成依赖2、修改spring security实现service.impl.UserDetailsServiceImpl类 代码1具体解释代码2具体解释 实现config.SecurityConfi…...
登月再进一步:Apollo自动驾驶的里程碑
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…...
嵌入式一开始该怎么学?学习单片机
学习单片机: 模电数电肯定必须的,玩单片机大概率这两门课都学过,学过微机原理更好。 直接看野火的文档,芯片手册,外设手册。 学单片机不要纠结于某个型号,我认为stm32就OK,主要是原理和感觉。…...
Spring事件监听器ApplicationListener
目录 介绍 spirng启动后启动某方法 介绍 ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。事件发布者并不需…...
安全学习DAY10_HTTP数据包
HTTP数据包 文章目录 HTTP数据包小节导图Request请求数据包结构Request请求方法(方式)请求头(Header)Response响应数据包结构Response响应数据包状态码状态码作用:部分状态码详解判断网站文件是否存在的状态码…...
云原生落地实践的25个步骤
一、什么是云原生? 云原生从字面意思上来看可以分成云和原生两个部分。 云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS,、PaaS和SaaS。 原生就是土生土长的意思,我们在开始…...
Stable diffusion 三大基础脚本 提示词矩阵,载入提示词,XYZ图表讲解
目录 0.本章讲解 1.提示词矩阵(prompt matrix) 1.2.提示词矩阵功能选项 1.2.1.把可变部分放在提示词文本的开头 1.2.2.为每张图片使用不同随机种子 1.2.3.选择提示词 1.2.4.选择分割符 1.2.5.宫格图边框(像素) 2.从文本框或文件载入提示词(Pro…...
uniapp uni-combox 下拉提示无匹配项(完美解决--附加源码解决方案及思路)
问题描述 匆匆忙忙又到了周一啦,一大早就来了一个头疼的问题,把我难得团团转,呜呜呜~ 下面我用代码的方式展示出来,看下你的代码是否与我的不同。 解决方案 <uni-forms-item label"名称" name"drugName&quo…...
10. Mybatis 项目的创建
目录 1. Mybatis 概念 2. 第一个 Mybits 查询 2.1 创建数据库和表 2.2 添加 Mybatis 框架支持 2.3 添加配置文件 2.4 配置 MyBatis 中的 XML 路径 2.5 添加业务代码 在学习 Mybatis 之前,我们需要知道 Mybatis 和 Spring 没有任何的关系。如果一定要强调二者…...
历年 Nobel prize in Physics (诺贝尔物理学奖)简介
历年 Fields Medal 与 Nobel prize in Physics 简介 Nobel prize in Physics 1901年12月10日 诺贝尔逝世5周年纪念日首次颁发诺贝尔奖。1916年 第一次世界大战 1914.7 至 1918.11诺贝尔物理学奖空缺1931年诺贝尔物理学奖空缺1934年诺贝尔物理学奖空缺1940年—1942年 第二次世界…...
IDEA中Git面板操作介绍 变基、合并、提取、拉取、签出
IDEA中Git面板操作介绍 变基、合并、提取、拉取、签出 面板介绍 变基、合并 提取、拉取 签出、Checkout 面板介绍 如图,在IDEA的Git面板中,仓库会分为本地仓库和远程仓库,代码仓库里面放的是各个分支。 分支前面的书签🔖标志…...
Android Studio开发简易APP添加代办事项
创建xml布局页 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width...
python 统计所有的 仓库 提交者的提交次数
字典去重 YYDS 然后再写入excel 表 yyds #!/bin/env python3 from git.repo import Repo import os import pandas as pdspath "/home/labstation/workqueue/sw" url "git10.0.128.128" date [str(x) for x in range(202307, 202308)] datefmt "%…...
018-从零搭建微服务-系统服务(五)
写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue 源码地址(前端):https://gitee.com/csps…...
HarmonyOS 开发基础(三)登录页面单向数据绑定(父组件向子组件传参)
一、目录结构认识 开发软件目录截图部分文件夹说明 文件组织结构图 二、完成单向数据绑定 index.etx // 导出方式直接从文件夹 import MyInput from "../common/commons/myInput" Entry Component /* 组件可以基于struct实现,组件不能有继承关系&am…...
发npm包
重点文件 .github -> workflow -> .yml文件 发自己的包 新建dev分支,合并到master后自动执行 fork别人的包 fork -> base dev新建本地rebase-dev分支 -> 提交push后合并至dev -> dev合并至master后自动执行 值得注意的是,fork别人的…...
<el-empty>
<el-empty> 是 Element UI 框架中提供的一个组件,用于显示空状态的占位内容。Element UI 是一套基于 Vue.js 的组件库,用于构建响应式和易用的用户界面。 <el-empty> 组件在应用中常用于以下场景: 当数据为空时,可以…...
IO流(4)- 序列化流与反序列化流
目录 1. 序列化流与反序列化流的基本介绍 2. 序列化流的基本用法? 3. 序列化流的作用? 4. 反序列化流的基本用法? 5. 反序列化流的作用 6. 序列化流与反序列化流使用时需要注意的细节(非常重要) 6.1 被序列化的…...
人工智能如何应对 DevOps 监控和可观测性挑战
自 ChatGPT 横空出世之后,AIGC 已成为不可逆转的时代浪潮。在之前的文章中,我们介绍了DevOps 领域中AI的用例,需要回顾可以点击下方链接。在本篇文章中,我将简单聊聊人工智能(AI)如何通过分析日志和指标来预…...
A51汇编器Error 21解析与8051开发实践
1. 解析A51汇编器Error 21的根源与应对策略在8051单片机开发过程中,使用Keil C51工具链的A51汇编器时,开发者常会遇到一个令人困惑的报错:"ERROR #21: EXPRESSION WITH FORWARD REFERENCE NOT PERMITTED"。这个错误看似简单&#x…...
机器学习生产化实战:从Notebook到高可用模型服务
1. 项目概述:这不是一次“部署上线”,而是一场从实验室到产线的系统性迁移“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题本身就像一句暗号,老手一眼就懂:它不是在讲怎么调参、不是教你怎么…...
Office技巧速成:3个让效率翻倍的实用方法
表格操作总出错怎么办众多人于运用Excel开展数据处理工作之际,时常会被合并单元格以及公式报错等情形搞得疲惫不堪,焦头烂额。实际上,要是认真细细探究一番,便会发觉,大部分这类问题均是起因于对 Excel 基本功能欠缺熟…...
2026年哪个开源商城,更适合长期维护?——真正决定商城系统寿命的,从来不是“功能多少”,而是“复杂业务长期是否还能稳定演进”
很多企业第一次选开源商城系统时。 通常都会特别关注: 功能全不全插件多不多页面好不好看上线速度快不快 因为在很多人认知里: 功能越多 → 系统越成熟 于是很多企业前期选型时。 都会优先选择: 功能最多的插件最全的营销玩法最丰富的…...
Go语言实现DCI架构:用角色扮演解耦对象行为与数据
1. 从“是什么”到“做什么”:DCI架构如何重塑对象行为建模在面向对象编程的世界里,我们总在试图用代码“复刻”现实。一个“人”是什么?我们定义一个People类,拥有姓名、年龄等属性。这个人能做什么?我们为People类添…...
告别普通回归!R 语言混合效应 (多水平 / 嵌套) 模型 + 贝叶斯实现,一篇学会
在科研数据分析里,普通回归已经不够用了。你是不是经常遇到:数据有分层、嵌套、多水平结构,普通回归不准?计数数据、0-1 数据、过度离散、零膨胀,不会选模型?时空自相关、系统发育数据,不知道怎…...
软考 系统架构设计师系列知识点之杂项集萃(155)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(154) 第293题 给定关系R(A1, A2, A3, A4, A5)上的函数依赖集F={A1->A2A5, A2->A3A4, A3->A2},R的候选关键字()。函数依赖()∈F+。 第1空 A. A1 B. A1A2 C. A1A3 D. A1A2A3 正确答案:A。 第2空…...
基于DeepSeek模型的IP文案自动化生成工作流设计与实现
基于DeepSeek模型的IP文案自动化生成工作流设计与实现 1. 项目背景与目标 在数字化营销和品牌建设过程中,IP(Intellectual Property,知识产权/品牌形象)文案扮演着至关重要的角色。高质量的IP文案能够有效传递品牌价值、塑造用户认知、提升转化率。传统的文案撰写依赖人工…...
AI时代工程师的核心价值:从写代码到定义问题
1. 这不是“AI取代程序员”的老调重弹,而是职业坐标的重新校准你最近有没有在刷技术社区时,被两条截然相反的消息撞得有点懵?一条说“编码岗位正站在悬崖边上”,另一条却高呼“这是工程师黄金十年的起点”。这不是媒体制造焦虑的标…...
【金蝶云星空】出纳做账-付款退款单使用场景
学习目标学习本内容后,您将掌握如何使用付款退款单。业务场景付款退款单 付款退款单与付款业务对应,处理付款业务所发生的退款,包括采购业务付款的退款或者其他业务付款的退款。支持手工新增或者关联应付系统负数的应付单、其他应付单生成付…...
