【redis】集群 如何搭建集群详解

文章目录

  • 集群搭建
  • 1. 创建目录和配置
  • 2. 编写 docker-compose.yml
    • 完整配置文件
  • 3. 启动容器
  • 4. 构建集群
      • 超时

集群搭建

基于 docker 在我们云服务器上搭建出一个 redis 集群出来image.png|486

当前节点,主要是因为我们只有一个云服务器,搞分布式系统,就比较麻烦。实际工作中,一般是通过多个主机的方式,来搭建集群

  • 此处我们使用 9docker 容器,来模拟 9 台服务器

此处我们创建 11redis 节点,其中前 9 个用来演示集群的搭建,后 2 个用来演示集群扩容


一定要记得,把以前启动的 redis 容器给停掉

切换到对应目录下后,输入:

# 查看有哪些容器正在运行
docker ps -a  # 关闭此目录下的容器
docker-compose down

1. 创建目录和配置

切换到 Cluster 目录后

touch docker-compose.ymltouch generate.sh

image.png|422

  • Linux 上,以 .sh 后缀结尾的文件,称为“shell 脚本
    • 使用 Linux 的时候,都是通过一些命令来进行操作的。使用命令操作,就非常适合把命令给写到一个文件中,批量化执行
    • 同时,还能加入:条件、循环、函数等机制。 因此,就可以基于这些来完成更复杂的工作了
  • 此处我们需要创建 11redis 节点,这些 redis 的配置文件内容,大同小异,此时就可以使用脚本来批量生成(也可以不使用脚本,手动一个一个改)

shell 脚本:

for port in $(seq 1 9); \
do \
mkdir -p redis${port}/
touch redis${port}/redis.conf
cat << EOF > redis${port}/redis.conf
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.30.0.10${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
EOF
done# 注意 cluster-announce-ip 的值有变化.
for port in $(seq 10 11); \
do \
mkdir -p redis${port}/
touch redis${port}/redis.conf
cat << EOF > redis${port}/redis.conf
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.30.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
EOF
done
  • for port in $(seq 1 9); \:基于范围的循环。类似与 Javafor each
    • seq 就是一个 Linux 命令,后面俩参数就是从哪到哪,能生成 [1, 9] 这个区间image.png|240
  • dodone:在 shell 脚本里面,{} 用来表示变量,不是表示代码块。对于 for 来说,就是使用 dodone 来表示代码块开始和结束
  • \:是续行符,把下一行的内容和当前行,合并成一行。shell 默认情况下,要求把所有的代码都写到一行里,所以可以使用续行符来换行
  • 循环体里面:
    1. mkdir -p redis${port}/:创建目录,名字为 redis1 -> redis9shell 中拼接字符串是直接写到一起,而不需要使用 +
      • ${} 是取变量的值操作image.png|360
    2. touch redis${port}/redis. conf :创建文件。在刚才的目录基础下,创建 redis.conf
    3. cat:进行写内容。将下面的内容,写到刚刚创建的文件中去
      • 文件里面大多是一样的,cluster-announce-ip 172.30.0.10${port} 有点变化。我们通过变量来构造不同的 ip
      • cluster-enabled yes:开启集群
      • cluster-config-file nodes.conf:里面包含了一些集群的配置信息,不用我们手动写,而是 redis 自动生成的(后续启动这些节点之后,会配置一些 redis 集群信息)
      • cluster-node-timeout 5000:多个节点之间进行交互,保持联络
      • cluster-announce-ip 172.30.0.10${port}:该 redis 节点(自己)所在主机的 ip 地址(当前是使用 docker 容器模拟的主机,所以此处写的是 docker 容器的 ip
      • cluster-announce-port 6379redis 节点自身绑定的端口(容器内的端口),不同容器内部可以有相同端口,后续进行端口映射,再把这些容器内的端口映射到容器外的不同端口即可
      • cluster-announce-bus-port 16379
        • 业务端口:用来进行业务数据通信。响应 redis 客户端的请求
        • 管理端口:为了完成一些管理上的任务来进行通信。如果某个分片中的 redis 主节点挂了,就需要让从节点成为主节点,就需要通过刚才管理端口来完成对应的操作(Tomcat 里面,8080 是业务端口,8005 是管理端口)
  • 这些配置项都不用记,用到时候去查即可

预期效果:得到 11 个目录,每个目录里面都有一个配置文件,配置文件中,ip 地址各不相同


执行命令
通过命令:

bash generate.sh

image.png

随后可以看到目录里面:image.png|213

2. 编写 docker-compose.yml

version: '3.7'
networks:mynet:ipam:config:- subnet: 172.30.0.0/24services:redis1:image: 'redis:5.0.9'container_name: redis1restart: alwaysvolumes:- ./redis1/:/etc/redis/ports:- 6371:6379- 16371:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.101// 剩余10个容器,格式和这个一样,将名字、端口号、ip地址递增即可
  • networks:此处为了后续创建静态 ip,此时要先手动创建出网络,同时给这个网段也分配 ip
    • ip 地址 = 网络号 + 主机号。使用子网掩码的方式来区分网络号和主机号
    • 这里的 /24 就代表子网掩码左边 24 位都是 1 ,右边 8 位是 0255.255.255.0,网络号就是 172.30.0
      • ip 是内网 ip
      • 配置的网络号不能和当前主机上现有的其他网段冲突(每个人的主机上已有的网段,具体不一定一样,ifconfig
  • 后面就是常规操作,配置容器
    • ports:此处不进行端口映射,也是可以的,映射一下目的是为了在容器外面通过客户端直接进行访问
    • 静态 ip 配置,网络号部分要和前面的网段一致,主机号部分,可以随便配置(1-255,保证不重复),按照之前在配置文件中写的 101-11111 台主机

进行上述配置的时候,一定要保证前后一致性(第一步和第二部相关部分,端口号、ip 地址)

完整配置文件

version: '3.7'
networks:mynet:ipam:config:- subnet: 172.30.0.0/24services:redis1:image: 'redis:5.0.9'container_name: redis1restart: alwaysvolumes:- ./redis1/:/etc/redis/ports:- 6371:6379- 16371:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.101redis2:image: 'redis:5.0.9'container_name: redis2restart: alwaysvolumes:- ./redis2/:/etc/redis/ports:- 6372:6379- 16372:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.102redis3:image: 'redis:5.0.9'container_name: redis3restart: alwaysvolumes:- ./redis3/:/etc/redis/ports:- 6373:6379- 16373:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.103redis4:image: 'redis:5.0.9'container_name: redis4restart: alwaysvolumes:- ./redis4/:/etc/redis/ports:- 6374:6379- 16374:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.104redis5:image: 'redis:5.0.9'container_name: redis5restart: alwaysvolumes:- ./redis5/:/etc/redis/ports:- 6375:6379- 16375:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.105redis6:image: 'redis:5.0.9'container_name: redis6restart: alwaysvolumes:- ./redis6/:/etc/redis/ports:- 6376:6379- 16376:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.106redis7:image: 'redis:5.0.9'container_name: redis7restart: alwaysvolumes:- ./redis7/:/etc/redis/ports:- 6377:6379- 16377:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.107redis8:image: 'redis:5.0.9'container_name: redis8restart: alwaysvolumes:- ./redis8/:/etc/redis/ports:- 6378:6379- 16378:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.108redis9:image: 'redis:5.0.9'container_name: redis9restart: alwaysvolumes:- ./redis9/:/etc/redis/ports:- 6379:6379- 16379:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.109redis10:image: 'redis:5.0.9'container_name: redis10restart: alwaysvolumes:- ./redis10/:/etc/redis/ports:- 6380:6379- 16380:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.110redis11:image: 'redis:5.0.9'container_name: redis11restart: alwaysvolumes:- ./redis11/:/etc/redis/ports:- 6381:6379- 16381:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.111

3. 启动容器

启动之前,一定要把之前已经运行的 redis 相关东西都干掉!否则就可能因为端口冲突等原因,导致现在的启动失败image.png

通过下面命令启动

docker-compose up -d

image.png
image.png

4. 构建集群

此处把前 9 个主机构建成集群,36 从,后 2 个主机暂时不用

相关命令:

redis-cli --cluster create 172.30.0.101:6379 172.30.0.102:6379 172.30.0.103:6379 172.30.0.104:6379 172.30.0.105:6379 172.30.0.106:6379 172.30.0.107:6379 172.30.0.108:6379 172.30.0.109:6379 --cluster-replicas 2
  • --cluster create:建立集群,后面填写每个节点的 ip 和地址
  • --cluster-replicas 2:表示每个主节点要两个从节点备份
    • 这个配置设置之后,redis 就知道了,3 个节点是一伙的,一共 3 个分片

redis 在构建集群的时候,谁是主节点,谁是从节点,谁和谁是一个分片,都是不固定的

  • 本身从集群的角度来看,提供的这些节点之间本来就应该是等价的

命令执行完之后image.png

  • 分片信息、槽位信息、主从节点信息… 都给出了
  • 最后需要手动输入“yes”进行构建

超时

如果在输入构建命令连接不上,超时,就需要进行一步处理

在进行构建集群操作之前,需要先让这个命令在任意一个 redis 容器中进行

  • 所有的 redis 容器都是在同一个局域网内,但是此时这个宿主机却不在,想要进行后续操作,就必须要保证都在同一个局域网内
  • 在容器内进行构建集群的操作,就能保证都是在同一个局域网内了

执行命令

docker exec -it ce /bin/bash
  • docker exec:在一个已经运行中的 docker 容器内执行命令
  • -it
    • -i:表示以交互模式运行,让能够保持输入流打开
    • -t:分配一个“伪终端”(TTY),这样你可以像在普通终端中一样与容器交互
  • ce:容器的名字或容器 ID,表示要进入的容器
  • bin/bash:表示在容器内部启动一个 Bash shell,通常用于容器内操作

在集群构建完毕之后,输入 exit 就可以退出容器


  1. 生成每个 redis 节点的配置文件
  2. 使用 docker 创建出 11redis 节点,并且启动容器
  3. 使用 redis-cli 执行构建集群命令

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

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

相关文章

[langchain教程]langchain03——用langchain构建RAG应用

RAG RAG过程 离线过程&#xff1a; 加载文档将文档按一定条件切割成片段将切割的文本片段转为向量&#xff0c;存入检索引擎&#xff08;向量库&#xff09; 在线过程&#xff1a; 用户输入Query&#xff0c;将Query转为向量从向量库检索&#xff0c;获得相似度TopN信息将…

C语言复习笔记--字符函数和字符串函数(下)

在上篇我们了解了部分字符函数及字符串函数,下面我们来看剩下的字符串函数. strstr 的使用和模拟实现 老规矩,我们先了解一下strstr这个函数,下面看下这个函数的函数原型. char * strstr ( const char * str1, const char * str2); 如果没找到就返回NULL指针. 下面我们看下它的…

FreeRTOS中的优先级翻转问题及其解决方案:互斥信号量详解

FreeRTOS中的优先级翻转问题及其解决方案&#xff1a;互斥信号量详解 在实时操作系统中&#xff0c;任务调度是基于优先级的&#xff0c;高优先级任务应该优先于低优先级任务执行。但在实际应用中&#xff0c;有时会出现"优先级翻转"的现象&#xff0c;严重影响系统…

深度学习-全连接神经网络

四、参数初始化 神经网络的参数初始化是训练深度学习模型的关键步骤之一。初始化参数&#xff08;通常是权重和偏置&#xff09;会对模型的训练速度、收敛性以及最终的性能产生重要影响。下面是关于神经网络参数初始化的一些常见方法及其相关知识点。 官方文档参考&#xff1…

GIS开发笔记(9)结合osg及osgEarth实现三维球经纬网格绘制及显隐

一、实现效果 二、实现原理 按照5的间隔分别创建经纬线的节点,挂在到组合节点,组合节点挂接到根节点。可以根据需要设置间隔度数和线宽、线的颜色。 三、参考代码 //创建经纬线的节点 osg::Node *GlobeWidget::createGraticuleGeometry(float interval, const osg::Vec4 …

《Relay IR的基石:expr.h 中的表达式类型系统剖析》

TVM Relay源码深度解读 文章目录 TVM Relay源码深度解读一 、从Constant看Relay表达式的设计哲学1. 类定义概述2. ConstantNode 详解1. 核心成员2. 关键方法3. 类型系统注册 3. Constant 详解1. 核心功能 二. 核心内容概述(1) Relay表达式基类1. RelayExprNode 和 RelayExpr 的…

自动驾驶地图数据传输协议ADASIS v2

ADASIS&#xff08;Advanced Driver Assistance Systems Interface Specification&#xff09;直译过来就是 ADAS 接口规格&#xff0c;它要负责的东西其实很简单&#xff0c;就是为自动驾驶车辆提供前方道路交通相关的数据&#xff0c;这些数据被抽象成一个标准化的概念&#…

Flutter 状态管理 Riverpod

Android Studio版本 Flutter SDK 版本 将依赖项添加到您的应用 flutter pub add flutter_riverpod flutter pub add riverpod_annotation flutter pub add dev:riverpod_generator flutter pub add dev:build_runner flutter pub add dev:custom_lint flutter pub add dev:riv…

【EasyPan】MySQL主键与索引核心作用解析

【EasyPan】项目常见问题解答&#xff08;自用&持续更新中…&#xff09;汇总版 MySQL主键与索引核心作用解析 一、主键&#xff08;PRIMARY KEY&#xff09;核心作用 1. 数据唯一标识 -- 创建表时定义主键 CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,use…

IcePlayer音乐播放器项目分析及学习指南

IcePlayer音乐播放器项目分析及学习指南 项目概述 IcePlayer是一个基于Qt5框架开发的音乐播放器应用程序&#xff0c;使用Visual Studio 2013作为开发环境。该项目实现了音乐播放、歌词显示、专辑图片获取等功能&#xff0c;展现了桌面应用程序开发的核心技术和设计思想。 技…

vscode 打开新页签

目录 vscode 打开新页签 完整settings.json内容&#xff1a; vscode 打开新页签 .vscode目录中 新建settings.json 在 settings.json 文件中&#xff0c;添加或修改以下行&#xff1a; json "workbench.editor.enablePreview": false 这将禁用预览模式&#xff0…

C语言高频面试题——常量指针与指针常量区别

1. 常量指针&#xff08;Pointer to Constant&#xff09; 定义&#xff1a; 常量指针是指向一个常量数据的指针&#xff0c;即指针指向的内容不能通过该指针被修改。 语法&#xff1a; const int* ptr;或者&#xff1a; int const* ptr;解释&#xff1a; const修饰的是指…

c++基础·列表初始化

目录 一、列表初始化的核心优势 二、基础数据类型与数组初始化 1. 基础类型初始化 2. 数组初始化 三、类与结构体初始化 1. 构造函数匹配规则 2. 注意事项 四、标准容器初始化 五、聚合类型&#xff08;Aggregate Types&#xff09;初始化 1. 聚合类型定义 2. 初始化…

数据分析与产品、运营、市场之间如何有效对齐

数据分析的重要性在于它能够将海量的原始信息转化为可操作的洞察。以产品开发为例,通过用户行为数据的分析,产品经理可以清晰了解哪些功能被频繁使用,哪些设计导致用户流失,从而优化迭代方向。运营团队则依靠数据分析来监控供应链效率、预测需求波动,甚至通过实时数据调整…

[C]基础11.深入理解指针(3)

博客主页&#xff1a;向不悔本篇专栏&#xff1a;[C]您的支持&#xff0c;是我的创作动力。 文章目录 0、总结1、字符指针变量2、数组指针变量2.1 数组指针变量是什么&#xff1f;2.2 数组指针变量怎么初始化&#xff1f; 3、二维数组传参的本质4、函数指针变量4.1 函数指针变量…

【漏洞复现】CVE-2024-38856(ApacheOfbiz RCE)

【漏洞复现】CVE-2024-38856&#xff08;ApacheOfbiz RCE&#xff09; 1. 漏洞描述 Apache OFBiz 是一个开源的企业资源规划&#xff08;ERP&#xff09;系统。它提供了一套企业应用程序&#xff0c;用于集成和自动化企业的许多业务流程。 这个漏洞是由于对 CVE-2023-51467 的…

C++入门小馆: 深入string类(二)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

【nginx】服务的信号控制

目录 1. 说明2. 常用信号及作用3. 信号控制的具体操作3.1 获取 Nginx 主进程 PID3.2 发送信号 4. 应用场景4.1 重新加载配置文件4.2 日志切割 5. 平滑升级 Nginx6. 注意事项 1. 说明 1.Nginx 的信号控制是其管理服务的重要机制&#xff0c;通过向主进程发送特定信号&#xff0…

Ubuntu下展锐刷机工具spd_dump使用说明

spd_dump使用说明 源码地址&#xff1a;https://github.com/ilyakurdyukov/spreadtrum_flash 编译环境准备&#xff1a; sudo apt update sudo apt install git sudo apt install build-essential sudo apt install libusb-1.0-0-devIf you create /etc/udev/rules.d/80-spd…

鸿蒙NEXT开发LRUCache缓存工具类(单例模式)(ArkTs)

import { util } from kit.ArkTS;/*** LRUCache缓存工具类&#xff08;单例模式&#xff09;* author 鸿蒙布道师* since 2025/04/21*/ export class LRUCacheUtil {private static instance: LRUCacheUtil;private lruCache: util.LRUCache<string, any>;/*** 私有构造函…