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

一、环境

  • 云服务器
  • 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目录 =》容器名冲突了凸(艹皿艹 ) =》删除已经创建的容器 =》再次启动)

说多了都是泪。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【实现微信红包效果】前端CSS实现微信红包打开效果(附源码下载)

【写在前面】上次领了一分钱微信红包后就在想如何实现红包打开翻转效果,微信带来最大的一个里程碑就是红包功能的开发,以至于出现这个现象,一块钱掉地上都不一定有人捡,但是微信群里抢到1分钱还得说一声谢谢老板,更有甚…

JQuery全部详细笔记-下

JQuery全部详细笔记-下 jQuery 的 DOM 操作 查找节点, 修改属性 查找属性节点: 查找到所需要的元素之后, 可以调用 jQuery 对象的 attr() 方法来获取它的各种属性值 应用实例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UT…

《导航帖》-全系列软考A计划

专栏分享 点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 文章目录 &#x1f449;关于作者&#x1f449;前提&#x1f449;链接追踪&#x1f449…

【探索 Kubernetes|容器基础进阶篇 系列 4】理解现代云原生时代的引擎

文章目录 系列文章目录&#x1f479; 关于作者一、前言|回顾二、静态和动态视图三、爆火的容器编排工具 Kubernetes 的诞生四、Kubernetes 要解决的问题是什么&#xff1f;五、理解 Kubernetes 全局架构图Master&#xff08;控制节点&#xff09;Node&#xff08;计算节点&…

Unreal Engine 5.1 AI行为树基础入门

ai行为树理解起来其实是npc根据自身一些情况进行一些逻辑执行&#xff0c;而这些逻辑是我们使用ai行为树去实现的。 ai行为树需要一个寻路网格体边界体积&#xff0c;在ue引擎中&#xff0c;体积Actor分为多种&#xff0c;寻路网格体边界体积只是其中的一种。 关于其它的体积&a…

什么是M-LAG?为什么需要M-LAG?

M-LAG&#xff08;Multichassis Link Aggregation Group&#xff09;提供一种跨设备链路聚合的技术。M-LAG通过将两台接入交换机以同一个状态和用户侧设备或服务器进行跨设备的链路聚合&#xff0c;把链路的可靠性从单板级提升到设备级。同时&#xff0c;由于M-LAG设备可以单独…

基于SSM的养老机构信息管理系统设计与实现

摘 要 随着我国老年人逐渐增加&#xff0c;老人们的子女数量减少&#xff0c;工作时间过长无暇照顾父母&#xff0c;导致养老院和护工需求量大幅上涨。伴随我国生活水平提高的同时对老年人的护工人员的要求也越来越高。根据以上要求关于养老院有很多的信息需要进行管理&#…

项目笔记-瑞吉外卖(全)

文章目录 1.业务开发day011.软件开发整体介绍2.项目整体介绍:star:3.开发环境搭建4.登录功能:star:4.1代码实现 5.退出功能6.页面效果出现 day021.完善登录功能2.新增员工功能3.启用禁用员工信息:star:(自定义消息转换器使用)4.编辑员工信息 day031.公共字段自动填充2.新增分类…

创业很长时间以后

创业过很长时间以后…综合能力是有滴 创业和打工后的思维习惯 为了效率&#xff0c;一般情况是这样滴 趣讲大白话&#xff1a;区别还是有滴 【趣讲信息科技195期】 **************************** 创业还是很难滴 每年成立很多新公司 有很多公司关门 公司平均生存时间&#xff1…

【哈佛积极心理学笔记】第6讲 乐观主义

第6讲 乐观主义 How can we create consciously and subconsciously a positive environment, where we actually can take out the most moral, the most successful self to appreciate that self. Create a powerful positive situation to bring out the best in people.…

基于Github开源项目Next Chat4 —— 之原生Js前端特效给你的眼睛来一场视觉盛宴吧

前期回顾 打造极简风格动效 —— 5 分钟轻松实现惊艳、震撼人心的视觉效果_彩色之外的博客-CSDN博客css Loading 实战教学https://blog.csdn.net/m0_57904695/article/details/131156011?spm1001.2014.3001.5501 &#x1f44d; 本文专栏&#xff1a;开发技巧 一键使用 GP…

OpenCV中的图像处理3.11(10) OpenCV中的图像变换

目录 3.11 OpenCV中的图像变换3.11.1 傅里叶变换目标理论Numpy中的傅里叶变换OpenCV中的傅立叶变换DFT的性能优化为什么Laplacian是一个高通滤波器&#xff1f;其他资源 翻译及二次校对&#xff1a;cvtutorials.com 编辑者&#xff1a;廿瓶鲸&#xff08;和鲸社区Siby团队成员&…

Linux中的用户和组的分类

目录 Linux中的用户和组的分类 用户分类 超级用户 系统用户 普通用户 组的分类 基本组&#xff08;私有组&#xff09; 附加组&#xff08;公有组&#xff09; 系统组 Linux中用户和用户组的配置文件 在Linux中&#xff0c;用户账号、密码、用户组信息和用户组密码均…

KEGG注释:KEGG富集可视化柱状图

很久很久以前&#xff0c;看到过文章中的KEGG富集可视化结果图。是对KEGG通路进行注释的。后来在一些测序公司的宣传页上也见到过类似的图&#xff1a; image.png image.png 其实这个图就是多了一个KEGG通路注释&#xff0c;近期也有小伙伴寻求怎么做。网上很多在线工具可以完…

Windows/Linux搭建Stable Diffusion WebUI

什么是Stable Diffusion WebUI&#xff1f;能用来干嘛&#xff1f; Stable Diffusion WebUI&#xff08;以下简称SD&#xff09;是一个基于Gradio库的Stable Diffusion的浏览器界面&#xff0c;可以方便地配置和生成AI绘画作品&#xff0c;并且进行各种精细地配置。Stable Dif…

今天面试招了个23K的人,从腾讯出来的果然都有两把刷子···

公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;前面一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在15-25k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是4年工作经验&#xff0c;但面试中&#xff0c;不…

微信小程序实现一个文字展开收起功能

1.0 需求背景 需求很常见&#xff0c;就是当一行文字过多时&#xff0c;显示省略号&#xff0c;然后显示展开两个字&#xff0c;点击&#xff0c;文字完全展示开&#xff0c;点击收起&#xff0c;回到省略形式&#xff0c;如下图 2.0 需求分析 有了上图&#xff0c;应该能更好…

总结排查服务器上传下载慢的几种手段与查看服务器带宽的具体方法

一、排查服务器上传下载 最近出现的一个情况&#xff0c;服务器上传和下载比较慢&#xff0c;因此我排查了种种手段&#xff0c;特此记录下几种常见的手段。 1、使用speedtest-cli 测试网速&#xff1a; 该方法是测试网速的速度怎么样&#xff0c;看看是否真的慢&#xff1f; …

软考A计划-2023系统架构师-知识点集锦(4/4)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Spring Security--自动登录

也就是remember me 在配置链上加一个 然后发送请求时加上:remember-me字段 value值可以为&#xff0c;ture&#xff0c;1&#xff0c;on 我们记住登录后&#xff0c;关掉浏览器再打开&#xff0c;访问一下接口&#xff0c;可以访问&#xff0c;说明记住登录成功了。 因为有的…