云服务器上使用Docker Compose创建Redis三主三从集群

news/2024/7/7 18:45:42

一、环境

  • 云服务器
  • Ubuntu20.4
  • Dokcer 24.0.2

二、步骤

目录结构是这样:

绿色的目录是用来存储容器中的文件,不需要我们手动创建,将路径配置在配置文件中即可。黑色的目录和文件需要自己手动创建。

 我们一共创建7个容器:

redis1~redis6是集群节点,redis_cluster是用来搭建主从关系的一个容器,搭建完之后就关闭了。

1. 开放端口

端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!端口记得开!

6379也要开!!!6379也要开!!!6379也要开!!!6379也要开!!!6379也要开!!!6379也要开!!!6379也要开!!!6379也要开!!!6379也要开!!!6379也要开!!!6379也要开!!!6379也要开!!!6379也要开!!!

redis1redis2redis3redis4redis5redis6
端口号637863806381638263836384
配置文件名redis1.confredis2.confredis3.confredis4.confredis5.confredis6.conf

2. 准备为每个Redis节点准备配置文件

每个节点的配置文件为 redis[节点序号].conf。我是用线程的redis.conf文件改的,主要改下面几个参数,下面以redis1.conf为例:

port 6378
dir /data
requirepass 123456
masterauth 123456
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes6378.conf
cluster-node-timeout 15000
cluster-announce-ip [公网ip]
cluster-announce-port 6378
cluster-announce-bus-port 16378

3. 编写docker-compose.yml文件

一共有7个service,文件全文如下:之后再来解释为啥这么写

version: "3"

services:

  redis1:
    image: redis
    volumes:
      - /test/redis1/redis1.conf:/etc/redis/redis.conf
      - /test/data/redis1:/data
    network_mode: "host"
    command: redis-server /etc/redis/redis.conf

  redis2:
    image: redis
    volumes:
      - /test/redis2/redis2.conf:/etc/redis/redis.conf
      - /test/data/redis2:/data
    network_mode: "host"
    command: redis-server /etc/redis/redis.conf

  redis3:
    image: redis
    volumes:
      - /test/redis3/redis3.conf:/etc/redis/redis.conf
      - /test/data/redis3:/data
    network_mode: "host"
    command: redis-server /etc/redis/redis.conf
  redis3:
    image: redis
    volumes:
      - /test/redis3/redis3.conf:/etc/redis/redis.conf
      - /test/data/redis3:/data
    network_mode: "host"
    command: redis-server /etc/redis/redis.conf

  redis4:
    image: redis
    volumes:
      - /test/redis4/redis4.conf:/etc/redis/redis.conf
      - /test/data/redis4:/data
    network_mode: "host"
    command: redis-server /etc/redis/redis.conf

  redis5:
    image: redis
    volumes:
      - /test/redis5/redis5.conf:/etc/redis/redis.conf
      - /test/data/redis5:/data
    network_mode: "host"
    command: redis-server /etc/redis/redis.conf

  redis6:
    image: redis
    volumes:
      - /test/redis6/redis6.conf:/etc/redis/redis.conf
      - /test/data/redis6:/data
    network_mode: "host"
    command: redis-server /etc/redis/redis.conf


  redis-cluster:
    image: redis
    command: redis-cli -a 123456  --cluster create [内网IP]:6380 [内网IP]:6378 [内网IP]:6381 [内网IP]:6382 [内网IP]:6383 [内网IP]:6384 --cluster-replicas 1  --cluster-yes
    network_mode: "host"
    depends_on:
      - redis1
      - redis2
      - redis3
      - redis4
      - redis5
      - redis6

使用以下命令检查配置有没有什么语法上的错误,没有消息就是好消息。

dokcer-compose config -q

3.1 redis1服务

image 参数:使用最新的redis镜像

volumes 参数:数据卷映射,映射有两个一个是映射刚准备好的redis[节点序号].conf配置文件。

network_mode 参数:这里使用的是"host"模式。

也可以不选择这个模式转而这样配置:

    ports:
      - 6382:6382
      - 16382:16382
    networks: 
      - my_net 

【注意1】如果采用了ports参数+networks参数的配置,就不能再使用network_mode参数了,二者是冲突的,并且对于redis-cluster服务就可以使用各个服务名来访问,像这样:

    command: redis-cli -a 123456  --cluster create redis1:6380 redis2:6378 redis3:6381 redis4:6382 redis5:6383 redis6:6384 --cluster-replicas 1  --cluster-yes

【注意2】如果采用了ports参数+networks参数的配置,则每个节点都应该配置同一个neiworks,否则节点之间没法通信呀

【注意3】如果采用了ports参数+networks参数的配置,则不配置networks参数也可以,因为Docker Compose会根据这个文件的目录为我们配置一个响应的网络,节点们会在同一个网段下,使用如下命令就可以查看这些网络了,其中[test]_my_net是帮我们创建的网络,是bridge类型的:

 没配置net_works的情况下,[test]_default是帮我们创建的网络:

 直接使用network_mode: "host" 参数,则使用的就是宿主机的IP,Docker Compose就不会再配置新的网络了,至于端口我们在redis的配置文件中配置过了。

【注意4】为什么端口号开了两个?

一个是port,一个是port+10000.

【注意5】两种配置方式的区别在哪里。ports参数+networks参数的配置 是官网推荐的配置方法,这样在各个配置文件使用服务名(这里的服务就是每个redis节点)redis1、redis2……就可以在容器间通信了。但是我选择了network_mode="host"的模式,是因为我自己的个人电脑上还有java web的代码想访问redis集群,而我没有把这个web应用的 jar 包推送到服务器上作为一个微服务和redis节点们一起启动,共享网段,如果用ports参数+networks参数的配置就没办法访问redis集群。详情请见 Docker Compose的文档。

depends_on 参数:表示该服务依赖于哪些服务,很明显,我们需要先起6个redis服务,再在它们之间构建集群

command 参数:表示运行下面的命令,使用指定的redis.conf配置文件来启动redis服务端。

redis-server /etc/redis/redis.conf

3.2 redis-cluster服务

command:该服务会运行下面的命令来构建主从关系:

 redis-cli -a 123456  --cluster create [内网IP]:6380 [内网IP]:6378 [内网IP]:6381 [内网IP]:6382 [内网IP]:6383 [内网IP]:6384 --cluster-replicas 1  --cluster-yes

4. 运行,测试 

命令行运行:

后面那个-d参数可加可不加,我就打了个括号,我没加,因为还想看看实时的日志,就没有后台启动:

docker-compose up (-d)

看最后一行,用于构建主从关系的容器redis-cluster_1运行完命令构建主从关系的命令以后就退出了。

 启动完之后使用docker ps -a命令可以看到,7个容器已经启动了,还有一个容器已经执行完毕并且退出了,而且当我们没有指定容器名称的时候,Docker Compose 会自动帮我们指定 [目录名]_服务名_1作为容器名。

随便进入一个容器,使用cluster nodes和cluster info命令看看集群状态,如果cluster_state:fail那就是节点没在集群里,排查一下哪边配置有问题。

最后最后,我在个人电脑上要连接这个集群,本地配置的是:

spring.data.redis.database=0
spring.data.redis.password=123456
spring.data.redis.cluster.nodes=[公网IP]:6385,[公网IP]:6380,[公网IP]:6381,[公网IP]:6382,[公网IP]:6383,[公网IP]:6384

三、小建议

3.1 怎么排错

报错的时候找找原因:

比如看看单个容器的日志

docker logs [容器IP/容器名]

3.2 使用脚本

一下子创建六个节点,难免手抖,写错,踩坑。建议一些重复的命令用脚本解决,虽然好像没帮上什么大忙,但是也能免得手忙脚乱的。

比如我总用这个脚本

#!/bin/bash
rm -rf ./data
docker rm -f test_redis1_1
docker rm -f test_redis2_1
docker rm -f test_redis3_1
docker rm -f test_redis4_1
docker rm -f test_redis5_1
docker rm -f test_redis6_1
docker-compose up

(报错=》一番处理 =》data目录有东西了再次启动失败了啊喂 =》删除data目录 =》容器名冲突了凸(艹皿艹 ) =》删除已经创建的容器 =》再次启动)

说多了都是泪。


http://lihuaxi.xjx100.cn/news/1241522.html

相关文章

java基础(多线程)-常用方法具体使用

一、Thread.start()方法 start()方法:启动子线程 new Thread();当前线程的状态为NEW 调用start()方法之后当前线程的状态变为RUNNABLE 二、Thread.sleep()静态方法 1. 调用sleep会让当前线程从Running进入Timed Waiting 状态 2.其他线程可以使用interrupt方法…

散热差、设计古板,因循守旧的联想Thinkpad还能获得忠粉的青睐吗?

拥有航天梦想的联想ThinkPad,在5月18日的新品发布会上,再次与中国航天太空创想达成了合作,将整场发布会的格调提升到了没有“边际”的高度。 发布会上,联想ThinkPad宣布了几款新品的面世,产品性能的升级和优化必不可少…

电脑多久重装一次系统比较好

在长时间使用电脑后,一些用户可能会考虑重装系统来提升性能和稳定性。然而,电脑重装系统的频率是一个有争议的问题。本文将探讨电脑重装系统的最佳频率,以帮助您做出明智的决策。 工具/原料: 系统版本:win7旗舰版 品…

新能源汽车保养vr仿真教学软件为职业培训带来新的思路和方法

电动车电池更换VR虚拟体验是一种利用VR虚拟现实技术实现对电动车电池更换进行模拟仿真演示和实操训练的虚拟仿真实验教学课件,相比传统教学模式,有效提高学生的实践能力和技能水平。 通过VR技术模拟现场,使培训人员可以身临其境滴观摩操作过程…

前端面试经验技巧分享

👩 个人主页:不爱吃糖的程序媛 🙋‍♂️ 作者简介:前端领域新星创作者、CSDN内容合伙人,专注于前端各领域技术,成长的路上共同学习共同进步,一起加油呀! ✨系列专栏:前端…

【UE】玻璃材质

效果 步骤 1. 新建一个材质,这里命名为“M_GLASS” 双击打开“M_GLASS”,左下角混合模式设置为半透明 光照模式设置为表面前向着色 将基础颜色提升为参数 同样还需提升为参数的有“高光度”、“粗糙度”、“不透明度”、“折射” 设置高光度的默认值和最…

Go 框架 iris 文档

目录 文章目录 安装[故障 排除](https://www.iris-go.com/docs/#/?idtroubleshooting) 快速入门基准接口示例使用获取、发布、放置、修补、删除和选项路径中的参数查询字符串参数多部分/乌伦编码形式再比如:查询帖子表单查询和发布表单参数上传文件单个文件多个文件…

阿里人手一本的Java性能调优手册,几乎涵盖了性能优化的所有操作

说起性能调优,想必大家都知道,但是就是没怎么用过,所以在Java性能优化上面临着很多的困扰,比如: 能力修炼中,由于常年接触 CRUD,缺乏高并发这一实践环境,对“性能优化”只能通过理论…