环境准备

Centos 7.5虚拟机三台:

  • 192.168.102.128
  • 192.168.102.130
  • 192.168.102.131

以上虚拟机统一安装docker环境

三台机器分别配置如下所示的hosts文件,以供rabbitmq容器使用

$ vim /home/rabbitmq/hosts # 文件中写入以下内容
192.168.102.128 rabbit1 rabbit1
192.168.102.130 rabbit2 rabbit2
192.168.102.131 rabbit3 rabbit3

搭建过程

拉取镜像

在三台机器上,分别management版本的rabbitmq镜像

$ docker pull rabbitmq:management

创建容器

在三台机器上分别创建rabbitmq容器

  • 在192.168.102.128上创建容器rabbit1
$ docker run --restart=unless-stopped -h rabbit1 -d -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 4369:4369 \
--name myrabbit1 \
-v /home/rabbitmq:/var/lib/rabbitmq:z \
-v /home/rabbitmq/hosts:/etc/hosts \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=123456 \
-e RABBITMQ_ERLANG_COOKIE='xxx_2019' \
rabbitmq:management
  • 在192.168.102.130上创建容器rabbit2
$ docker run --restart=unless-stopped -h rabbit2 -d -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 4369:4369 \
--name myrabbit2 \
-v /home/rabbitmq:/var/lib/rabbitmq:z \
-v /home/rabbitmq/hosts:/etc/hosts \
-e RABBITMQ_ERLANG_COOKIE='xxx_2019' \
rabbitmq:management
  • 在192.168.102.131上创建容器rabbit3
$ docker run --restart=unless-stopped -h rabbit3 -d -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 4369:4369 \
--name myrabbit3 \
-v /home/rabbitmq:/var/lib/rabbitmq:z \
-v /home/rabbitmq/hosts:/etc/hosts \
-e RABBITMQ_ERLANG_COOKIE='xxx_2019' \
rabbitmq:management

参数说明:

  • -d 表示容器后台运行
  • -h rabbit1 容器的主机名是rabbit1,容器内部的hostname
  • -v /home/rabbitmq:/var/lib/rabbitmq:z 将宿主机目录/home/rabbitmq挂载到容器的/var/lib/rabbitmq目录。z是一个标记,在selinux环境下使用
  • -e RABBITMQERLANGCOOKIE='rabbit_cluster' 设置rabbitmq的cookie,该值可以任意设置,只需要三个容器保持一致即可

绑定集群

  • 重置myrabbit1节点
$ docker exec -it myrabbit1 /bin/bash
$ rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl start_app
  • 加入myrabbit2节点到集群中
$ docker exec -it myrabbit2 /bin/bash
$ rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster rabbit@rabbit1 && rabbitmqctl start_app
  • 加入myrabbit3节点到集群中
$ docker exec -it myrabbit3 /bin/bash
$ rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster rabbit@rabbit1 && rabbitmqctl start_app

查询集群状态

$ rabbitmqctl cluster_status

故障节点的处理

$ docker exec -it rabbit2 /bin/bash
$ rabbitmqctl stop_app

在一个正常的节点上移除一个异常的节点

$ docker exec -it rabbit1 /bin/bash
$ rabbitmqctl forget_cluster_node rabbit@rabbit2

集群模式

普通模式

基本特征

  • 交换机和队列的元数据存在于所有的节点上
  • 队列中的完整数据只存在于创建该队列的节点上
  • 其他节点只保存队列的元数据信息以及指向当前队列的owner node的指针

数据消费

进行数据消费时随机连接到一个节点,当队列不是当前节点创建的时候,需要有一个从创建队列的实例拉取队列数据的开销。此外由于需要固定从单实例获取数据,因此会出现单实例的瓶颈。

优点

可以由多个节点消费单个队列的数据,提高了吞吐量

缺点

  • 节点实例需要拉取数据,因此集群内部存在大量的数据传输
  • 可用性保障低,一旦创建队列的节点宕机,只有等到该节点恢复其他节点才能继续消费消息

示意图

镜像模式

基本特征

  • 创建的queue,不论是元数据还是完整数据都会在每一个节点上保存一份
  • 向queue中写消息时,都会自动同步到每一个节点上

优点

  • 保障了集群的高可用
  • 配置方便,只需要在后台配置相应的策略,就可以将指定数据同步到指定的节点或者全部节点

缺点

  • 性能开销较大,网络带宽压力和消耗很严重
  • 无法线性扩展,例如单个queue的数据量很大,每台机器都要存储同样大量的数据

示意图

策略配置

全部节点镜像策略创建

指定节点数镜像策略创建

参数说明:

  • Pattern 模式:""为全部;"all-"为所有all-开头
  • Priority 优先级:建议10,比较耗费资源
  • Definition 定义参数:
ha-mode=all 或 exactly;ha-sync-mode=automatic;ha-params=2(ha-mode=exactly);

总结

综上所述,对于可靠性要求比较高的场合,推荐使用镜像模式。

RabbitMQ镜像集群部署

1、策略policy概念

使用RabbitMQ镜像功能,需要基于RabbitMQ策略来实现,策略policy是用来控制和修改群集范围的某个vhost队列行为和Exchange行为。策略policy就是要设置哪些Exchange或者queue的数据需要复制、同步,以及如何复制同步。

为了使队列成为镜像队列,需要创建一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不同的值,下表说明这些key的选项。

2、添加策略

登录rabbitmq管理页面 ——> Admin ——> Policies ——> Add / update a policy

name:随便取,策略名称

Pattern:^ 匹配符,只有一个^代表匹配所有

Definition:ha-mode=all 为匹配类型,分为3种模式:all(表示所有的queue)

或者使用命令:

#rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

3、查看效果

此策略会同步所在同一VHost中的交换器和队列数据。设置好policy之后,使用 http://ip:15672 再次进行访问,可以看到队列镜像同步。

Docker安装集群rabbitMQ的更多相关文章

  1. docker 安装集群管理工具 docker-compose

    compose将管理的容器分为3层, 工程, 服务, 容器. 一个工程中可包含多个服务, 每个服务中定义容器运行的镜像参数, 依赖, 一个服务中科包含多个容器实力, 并没有解决负载均衡的问题 dock ...

  2. Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例

    目录 [TOC] 1.环境准备 ​ 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...

  3. docker swarm 集群及可视化界面的安装及配置

    docker swarm 集群及可视化界面的安装及配置 2016-12-14 16:08:46 标签:swarm consul registrator 原创作品,允许转载,转载时请务必以超链接形式标明 ...

  4. [转载] Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例

    1.环境准备 ​ 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0.33 c4 -&g ...

  5. 通过docker-machine和etcd部署docker swarm集群

    本片文章介绍一下 使用docker-machine 搭建docker swarm 集群:docker swarm是docker 官方搭建的容器集群编排工具:容器编排,就是可以使你像使用一太机器一样来使 ...

  6. 从零开始搭建Docker Swarm集群

    从零开始搭建Docker Swarm集群 检查节点Docker配置 1. 打开Docker配置文件(示例是centos 7)vim /etc/sysconfig/docker2. 添加-H tcp:/ ...

  7. docker + swarm 集群

    docker + swarm 集群 导读 Swarm是Docker公司在2014年12月初新发布的容器管理工具.和Swarm一起发布的Docker管理工具还有Machine以及Compose.Swar ...

  8. Docker Swarm集群

    Docker Swarm集群 IP 10.6.17.11  管理节点 IP 10.6.17.12   节点A IP 10.6.17.13   节点B IP 10.6.17.14   节点C 安装 Sw ...

  9. Docker Swarm——集群管理

    前言 之前在总结docker machine的时候,当时对docker理解还不够深入,甚至还不知道 docker machine 与 docker swarm 的区别. 在查阅资料以及官方文档之后,今 ...

随机推荐

  1. 06 app分享功能

    通过某一个点击事件触发confirm弹窗 确定后正式进行分享功能处理 这是一个封装好的分享功能插件 https://ext.dcloud.net.cn/plugin?id=4860 如果自己写的话会很 ...

  2. 算法竞赛进阶指南 0x50 总论

    目录 AcWing895. 最长上升子序列 方法一 方法二 当询问最长子序列是哪些的时候 896. 最长上升子序列 II 思路 O(NlogN)做法:贪心+二分 代码 AcWing\897. 最长公共 ...

  3. AtCoder Beginner Contest 261E // 按位思考 + dp

    题目链接:E - Many Operations (atcoder.jp) 题意: 给定一个数x,以及n个操作(ti,ai): 当 t = 1 时,将 x & a 当 t = 2 时,将 x ...

  4. pinia 入门及使用

    自上月从上海结束工作回来 在家闲来无事 想写点东西打发时间 也顺便学习学习新的技术.偶然发现了 pinia 据说比vuex好用些 所以便搭了个demo尝试着用了下 感觉确实不错,于是便有了这篇随笔. ...

  5. powershell和cmd对比

    前言 计算机啊这东西,本质上是硬件和软件的综合体.如果只有硬件没有软件的话,这也是台辣鸡而已.而计算机软件中最靠近硬件的一层,就是操作系统层. 操作系统有很多种,比如Unix/Linux/Mac OS ...

  6. Java面试题(三)--虚拟机

    1 内存结构 1.简述一下JVM的内存结构?(高频) JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建销毁时间.如下图所示,可以分为两大部分,线程私有区和共 ...

  7. centos 安装ftp服务BUG

    安装完成之后匿名可登录,但是先创建的用户名和密码无法登录,最后排查原因是/etc/pam.d/vsftpd 文件注释掉第四行 auth required pam_shells.so

  8. 刷题记录:Codeforces Round #724 (Div. 2)

    Codeforces Round #724 (Div. 2) 20210713.网址:https://codeforces.com/contest/1536. div2明显比div3难多了啊-只做了前 ...

  9. Java源码分析 | CharSequence

    本文基于 OracleJDK 11, HotSpot 虚拟机. CharSequence 定义 CharSequence 是 java.lang 包下的一个接口,是 char 值的可读序列, 即其本身 ...

  10. 「雅礼集训 2017 Day2」线段游戏(线段树懒标记“启发式下传”,李超树)

    题面 题解 加入一条线段,可以把它转化为在[L,R]区间内加一条线 y=ax+b (如果原线段与y轴平行,就相当于在{x1}处加一条线 y=max(y1,y2)) 我们可以把它加到线段树上,线段树上每 ...