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

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

作者头像
椰椰椰耶
发布于 2025-03-28 03:15:30
发布于 2025-03-28 03:15:30
14800
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数: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 中拼接字符串是直接写到一起,而不需要使用 +) portipclusterenabledyesclusterconfigfilenodes.confredisredisclusternodetimeout5000clusterannounceip172.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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Redis入门到精通十一】Redis集群
如上图所示,在把全集数据平均分成多个部分,交给多个Redis主从服务器存储数据,这就是Redis集群,其中每个master与其对应的slave保存的是同样的数据,占总数据的1/3。
小皮侠
2024/10/11
1640
【Redis入门到精通十一】Redis集群
【云安全最佳实践】搭建redis集群
一、基础概览1、redis集群最少需要6个节点,且redis集群下只有db0,不支持多db。2、开放端口节点访问:6391-6393集群连接:16391-16393二、准备容器挂载的目录1.创建根目录mkdir /servercd /server2.创建容器目录。然后给每个节点创建对应的目录和配置文件服务器1 192.168.79.131 init.shfor port in $(seq 6391 6393); \do \mkdir -p /server/redis-cluster/redis-node-$
用户4392429
2022/10/19
8570
Docker篇之秒杀项目环境部署
后期要使用Canal,需要把MySQL的配置文件提取出来,所以要进行相关的配置文件的编写
Maynor
2021/12/06
5400
Docker 安装 Redis 单机&集群总结
Redis 集群是一种高可用、可水平扩展的 Redis 部署方式。它将 Redis 数据库分布在多个节点上,是为了提供高性能、高可用性和可伸缩性而设计的分布式 Redis 解决方案
易墨
2023/10/10
7510
Docker 安装 Redis 单机&集群总结
Redis高级知识
方式二:在不修改Redis配置文件的前提下,在第一次连接redis时,输入命名 Config set requirepass 密码 后再次操作操作redis时,需要做auth校验。auth 123456
乐心湖
2021/01/18
5960
Redis高级知识
基于Docker搭建Redis Cluster ,三主三从的配置
docker network create --subnet=192.168.200.0/24 redisclusternet
yingzi_code
2019/08/31
1.8K0
【redis】哨兵:搭建主从/哨兵节点详解和细节
使用 docker-compose 一下,启动了 N 个容器,此时 N 个容器都处于同一个“局域网”中
椰椰椰耶
2025/03/26
1530
【redis】哨兵:搭建主从/哨兵节点详解和细节
《Redis入门这一篇就够了》
通过Nginx代理到某一个服务器上时,会造成在8080或者8081的Tomcat服务器上登录,Tomcat服务器会给客户端返回一个JSessionID的Cookie值,客户端再次请求时,会携带这个JSessionID,并且会通过JSessionID去Tomcat中找Session,如果找到Session,直接使用,如果找不到,重新创建一个Session,并且需要返回一个全新的JSessionID。
2020/11/24
6480
《Redis入门这一篇就够了》
Redis进阶学习07--分布式缓存--下
分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:
大忽悠爱学习
2022/05/09
4550
Redis进阶学习07--分布式缓存--下
Docker网络详解
Docker 网络 Docker网络原理 每启动一个Docker 容器,docker 将给docker 容器分配一个ip 只要启动了docker 就会有一个docker0 网络使用的是桥接模式,ev
PayneWu
2020/12/18
4710
Docker网络详解
Docker部署redis-cluster集群
1、创建网络 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker network create redis --subnet 172.38.0.0/16 4323026b1d7145e167f22ecc0e908dfe0d75765380840e29e6b7010f1b3b902c [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker network ls NETWORK ID NAME DRI
胡齐
2020/05/07
1.3K0
【Docker】搭建部署Redis高可用集群实验
【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili
宝耶需努力
2022/12/13
5010
【Docker】搭建部署Redis高可用集群实验
安装gcc-c++
前面已经简单熟悉过redis的下载安装使用,今天接着部署redis集群(cluster),简单体会一下redis集群的高可用特性。
甜点cc
2022/10/24
6990
安装gcc-c++
Docker搭建Redis Cluster集群
Redis Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
子润先生
2021/06/23
8.5K2
Dcoker搭建zookeeper集群操作
使用 ZK 命令行客户端连接 ZK 因为刚才我们启动的那个 ZK 容器并没有绑定宿主机的端口, 因此我们不能直接访问它. 但是我们可以通过 Docker 的 link 机制来对这个 ZK 容器进行访问. 执行如下命令:
大忽悠爱学习
2021/11/19
6560
Docker安装crmeb商城教程
docker 官网下载 https://www.docker.com/products/docker-desktop
西里国际站
2023/04/19
2K0
Docker实战:Docker部署Redis集群
数据从redis-4服务获取到,redis-4服务是redis-3服务的从机,这就实现了高可用!!
百思不得小赵
2022/12/01
5690
Docker实战:Docker部署Redis集群
Docker快速建立Redis集群(Cluster)并配置外网访问 服务器基础配置docker 配置建立集群
本篇文章介绍redis集群的快速搭建,不对redis进行深入探究,方便想要了解redis集群的朋友快速进行测试。
蓝夏
2021/03/19
1.7K0
【redis】哨兵相关知识超详解(覆盖面试考点)
Redis 的主从复制模式下,⼀旦主节点由于故障不能提供服务,需要⼈⼯进⾏主从切换,同时⼤量的客⼾端需要被通知切换到新的主节点上,对于上了⼀定规模的应⽤来说,这种⽅案是⽆法接受的,于是 Redis 从 2.8 开始提供了 Redis Sentinel(哨兵)加个来解决这个问题。本章主要内容如下:
椰椰椰耶
2025/03/28
1020
【redis】哨兵相关知识超详解(覆盖面试考点)
Docker 网络之redis集群搭建
Docker 搭建redis集群成功! 树苗如果因为怕痛而拒绝修剪,那就永远不会成材。
木字楠
2022/11/15
3540
Docker 网络之redis集群搭建
相关推荐
【Redis入门到精通十一】Redis集群
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文