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

news2024/10/5 21:24:59

一、环境

  • 云服务器
  • 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://www.coloradmin.cn/o/642546.html

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

相关文章

RabbitMq消息堆积问题及惰性队列

消息堆积问题 当生产者发送消息的速度超过了消费者处理的速度,就会导致队列的消息堆积,知道队列存储消息达到上限。最早接受的消息,可能就会成为死信,会被丢弃,这就是消息堆积问题。 解决消费对接问题 1.增加更多的消…

Hive执行计划之只有map阶段SQL性能分析和解读

文章目录 概述1.不带函数操作的select-from-where型简单SQL1.1执行示例1.2 运行逻辑分析1.3 伪代码解释 2.带普通函数和运行操作符的普通型SQL执行计划解读2.1 执行计划解读2.2 伪代码解释逻辑 概述 可能所有的SQLboy刚接触SQL语句的时候都是select xxx from xxx where xxx。在…

如何分析问题、找到性能瓶颈、掌握性能调优?一文讲懂性能测试

背景 当下云计算、大数据盛行的背景下,大并发和大吞吐量的需求已经是摆在企业面前的问题了,其中网络的性能要求尤为关键,除了软件本身需要考虑到性能方面的要求,一些硬件上面的优化也是必不可少的。 作为一名测试工作者&#xf…

Ubuntu18.04 离线安装gcc,g++,make依赖包

1. 离线安装背景 因为项目现场的服务器无法连接互联网,只有内网环境,但是需要安装redis和nginx,所以需要安装gcc,g,make等依赖包。 2. 如何获取依赖包 需要准备一台可以连接互联网的电脑(如:个人电脑上的虚拟机安装一…

Java网络开发(Asynchronous异步)—— 从 Jsp 到 Ajax 的 axios 到 vue 同步请求 到 异步请求

目录 引出如果想做bilibili边看视频边评论怎么搞?Ajax是啥?& axios的语法1. Ajax(Asynchronous JavaScript And XML)简介2. axios语法 及其与 java后端交互(1)get请求(2)post请求…

海外社媒营销揭秘:品牌出海的关键策略与注意事项

在全球化的背景下,品牌出海已成为众多企业拓展市场的必然选择。而海外社媒营销作为一种有效的推广手段,不仅能够帮助品牌建立海外影响力,还可以增强品牌知名度、提高销售额。然而,要在海外社媒平台上实施成功的营销策略&#xff0…

网络安全零基础都能看的SQL注入

1.1 .Sql 注入攻击原理 SQL 注入漏洞可以说是在企业运营中会遇到的最具破坏性的漏洞之一,它也是目前被利用得最多的漏洞。要学会如何防御 SQL 注入,首先我们要学习它的原理。 针对 SQL 注入的攻击行为可描述为通过在用户可控参数中注入 SQL 语法&#x…

高压脉冲电源和高压放大器应用领域的区别

在之前的科普中我们讲解了高压脉冲电源和高压放大器的定义及二者区别,其实除此之外,它们在应用上也是有不同倾向性的,那么今天让安泰测试Agitek为大家分享高压脉冲电源和高压放大器应用领域究竟有什么不同? 高压脉冲电源的应用领…

躺不平摆不烂的测试员如何自救?

随着测试从业年龄的增加,毕业的概率大增,而机会骤减,从而使测试员陷入躺不平、摆不烂的状态。 相较于开发员,测试员是没有资格躺平的,毕竟测试员没可能从短短几年黄金时间,从工作中积累到足以躺平的财富&a…

wordpress去除分类URL的categpory

前言 在日常使用Wordpress搭建网站时,发现文章或者分类页的URL地址中默认带有Category,URL层级过长会影响我们网站SEO的优化,也不利于用户体验。这里讲一下如何去除URL中categpory的方法。 操作 第一步先登录到WordPress后台,然…

前端样式网站(前端css框架)

1. Bootstrap:Bootstrap The most popular HTML, CSS, and JS library in the world.Bootstrap 是最流行的 CSS 框架,提供了丰富的前端样式和组件,非常适合开发响应式网站和应用程序。 2. Bulma:Bulma: Free, open source, and modern CSS framework based on FlexboxBulma 是…

nodejs 版本切换(windows版)

一、按健winR弹出窗口,键盘输入cmd,然后敲回车。然后进入命令控制行窗口,并输入where node查看之前本地安装的node的路径。 二、找到上面找到的路径,将node.exe所在的父目录里面的所有东西都删除。 三、从官网下载安装包 https://github.com/…

一文看懂!shell编程-【提取IP地址、文件归档、发送消息】

【引言】 您是否曾经遇到过需要提取大量IP地址、归档文件、发送消息等烦琐的工作? 如果是,那么您一定不能错过这篇文章! 在本文中,我们将探讨Shell编程的各种技巧和方法,帮助您轻松完成这些任务。无需任何编程基础&…

这些常用的IC专业术语,你了解多少?

IC工程师在日常的学习和工作中或多或少会都遇到一些专业的IC词汇。下面就来为大家盘点一下各个岗位的专业高频名词。(文档内持续更新,全文档文末可领) 数字功能验证高频名词 CIN (Carry INput):进位输入 COUT(Carry OUTput)&…

关于数据库分库分表的一点想法

1 开篇 面对数据的激增,相信大家也都有分库分表的一些方案,这次的这个分享,算是自己的一个想法,可以当做一个参考方案,也欢迎相互讨论。 话不多说,直接进入主题。 日常开发中,实现数据库的分库…

系统稳定性与高可用保障

一、前言 高并发、高可用、高性能被称为互联网三高架构,这三者都是工程师和架构师在系统架构设计中必须考虑的因素之一。今天我们就来聊一聊三 H 中的高可用,也是我们常说的系统稳定性。 > 本篇文章只聊思路,没有太多的深入细节。阅读全…

“海底长城”合龙!揭秘深中海底隧道中的无损检测技术

作为工业大国,近年来国家在各类“大国工程”中投入巨大,同时也获得了喜人的成果,从长江三峡水利枢纽造福全国人民,到天问落火、空间站核心舱在轨开工,天舟二号货运飞船稳靠太空港,神舟十二号载人飞船成功发…

博睿数据应邀出席第五届双态IT北京用户大会,分享《如何帮助用户构建高级可观测性》

6月10日,第五届双态IT北京用户大会在北京召开,来自IT行业的各位专家齐聚一堂,分享行业理念、发展趋势、运维方法以及最佳实践。 博睿数据应邀出席大会,作《如何帮助用户构建高级可观测性》主题演讲,从云原生带来的挑战…

vue-cli3搭建项目实现移动端自适应----- flexible和 postcss-px2rem

1、安装 flexible和 postcss-px2rem npm i lib-flexible postcss-px2rem --save 2.在项目入口文件main.js 中引入lib-flexible import lib-flexible 3. 把目录 public/index.html 中的这个标签注释!由于flexible会动态给页面header中添加标签 4.配置postcss-px2r…

不一样的ECS U实例

不一样的ECS U实例 ECS U实例U实例入门开通U实例服务远程连接U实例重置密码远程连接 安装Mysql安装Mysql并启动Mysql数据库操作本地远程连接Mysql 安装Nginx安装Nginx启动Nginx 安装JDK安装Tomcat 体验感受操作上适用场景上体验建议 参与ECSU实例评测,申请免费体验机…