Docker搭建redis-cluster集群
1. 前期准备
1.1 拉redis镜像
docker search redis
docker pull redis
1. 2 创建网卡
docker network create myredis --subnet 172.28.0.0/16#查看创建的网卡
docker network inspect myredis

docker network rm myredis #删除网卡命令 多个中间 空格隔开
docker network --help #显示可带参数等
1.3 Redis配置脚本
for port in $(seq 6379 6384); \
do \
mkdir -p ~/redis/node-${port}/conf
touch ~/redis/node-${port}/conf/redis.conf
cat << EOF > ~/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.28.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
命令解释:
port:节点端口;requirepass:设置密码,访问时需要验证protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访- 问密码;关闭保护模式,外部网络可以直接访问;daemonize:是否以守护线程的方式启动(后台启动),默认 no;appendonly:是否开启 AOF 持久化模式,默认 no;cluster-enabled:是否开启集群模式,默认 no;cluster-config-file:集群节点信息文件;cluster-node-timeout:集群节点连接超时时间;cluster-announce-ip:集群节点 IP
注意: 如果你想要你的redis集群可以供外网访问,这里直接填 服务器的IP 地址即可,如若为了安全,只是在服务器内部进行访问,这里还需要做一些修改。cluster-announce-port:集群节点映射端口,用于客户端连接到节点;cluster-announce-bus-port:集群节点总线端口,用于节点之间进行通信。
EOF(End of File)用法
<<EOF #开始
… #输入内容
EOF #结束
举例说明:
cat << EOF > 1.txt #向文件1.txt输入覆盖内容(也可以:cat > 1.txt <<EOF)
123
456
678
EOF
执行完毕后的目录结构:

2. 创建redis集群
2.1 批量式启动redis容器
for port in $(seq 6379 6384); \
do \docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \--privileged=true -v /home/redis/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \--privileged=true -v /home/redis/node-${port}/data:/data \--restart always --name redis-${port} --net myredis \--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf
done# 查看是否启动成功
docker ps -a
去掉参数部分:
docker run -d redis redis-server /usr/local/etc/redis/redis.conf
#redis-server [options] [config file]:加载指定的配置文件
命令解释:
- -d:后台运行,容器启动完成后打印容器
- –privileged:是否让docker 应用容器 获取宿主机root权限(特殊权限-)
- –sysctl参数来设置系统参数,通过这些参数来调整系统性能
- -restart always:在容器退出时总是重启容器
- –net myredis :使用我们创建的虚拟网卡
- –name redis-${port}: 将容器命名为 redis-${port}
2.2 创建 redis cluster集群
进入容器
> docker exec -it redis-6379 /bin/sh
进入容器后,在容器中创建集群
> redis-cli --cluster create 172.28.0.11:6379 172.28.0.12:6380 172.28.0.13:6381 172.28.0.14:6382 172.28.0.15:6383 --cluster-replicas 1
- redis-cli: Redis 命令行工具。
- –cluster create: 创建 Redis 集群。
- {ip}:{port}: 指定 Redis 节点地址和端口。
–cluster-replicas 1: 指定每个 Redis 节点的副本数量。
2.3 验证redis集群
# 启动redis服务器
> redis-server#连接到redis服务器
> redis-cli -h <host> -p <port># 启动redis集群客户端(-c表示集群)host也可不添加
/data# redis-cli -p[host]-c# 查看集群信息
172.28.0.1:6379> cluster info# 集群创建好之后,11,12,13为主节点,其余为从节点
172.28.0.1:6379> cluster nodes

验证 Redis 集群:
#缓存数据
172.28.0.1:6379> set name Stephen-> Redirected to slot [5798] located at 172.28.0.12:6379
OK
#获取数据
172.28.0.1:6379> get name-> Redirected to slot [5798] located at 172.28.0.16:6379
"stephen"
停止容器:
docker stop redis-6379
当主节点断开之后,会自动将从节点切换为主节点,比如这里将16切换为了主节点
2.4 批量停止容器
for port in $(seq 6379 6384); do docker stop redis-${port}done
2.5 批量删除容器
for port in $(seq 6379 6384); do docker rm redis-${port}done
3. 集群扩容
集群结构:

启动一个新的redis容器,并将其添加到myredis网络中:
docker run -d --name redis-6385 -p 6385:6385 --net myredis redis redis-server /usr/local/etc/redis/redis.conf
添加新节点到集群:
#1. 添加从节点 add-node --slave [新加入节点] [集群中任意节点]
redis-cli cluster add-node 172.28.0.1:6385 172.28.0.1:6379# 2.为确定的master节点添加主节点 add-node --slave --master-id master节点id [新加入节点] [集群任意节点]
redis-cli cluster add-node 172.28.0.1:6386 172.28.0.1:6379 --cluster-slave
--cluster-master-id3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
参数说明:
add-node: 后面的分别跟着新加入的slave和slave对应的master
cluster-slave:表示加入的是slave节点
–cluster-master-id:表示slave对应的master的node ID
redis-cli命令需要再redis容器中执行
哈希槽分配:
新的节点该节点还未分配 slots(哈希槽),所以暂时无法存储数据
redis-cli --cluster reshard 172.28.0.1:6379 --cluster-from fbc63acf974997e37a35b5ca1c71cc002ae1bb40,
fa92c840b4a77463fb27b2b8183f144321a73f86 --cluster-to 41eb57d0685f71aabef57908aef54189b22573b9
--cluster-slots 2000
参数说明:
–cluster-from:表示slot目前所在的节点的node ID,多个ID用逗号分隔
–cluster-to:表示需要新分配节点的node ID
–cluster-slots:分配的slot数量
4. 集群缩容
移除从节点:
# el-node:删除节点,后面跟着slave节点的 ip:port 和node ID
redis-cli --cluster del-node 172.28.0.1:6386 7d6948bb8b6a5ff49f26aef2ebdb400bc3dc7062
迁移主节点哈希槽:
删除主节点6395,就没那么容易了。必须先将节点7上的哈希槽移动到其他主节点上,才可以删除它。需要迁出主节点的哈希槽。
我们需要将7007节点的哈希槽迁移到7001,7002,7003节点上,仍然用上面用过的redis-cli --cluster reshard ...语法,迁移计划:500个slots给6379,700个slots给6380,剩余800个给6381 命令如下:
# 将172.28.0.1:6385节点所在集群中41eb57d0685f71aabef57908aef54189b22573b9 节点的500个哈希槽迁移给 # fbc63acf974997e37a35b5ca1c71cc002ae1bb40节点,不回显需要迁移的slot,直接迁移。
# 第一次迁移500到8379
redis-cli --cluster reshard 172.28.0.1:6385 --cluster-from 41eb57d0685f71aabef57908aef54189b22573b9 --cluster-to fbc63acf974997e37a35b5ca1c71cc002ae1bb40 --cluster-slots 500 --cluster-yes# 第二次迁移700到6380
redis-cli --cluster reshard 172.28.0.1:6385 --cluster-from 41eb57d0685f71aabef57908aef54189b22573b9 --cluster-to fa92c840b4a77463fb27b2b8183f144321a73f86 --cluster-slots 700 --cluster-yes# 第三次迁移800到6391
redis-cli --cluster reshard 172.28.0.1:6385 --cluster-from 41eb57d0685f71aabef57908aef54189b22573b9 --cluster-to 05e9c301a25041ca780f369974764636513e8767 --cluster-slots 800 --cluster-yes
删除主节点:
redis-cli --cluster del-node 172.28.0.1:6385:7007 41eb57d0685f71aabef57908aef54189b22573b9
4. 参考文章:
Docker 搭建 Redis Cluster集群 每一步都带有操作图、命令!!!
Docker搭建Redis Cluster集群及扩容和收容 _
相关文章:
Docker搭建redis-cluster集群
1. 前期准备 1.1 拉redis镜像 docker search redis docker pull redis1. 2 创建网卡 docker network create myredis --subnet 172.28.0.0/16#查看创建的网卡 docker network inspect myredisdocker network rm myredis #删除网卡命令 多个中间 空格隔开 docker network --h…...
实验室类管理平台LIMS系统的ui设计实例
实验室类管理平台LIMS系统的ui设计实例...
<PLC><西门子><工控>西门子博图V18中使用SCL语言编写一个CRC16-modbus校验程序
前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如…...
Linux - 文件管理高级 find、grep
0.管道 | 将前面命令的标准输出传递给管道作为后面的标准输入 1.文件查找 find find 进行文件查找时,默认进行递归查找,会查找隐藏目录下的文件 1.1 用法 # find 查找路径 查找条件... -type // 文件类型 f 普通文件 b 设备 d …...
DOS编程入门:探索基础、深入技巧与实战应用
DOS编程入门:探索基础、深入技巧与实战应用 DOS编程,作为计算机编程的基石之一,对于初学者来说,既是一种挑战,也是一次深入了解计算机底层运作的绝佳机会。本文将从四个方面、五个方面、六个方面和七个方面࿰…...
创建线程的技术难点
在软件开发中,创建线程并正确地管理它们是一个复杂而关键的任务,涉及的技术难点主要有: 线程同步:当多个线程需要访问共享资源时,必须确保它们以某种方式同步,以避免数据不一致或其他并发问题。例如&#…...
Android ViewPager和ViewPager2的区别
一、实现方式 ViewPager内部是通过继承ViewGroup来实现的,ViewPager2内部是通过RecyclerView来实现的(效率更高) 二、支持方向 ViewPager只能横向滑动,ViewPager2可以横向以及竖向滑动 三、采用的适配器 ViewPager有两个适配…...
Oracle数据库面试题-3
41. 请解释Oracle数据库中的内存顾问(Memory Advisor)的作用。 Oracle 数据库中的内存顾问(Memory Advisor) Oracle 数据库中的内存顾问是一个功能,它可以分析数据库的内存使用情况,并提供优化建议&#…...
21.过拟合和欠拟合示例
1. 背景介绍 在机器学习和深度学习中,过拟合和欠拟合是两个非常重要的概念。过拟合指的是模型在训练数据上表现很好,但在新的测试数据上效果变差的情况。欠拟合则是指模型无法很好地拟合训练数据的情况。这两种情况都会导致模型无法很好地泛化ÿ…...
使用import语句导入模块
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 创建模块后,就可以在其他程序中使用该模块了。要使用模块需要先以模块的形式加载模块中的代码,这可以使用import语句实现。im…...
一台FreeBSD笔记本突然鼠标乱动=>pf防火墙设置@FreeBSD
缘起 一台FreeBSD的笔记本,突然鼠标乱动 思考了下,可能原因有三: 1 无线鼠标干扰 正巧没带鼠标,但是插着无线鼠标usb,不知道是不是别人的鼠标跟这个usb串台了。 2 触摸板机械故障 也许是天热触摸板开始有故障了&…...
身份证OCR识别功能介绍
身份证OCR识别功能是一种基于光学字符识别(OCR)技术的解决方案,专门用于从身份证图像中快速、准确地提取和识别信息。以下是关于身份证OCR识别功能的详细介绍: 功能概述 身份证OCR识别功能通过高分辨率的摄像头或扫描仪获取身份证…...
一文看懂:MES定义和功能是什么,以及在数字化工厂的应用
MES应该是继ERP之后制造企业信息化最热门的管理软件,它适应产品个性化与敏捷化制造需求,满足生产过程精益管理而产生和发展起来的信息系统。 作为企业实现数字化与智能化的核心支撑技术与重要组成部分,MES在帮助制造企业走向数字化、智能化等…...
对 SQL 说“不”~
开发人员注意! 您在当前的应用程序架构中是否面临这些问题? 对 SQL 数据库的高吞吐量。SQL 数据库中的瓶颈。 内存数据存储将是解决问题的方案。Redis 是市场上最受欢迎的内存数据存储和缓存选项。Redis 拥有广泛的生态系统,因为主要科技巨…...
【爱空间_登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …...
web前端三大主流框架
一、介绍 目前,前端开发领域的三大主流框架是: React:React是由Facebook开发并维护的开源JavaScript库,用于构建用户界面。它提供了一种声明式的组件化开发方式,能够高效地创建交互性的用户界面。React具有高性能、可…...
git获取的项目无法运行
一、Unsupported engine 问题:在使用命令npm install下载依赖项的时候就遇到了这个问题,有帖子说多试几次,其实这是提示node版本问题,版本的更新出现兼容性问题,多试几次也没用。 解决方案: 更新node.js的…...
java 原生http服务器 测试JS前端ajax访问实现跨域
后端 package Httpv3;import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer;import java.io.IOException; import java.io.OutputStream; import java…...
捋一捋C++中的逻辑运算(一)——表达式逻辑运算
注意,今天要谈的逻辑运算是C语言编程中的“与或非”逻辑运算,不是数学集合中的“交并补”逻辑运算。而编程中的逻辑运算又包括表达式逻辑运算和位逻辑运算,本章介绍表达式逻辑运算,下一章介绍位逻辑运算。 目录 一、几个基本的概…...
qcom 平台系统签名流程
security boot 平台的东东,oem 可定制的功能有限,只能参考平台文档,可以在高通的网站上搜索:Secure Boot Enablement,然后找对应平台的文档xxx-Secure Boot Enablement User Guide, step by step 操作即可 开机校验流…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
