前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【redis】集群 如何搭建集群详解

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

作者头像
椰椰椰耶
发布于 2025-03-28 03:15:30
发布于 2025-03-28 03:15:30
21100
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

集群搭建

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

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

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

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


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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查看有哪些容器正在运行
docker ps -a  

# 关闭此目录下的容器
docker-compose down

1. 创建目录和配置

切换到 Cluster 目录后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
touch docker-compose.yml

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

shell 脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
    image.png|240
  • dodone:在 shell 脚本里面,{} 用来表示变量,不是表示代码块。对于 for 来说,就是使用 dodone 来表示代码块开始和结束
  • \:是续行符,把下一行的内容和当前行,合并成一行。shell 默认情况下,要求把所有的代码都写到一行里,所以可以使用续行符来换行
  • {port}/:创建目录,名字为 redis1 -> redis9(shell 中拼接字符串是直接写到一起,而不需要使用 +) {port} 有点变化。我们通过变量来构造不同的 ipcluster-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 6379:redis 节点自身绑定的端口(容器内的端口),不同容器内部可以有相同端口,后续进行端口映射,再把这些容器内的端口映射到容器外的不同端口即可cluster-announce-bus-port 16379: 业务端口:用来进行业务数据通信。响应 redis 客户端的请求管理端口:为了完成一些管理上的任务来进行通信。如果某个分片中的 redis 主节点挂了,就需要让从节点成为主节点,就需要通过刚才管理端口来完成对应的操作(Tomcat 里面,8080 是业务端口,8005 是管理端口)
  • 这些配置项都不用记,用到时候去查即可

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


执行命令: 通过命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bash generate.sh
image.png
image.png

随后可以看到目录里面:

image.png|213
image.png|213

2. 编写 docker-compose.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: '3.7'
networks:
 mynet:
   ipam:
     config:
       - subnet: 172.30.0.0/24

services:
 redis1:
   image: 'redis:5.0.9'
   container_name: redis1
   restart: always
   volumes:
     - ./redis1/:/etc/redis/
   ports:
     - 6371:6379
     - 16371:16379
   command:
     redis-server /etc/redis/redis.conf
   networks:
     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 地址)

完整配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: '3.7'
networks:
  mynet:
    ipam:
      config:
        - subnet: 172.30.0.0/24

services:
  redis1:
    image: 'redis:5.0.9'
    container_name: redis1
    restart: always
    volumes:
      - ./redis1/:/etc/redis/
    ports:
      - 6371:6379
      - 16371:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.101

  redis2:
    image: 'redis:5.0.9'
    container_name: redis2
    restart: always
    volumes:
      - ./redis2/:/etc/redis/
    ports:
      - 6372:6379
      - 16372:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.102

  redis3:
    image: 'redis:5.0.9'
    container_name: redis3
    restart: always
    volumes:
      - ./redis3/:/etc/redis/
    ports:
      - 6373:6379
      - 16373:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.103

  redis4:
    image: 'redis:5.0.9'
    container_name: redis4
    restart: always
    volumes:
      - ./redis4/:/etc/redis/
    ports:
      - 6374:6379
      - 16374:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.104

  redis5:
    image: 'redis:5.0.9'
    container_name: redis5
    restart: always
    volumes:
      - ./redis5/:/etc/redis/
    ports:
      - 6375:6379
      - 16375:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.105

  redis6:
    image: 'redis:5.0.9'
    container_name: redis6
    restart: always
    volumes:
      - ./redis6/:/etc/redis/
    ports:
      - 6376:6379
      - 16376:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.106

  redis7:
    image: 'redis:5.0.9'
    container_name: redis7
    restart: always
    volumes:
      - ./redis7/:/etc/redis/
    ports:
      - 6377:6379
      - 16377:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.107

  redis8:
    image: 'redis:5.0.9'
    container_name: redis8
    restart: always
    volumes:
      - ./redis8/:/etc/redis/
    ports:
      - 6378:6379
      - 16378:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.108

  redis9:
    image: 'redis:5.0.9'
    container_name: redis9
    restart: always
    volumes:
      - ./redis9/:/etc/redis/
    ports:
      - 6379:6379
      - 16379:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.109

  redis10:
    image: 'redis:5.0.9'
    container_name: redis10
    restart: always
    volumes:
      - ./redis10/:/etc/redis/
    ports:
      - 6380:6379
      - 16380:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.110

  redis11:
    image: 'redis:5.0.9'
    container_name: redis11
    restart: always
    volumes:
      - ./redis11/:/etc/redis/
    ports:
      - 6381:6379
      - 16381:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.111

3. 启动容器

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

image.png
image.png

通过下面命令启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker-compose up -d
image.png
image.png
image.png
image.png

4. 构建集群

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

相关命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
image.png
  • 分片信息、槽位信息、主从节点信息… 都给出了
  • 最后需要手动输入“yes”进行构建
超时

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

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

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

执行命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 执行构建集群命令
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
黑客帝国 - 矩阵雨
实现的代码不多,这里贴上 JavaScript 文件的代码。代码即文档,若难以理解,请结合代码中的注释去学习。
Jimmy_is_jimmy
2022/11/22
6590
黑客帝国 - 矩阵雨
生日主题的烟花特效HTML,CSS,JS
命运之光
2024/11/20
3890
生日主题的烟花特效HTML,CSS,JS
❤️创意网页:绚丽粒子雨动画
欢迎来到本篇技术博客!今天,我们将一起学习如何使用 HTML、CSS 和 JavaScript 来创造一个更炫酷的动态网页示例。我们将在网页中添加许多随机颜色的粒子,让它们以不同的速度在画布上飘动,形成一个美妙的粒子效果。让我们开始吧!
命运之光
2024/03/20
2240
❤️创意网页:绚丽粒子雨动画
❤️创意网页:创意视觉效果粒子循环的网页动画
在这篇技术博客中,我们将学习如何使用HTML5 Canvas和JavaScript创建一个视觉效果震撼的网页动画。我们将绘制一组随机颜色和运动的粒子,通过鼠标的移动产生交互效果,营造出一个令人惊叹的视觉效果。本项目将为您展示如何利用Canvas绘制动态粒子效果,并实现鼠标交互效果的加持。
命运之光
2024/03/20
2000
❤️创意网页:创意视觉效果粒子循环的网页动画
❤️创意网页:创建更炫酷的动态网页——彩色数字(1到9)粒子动画
在这篇技术博客中,我们将学习如何创建一个令人惊叹的动态网页效果。我们将使用HTML5的Canvas元素和JavaScript来实现一个彩色数字粒子动画。这个动画将在浏览器中展示一组随机位置和颜色的彩色数字粒子,它们将以不同的速度从画布顶部飘落至底部,并循环重新开始,形成一个华丽的视觉效果。
命运之光
2024/03/20
4010
❤️创意网页:创建更炫酷的动态网页——彩色数字(1到9)粒子动画
❤️创意网页:HTML5 Canvas技术实现绚丽多彩的烟花特效
烟花特效一直以来都是网页设计中的热门元素之一,它能够为用户带来视觉上的愉悦和惊喜。在这篇技术博客中,我们将使用HTML5 Canvas和JavaScript来实现一个绚丽多彩的烟花特效。我们将逐步解释代码的不同部分,介绍如何利用Canvas API和动画效果来创造这个引人注目的效果。
命运之光
2024/03/20
7570
❤️创意网页:HTML5 Canvas技术实现绚丽多彩的烟花特效
❤️创意网页:制作一个绚丽的烟花效果(HTML、CSS和JavaScript实现)
首先,我们需要在HTML文件中创建一个Canvas元素,用于绘制烟花的效果。我们将为这个Canvas元素添加一个唯一的ID,方便在JavaScript中引用。
命运之光
2024/03/20
1.6K0
❤️创意网页:制作一个绚丽的烟花效果(HTML、CSS和JavaScript实现)
黑客帝国中代码雨如何实现?用 canvas 轻松实现代码雨炫酷效果!
演示地址:https://www.albertyy.com/2020/7/codeRain.html
AlbertYang
2020/09/08
2.8K0
黑客帝国中代码雨如何实现?用 canvas 轻松实现代码雨炫酷效果!
❤️创意网页:炫酷的网页 - 创造华丽粒子动画
欢迎来到本篇技术博客!今天,我们将一起学习如何使用HTML5 Canvas和JavaScript创造一个炫酷的网页效果。我们将绘制彩色粒子并让它们在画布上随机运动,形成华丽的粒子动画。让我们开始吧!
命运之光
2024/03/20
3610
❤️创意网页:炫酷的网页 - 创造华丽粒子动画
❤️创意网页:震撼视觉效果2(真的十分好看) - 创造炫酷的粒子动画
欢迎来到本篇技术博客!今天,我们将一起学习如何使用HTML5 Canvas和JavaScript创造震撼的视觉效果。我们将绘制彩色粒子,使其在鼠标移动的轨迹上生成,形成炫酷的粒子动画。让我们开始吧!
命运之光
2024/03/20
2160
❤️创意网页:震撼视觉效果2(真的十分好看) - 创造炫酷的粒子动画
❤️创意网页:萌翻少女心的发光果冻泡泡 - 使用Canvas绘制可爱动态泡泡效果
在这篇技术博客中,我们将学习如何使用HTML5 Canvas和JavaScript创建一个令人陶醉的发光果冻泡泡动画效果。我们将绘制一系列可爱的、多彩的果冻泡泡,并使它们在画布上随机运动,形成一个令人心动的动态效果。本项目将让你的少女心萌翻!
命运之光
2024/03/20
1830
❤️创意网页:萌翻少女心的发光果冻泡泡 - 使用Canvas绘制可爱动态泡泡效果
❤️创意网页:HTML5,canvas创作科技感粒子特效(科技感粒子、js鼠标跟随、粒子连线)
首先,我们来看一下HTML结构。代码中只有一个<canvas>元素,这是我们用来绘制粒子特效的画布。我们也可以通过给<canvas>元素设置背景图片来增加更多的效果。
命运之光
2024/03/20
2.4K0
❤️创意网页:HTML5,canvas创作科技感粒子特效(科技感粒子、js鼠标跟随、粒子连线)
❤️创意网页:绚丽粒子炸裂特效①(真的超好看)超好看的粒子交互跟随效果~彩色随机粒子爆裂
在现代互联网时代,用户对于网页的要求越来越高,除了内容的丰富和易读性外,视觉效果也成为吸引用户的重要因素之一。本文将向您展示如何利用HTML5和JavaScript创建一个视觉效果震撼的交互式网页,让您的网站在视觉上脱颖而出,吸引更多访问者。
命运之光
2024/03/20
3300
❤️创意网页:绚丽粒子炸裂特效①(真的超好看)超好看的粒子交互跟随效果~彩色随机粒子爆裂
绚丽烟花:HTML5 Canvas 烟花效果实现(文末附完整代码)
在节日或特殊场合,绚丽的烟花总能带来无尽的欢乐和惊喜。今天,我们将通过 HTML5 Canvas 实现一个绚丽的烟花效果,让你的网页也能绽放出美丽的烟花。
码事漫谈
2025/01/27
9201
绚丽烟花:HTML5 Canvas 烟花效果实现(文末附完整代码)
Canvas 自由落体
  前端的学习不是一蹴而就,不积跬步无以至千里,不积小流无以成江海。持续不断的努力才能让你我有所收获,专业的知识还得到机构去学习,培训机构的设立有其存在的必然性,你钱花对了吗?
我不是费圆
2020/12/17
4030
❤️创意网页:萌翻少女心的果冻泡泡 - 创造生动有趣的视觉效果
大家好!欢迎来到本篇技术博客。今天我们将一起学习如何使用HTML5 Canvas和JavaScript创建一个可爱又有趣的果冻泡泡效果。我们将绘制一组彩色泡泡,并通过动画让它们像果冻一样晃动,给人一种充满活力的感觉。让我们开始吧!
命运之光
2024/03/20
2260
❤️创意网页:萌翻少女心的果冻泡泡 - 创造生动有趣的视觉效果
❤️创意网页:打造炫酷网页 - 旋转彩虹背景中的星星动画
在这个技术博客中,我们将学习如何使用HTML5 Canvas和JavaScript创建一个炫酷的网页效果。我们将打造一个动态的旋转彩虹背景,并在其中添加一个可爱的旋转星星动画。通过本博客,您将了解如何使用Canvas绘制彩虹渐变背景和绘制旋转的星星,以及如何通过动画实现星星的旋转效果。
命运之光
2024/03/20
2520
❤️创意网页:打造炫酷网页 - 旋转彩虹背景中的星星动画
Canvas系列(18):实战-烟花效果
今天我们来学习 Canvas 的一个经典案例 —— 烟花效果,具体效果可以看下图。本章的内容会涉及之前的加速度和速度相关的知识,如果对这部分不太了解的建议先看其他章节。
kai666666
2024/11/26
1730
Canvas系列(18):实战-烟花效果
通过Canvas画布制作黑客帝国背景
《黑客帝国》是由华纳兄弟公司发行的系列动作片,该片由沃卓斯基兄弟执导,基努·里维斯、凯莉·安妮·莫斯、劳伦斯·菲什伯恩等主演。影片已上映的有四部,为《黑客帝国》(1999年3月31日上映 )、《黑客帝国2:重装上阵》(2003年5月15日上映)《黑客帝国3:矩阵革命》(2003年11月5日上映 ),《黑客帝国4:矩阵重启》(2021年12月22日在北美上映、2022年1月14日中国上映) 影片讲述了一名年轻的网络黑客尼奥发现看似正常的现实世界实际上是由一个名为“矩阵”的计算机人工智能系统控制的,尼奥在一名神秘女郎崔妮蒂的引导下见到了黑客组织的首领墨菲斯,三人走上了抗争矩阵征途的故事。
GeekLiHua
2025/01/21
860
通过Canvas画布制作黑客帝国背景
网页|黑客帝国字符雨
相信看过黑客帝国的人都对其开头的字符雨印象深刻,但它到底是怎么实现如此炫酷的效果呢?接下来我们就来详细讲一讲如何制作字符雨。
算法与编程之美
2020/05/19
1.6K0
推荐阅读
相关推荐
黑客帝国 - 矩阵雨
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验