部署rabbitMQ镜像集群

版本信息

  1. rabbit MQ: 3.8.5
  2. Erlang: 官方建议最低21.3 推荐22.x
  3. 这里用的是23

环境准备

主机规划

主机 节点
172.16.14.3 磁盘节点
172.16.14.4 内存节点
172.16.14.5 磁盘节点
  1. 内存节点:
  2. 内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。例外情况是:持久的 queue 的内容将被保存到磁盘。
  3. 磁盘节点:
  4. 将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息。
  5. 注意点:
  6. 1、内存节点由于不进行磁盘读写,它的性能比磁盘节点高。
  7. 2、集群中可以存在多个磁盘节点,磁盘节点越多整个集群可用性越好,但是集群整体性能不会线性增加,需要权衡考虑。
  8. 3RabbitMQ 要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。
  9. 4、设置两个磁盘节点,至少有一个是可用的,可以保存元数据的更改。

下载离线包

官网安装手册(https://www.rabbitmq.com/install-generic-unix.html)

  1. rabbit MQ:二进制版
  2. wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.5/rabbitmq-server-generic-unix-3.8.5.tar.xz
  3. Erlang: 无依赖版 -- 该软件包剥离了一些Erlang模块和依赖项,这些对运行RabbitMQ而言不是必需的。
  4. wget https://github.com/rabbitmq/erlang-rpm/releases/download/v22.2.8/erlang-22.2.8-1.el7.x86_64.rpm

安装离线包

  1. # 安装erlang
  2. yum install -y yum install erlang-22.2.8-1.el7.x86_64.rpm
  3. # 解压rabbitmq
  4. xz -d rabbitmq-server-generic-unix-3.8.5.tar.xz
  5. tar -xvf rabbitmq-server-generic-unix-3.8.5.tar -C /opt

hosts文件

  1. 172.16.14.3 MQ1
  2. 172.16.14.4 MQ2
  3. 172.16.14.5 MQ3

配置文件

我们要自己在$Home/etc/rabbitmq中创建rabbitmq-env.conf, 详细信息请参阅 官方配置说明

  1. # 创建持久化目录
  2. mkdir -p /data/rabbitmq/store
  3. mkdir -p /data/rabbitmq/logs
  4. # 创建配置文件
  5. vim /opt/rabbitmq_server-3.8.5/etc/rabbitmq/rabbitmq-env.conf
  6. # 指定节点的名字,默认rabbit@${hostname}
  7. NODENAME=rabbit@MQ1
  8. # 指定端口,默认5672
  9. NODE_PORT=5672
  10. # 配置持久目录
  11. MNESIA_BASE=/ahdata/rabbitmq/store
  12. # 配置日志目录 默认文件名字:${NODENAME}.log 可以用配置修改
  13. LOG_BASE=/ahdata/rabbitmq/logs

启用服务

常用命令

  1. sbin/rabbitmq-server # 启动server
  2. sbin/rabbitmq-server -detached # 后台启动server
  3. sbin/rabbitmqctl status # 查看节点状态
  4. sbin/rabbitmqctl shutdown # 停止运行的节点
  5. sbin/rabbitmqctl stop_app # 停止mq服务
  6. sbin/rabbitmqctl start_app # 启动mq服务
  7. sbin/rabbitmqctl cluster_status # 查看集群状态
  8. sbin/rabbitmqctl set_cluster_name rabbit@MQ1 # 修改集群名称
  9. sbin/rabbitmqctl join_cluster <cluster_name> # 加入集群
  10. sbin/rabbitmqctl change_cluster_node_type --node <node_name> [ disk | ram ] # 修改节点类型

启动rabbit

  1. cd /opt/rabbitmq_server-3.8.5/
  2. sbin/rabbitmq-server -detached # 在后台启动应用
  3. sbin/rabbitmqctl status # 查看节点状态

erlang.cookie

Erlang 节点间通过认证 Erlang cookie 的方式允许互相通信。因为 rabbitmqctl 使用 Erlang OTP 通信机制来和 Rabbit 节点通信,运行 rabbitmqctl 的机器和所要连接的 Rabbit 节点必须使用相同的 Erlang cookie 。否则你会得到一个错误。

  1. cat /root/.erlang.cookie
  2. IJPCAHDPWVYSDERZDUPG # 保持cookie一致
  3. scp /root/.erlang.cookie n218:/root/.erlang.cookie # 拷贝过去之后需要重启一下mq服务
  4. sbin/rabbitmqctl shutdown # 停止运行的节点
  5. sbin/rabbitmq-server -detached # 在后台启动应用
  6. scp /root/.erlang.cookie n219:/root/.erlang.cookie # 拷贝过去之后需要重启一下mq服务
  7. sbin/rabbitmqctl shutdown # 停止运行的节点
  8. sbin/rabbitmq-server -detached # 在后台启动应用

现在三台机器上具有相同的 Erlang cookie 了。下面开始组建集群。

集群

基础概念

RabbitMQ 集群分为两种:

  • 普通集群
  • 镜像集群(普通集群的升级)

普通集群:

  1. 以两个节点(rabbit01rabbit02)为例来进行说明。
  2. rabbit01rabbit02两个节点仅有相同的元数据,即队列的结构,但消息实体只存在于其中一个节点rabbit01(或者rabbit02)中。
  3. 当消息进入rabbit01节点的Queue后,consumerrabbit02节点消费时,RabbitMQ会临时在rabbit01rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer
  4. 所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumerrabbit01rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。
  5. 如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。

镜像集群:

  1. 在普通集群的基础上,把需要的队列做成镜像队列,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取,也就是说多少节点消息就会备份多少份。
  2. 该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。
  3. 所以在对可靠性要求较高的场合中适用。由于镜像队列之间消息自动同步,且内部有选举master机制,即使master节点宕机也不会影响整个集群的使用,达到去中心化的目的,从而有效的防止消息丢失及服务不可用等问题。

普通集群

集群名

将集群名修改为rabbit@MQ1

  1. # 修改集群名
  2. sbin/rabbitmqctl set_cluster_name rabbit@MQ1
  3. Setting cluster name to rabbit@MQ1 ...
  4. # 查看集群状态
  5. sbin/rabbitmqctl cluster_status
  6. Cluster status of node
  7. rabbit@MQ1 ...
  8. Basics Cluster name:
  9. rabbit@MQ1
  10. Disk Nodes
  11. rabbit@MQ1
  12. Running Nodes
  13. rabbit@MQ1

加入集群

在218、219节点上执行

  1. sbin/rabbitmqctl stop_app
  2. sbin/rabbitmqctl join_cluster rabbit@MQ1
  3. sbin/rabbitmqctl start_app

修改节点类型

查看集群状态

  1. sbin/rabbitmqctl cluster_status
  2. Cluster status of node
  3. rabbit@MQ1 ...
  4. Basics Cluster name:
  5. rabbit@MQ1
  6. Disk Nodes # 磁盘节点现在3个都是
  7. rabbit@MQ1 # 我们看到所有的节点都是disk类型与我们预设的架构不符
  8. rabbit@MQ2 # 我们需要修改一下这个架构
  9. rabbit@MQ3
  10. Running Nodes
  11. rabbit@MQ1
  12. rabbit@MQ2
  13. rabbit@MQ3

更改218节点为内存节点

  1. # 停止节点
  2. sbin/rabbitmqctl stop_app
  3. # 与集群通讯,从集群中删除节点
  4. sbin/rabbitmqctl reset
  5. # 以RAM模式重新加入集群
  6. sbin/rabbitmqctl join_cluster rabbit@MQ1 --ram
  7. # 启动节点
  8. sbin/rabbitmqctl start_app
  9. sbin/rabbitmqctl cluster_status
  10. Cluster status of node rabbit@MQ1 ...
  11. Basics Cluster name:
  12. rabbit@MQ1
  13. Disk Nodes
  14. rabbit@MQ1
  15. rabbit@MQ3
  16. RAM Nodes
  17. rabbit@MQ2
  18. Running Nodes
  19. rabbit@MQ1
  20. rabbit@MQ2
  21. rabbit@MQ3

节点单机状态时,reset 命令将清空节点的状态,并将其恢复到空白状态。当节点是集群的一部分时,该命令也会和集群中的磁盘节点通信,告诉他们该节点正在离开集群。

这很重要,不然,集群会认为该节点出了故障,并期望其最终能够恢复回来,在该节点回来之前,集群禁止新的节点加入。

镜像集群(HA)

上面我们已经成功部署了一个普通集群,普通集群并不是高可用的,下面基于普通集群升级为镜像集群 官方HA方案

  1. sbin/rabbitmqctl set_policy <name> [-p <vhost>] <pattern> <definition> [--apply-to <apply-to>]
  2. name: 策略名称
  3. vhost: 指定vhost, 默认值 /
  4. pattern: 通过正则表达式匹配哪些需要镜像, ^为所有
  5. definition:
  6. ha-mode: 指明镜像队列的模式,有效值为 all/exactly/nodes
  7. all 表示在集群所有的节点上进行镜像,无需设置ha-params
  8. exactly 表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
  9. nodes 表示在指定的节点上进行镜像,节点名称通过ha-params指定
  10. ha-params:
  11. ha-mode 模式需要用到的参数
  12. ha-sync-mode: 镜像队列中消息的同步方式,有效值为automaticmanually
  13. apply-to: 策略作用对象。可选值3个,默认all
  14. exchanges 表示镜像 exchange (并不知道意义所在)
  15. queues 表示镜像 queue all
  16. 表示镜像 exchangequeue
  17. # 示例命令
  18. sbin/rabbitmqctl set_policy admin "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
ha-mode ha-params 功能
all 镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份。
exactly count 镜像队列将会在集群上复制 count 份。如果集群数量少于 count 时候,队列会复制到所有节点上。如果大于 Count 集群,有一个节点 crash 后,新进入节点也不会做新的镜像。
nodes node name 镜像队列会在 node name 中复制。如果这个名称不是集群中的一个,这不会触发错误。如果在这个 node list 中没有一个节点在线,那么这个 queue 会被声明在 client 连接的节点。

WEB管理

启用WEB管理插件

  1. # 启动web管理插件
  2. sbin/rabbitmq-plugins enable rabbitmq_management
  3. # 增加用户
  4. sbin/rabbitmqctl add_user admin admin
  5. # 配置用户权限
  6. sbin/rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
  7. 示例:我们赋予 admin 在“/”下面的全部资源的配置和读写权限。注意”/”代表 virtual host 为“/”这个“/”和 Linux 里的根目录是有区别的并不是 virtual host 为“/”可以访问所以的 virtual host,把这个“/”理解成字符串就行。
  8. # 设置用户角色
  9. sbin/rabbitmqctl set_user_tags admin administrator

访问管理界面

打开浏览器访问 http://nodeip:15672, 使用上面创建的用户登录即可

  1. ss -tnlp | grep 5672 LISTEN 0 128 *:25672 *:* users:(("beam.smp",pid=3593,fd=77)) LISTEN 0 128 *:15672 *:* users:(("beam.smp",pid=3593,fd=93)) LISTEN 0 128 :::5672 :::* users:(("beam.smp",pid=3593,fd=92))

负载均衡

我们这里用haproxy做负载均衡 ,haproxy 启动配置省略,这个地方负责内外的负载均衡,如需外网启动,需要做转发既可。

增加VIP

  1. ip addr add 192.168.100.242/24 dev eth0:mq
  2. ip a
  3. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  4. link/ether 5a:fd:bf:c3:43:ec brd ff:ff:ff:ff:ff:ff
  5. inet 192.168.100.217/24 brd 192.168.100.255 scope global noprefixroute eth0
  6. valid_lft forever preferred_lft forever
  7. inet 192.168.100.242/24 scope global secondary eth0
  8. valid_lft forever preferred_lft forever

配置文件

  1. vim /opt/rabbitmq_server-3.8.5/etc/haproxy.cnf
  2. global
  3. log 127.0.0.1 local0 info
  4. log 127.0.0.1 local1 notice
  5. daemon
  6. maxconn 4096
  7. defaults
  8. log global
  9. mode tcp
  10. option tcplog
  11. option dontlognull
  12. retries 3
  13. option abortonclose
  14. maxconn 4096
  15. timeout connect 5000ms
  16. timeout client 3000ms
  17. timeout server 3000ms
  18. balance roundrobin
  19. listen private_monitoring
  20. bind 192.168.100.242:8100
  21. mode http
  22. option httplog
  23. stats refresh 5s
  24. stats uri /stats
  25. stats realm Haproxy
  26. stats auth admin:admin
  27. listen rabbitmq_cluster
  28. bind 192.168.100.242:8101
  29. mode tcp
  30. option tcplog
  31. balance roundrobin
  32. server MQ1 192.168.100.217:5672 check inter 5000 rise 2 fall 3
  33. server MQ2 192.168.100.218:5672 check inter 5000 rise 2 fall 3
  34. server MQ3 192.168.100.219:5672 check inter 5000 rise 2 fall 3
  35. listen rabbitmq_admin
  36. bind 192.168.100.242:8102
  37. server MQ1 192.168.100.217:15672
  38. server MQ2 192.168.100.218:15672
  39. server MQ3 192.168.100.219:15672

启动haproxy

  1. haproxy -f /opt/rabbitmq_server-3.8.5/etc/haproxy.cnf

参考链接:

参考链接:

1、官方二进制手册

2、官方集群手册

3、https://www.jianshu.com/p/97fbf9c82872

4、https://my.oschina.net/genghz/blog/1840262

5、https://www.jianshu.com/p/d55fcee12918

6、https://www.jianshu.com/p/7cf2ad01c422

7、https://blog.csdn.net/yujin2010good/article/details/73614507

8、http://www.haproxy.org/

9、https://blog.csdn.net/winy_lm/article/details/81128181

10、https://www.cnblogs.com/knowledgesea/p/6535766.html

部署rabbitMQ镜像集群实战测试的更多相关文章

  1. RabbitMQ镜像集群搭建

    RabbitMQ 官网 https://www.rabbitmq.com/ 小编使用的系统环境是CentOS7.4 系统 IP hostname CentOS7.4 1.1.1.1 hostname0 ...

  2. Centos7的rabbitmq镜像集群

    1.下载RabbitMQ vim /etc/hosts10.10.21.197 rabbit110.10.21.198 rabbit2 #分别命名hostname rabbit1hostname ra ...

  3. rabbitMq镜像集群

    rabbitMq延迟投递的方案 1 把消息记录到数据路,通过定时器进行刷新 2 TTL 加上死信队列 :通过路由把过期的消息同步到死信队列,通过死信队列的消费者进行消费 3

  4. RabbitMQ之集群搭建

    1.RabbitMQ集群模式RabbitMQ集群中节点包括内存节点(RAM).磁盘节点(Disk,消息持久化),集群中至少有一个Disk节点. 2.普通模式(默认)        对于普通模式,集群中 ...

  5. Centos 7 RabbitMQ + Haproxy 集群高可用部署

    一.   功能和原理介绍 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionSc ...

  6. 基于Ambari Server部署HDP集群实战案例

    基于Ambari Server部署HDP集群实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.部署Ambari Server端 博主推荐阅读: https://www.c ...

  7. RabbitMQ入门教程(十五):普通集群和镜像集群

    原文:RabbitMQ入门教程(十五):普通集群和镜像集群 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.c ...

  8. docker-compose安装rabbitmq集群(主从集群---》镜像集群)

    docker-compose安装rabbitmq集群(主从集群--->镜像集群) yls 2020/5/11 创建docker-compose.yml 文件 version: '3' servi ...

  9. 用Docker搭建RabbitMq的普通集群和镜像集群

    普通集群:多个节点组成的普通集群,消息随机发送到其中一个节点的队列上,其他节点仅保留元数据,各个节点仅有相同的元数据,即队列结构.消费者消费消息时,会从各个节点拉取消息,如果保存消息的节点故障,则无法 ...

随机推荐

  1. Spring ( 四 )Spring的AOP动态代理、切面编程

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.AOP切面编程 1.什么是AOP AOP是面向切面编程.全称:Aspect Oriented Pro ...

  2. Java实现 LeetCode 54 螺旋矩阵

    54. 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], ...

  3. Java实现无向图的欧拉回路判断问题

    1 问题描述 Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试 ...

  4. 【asp.net core 系列】8 实战之 利用 EF Core 完成数据操作层的实现

    0. 前言 通过前两篇,我们创建了一个项目,并规定了一个基本的数据层访问接口.这一篇,我们将以EF Core为例演示一下数据层访问接口如何实现,以及实现中需要注意的地方. 1. 添加EF Core 先 ...

  5. MacOS配置.bash_profile,重启终端后配置失效和MacOS .zshrc does not exist问题

    MacOS配置.bash_profile,重启终端后配置失效和MacOS .zshrc does not exist问题 场景 ​ 在Mac中配置golang环境变量更改GOPATH路径,在~/.ba ...

  6. Numpy中数据的常用的保存与读取

    保存到文本文件numpy.savetxt()numpy.loadtxt() import numpy as np x= np.arange(0,10,0.1) np.savetxt('save_x', ...

  7. SpringCloud Alibaba (一):序言

    为什么要转用SpringCloud Alibaba? Spring Cloud Netflix项目进入维护模式 在2018年底时,Netflix宣布Hystrix进入维护模式.自2016年以来,Rib ...

  8. IDEA优化内存配置,可提高启动和运行速度

    找到IDEA安装的bin目录 打开idea.exe.vmoptions 文件 关键的三个参数的说明 1. -Xms 是最小启动内存参数 2. -Xmx 是最大运行内存参数 3.-XX:Reserved ...

  9. jenkins初始化启动报错导致进入web页面如法安装插件

    报错如下图所示: 解决方法: #1 查看网卡设置是否正确 #2 确定是否设置域名服务器 #3 查看路由表是否正常 #4 确保可用dns解析 #5 ping一下常见的公网地址

  10. 041.Kubernetes集群网络-K8S网络策略

    一 Kubernetes网络策略 1.1 策略说明 为实现细粒度的容器间网络访问隔离策略,Kubernetes发布Network Policy,目前已升级为networking.k8s.io/v1稳定 ...