rabbitmq集群部署及配置

文章目录

  • rabbitmq集群部署及配置
  • 前言
  • 一、原理介绍
  • 二、部署方案
    • 1.环境介绍
    • 2.部署过程
  • 小结

前言

消息中间件rabbitmq,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息异步。本篇将以rabbitmq+HA方式进行部署。

一、原理介绍

rabbitmq是依据erlang的分布式特性(RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证)来实现的,所以部署rabbitmq分布式集群时要先安装erlang,并把其中一个服务的cookie复制到另外的节点。

rabbitmq集群中,各个rabbitmq为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般的,均应建立为磁盘节点,为了防止机器重启后的消息消失;

RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。消息队列通过rabbitmq HA镜像队列进行消息队列实体复制。

普通模式下,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。

镜像模式下,将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。

二、部署方案

本方案中是在多台机器之间部署rabbitmq的cluster,要求如下:这几个节点需要再同一个局域网内;这几个节点需要有相同的erlang cookie,否则不能正常通信,为了实现cookie内容一致,采用scp的方式进行。

1.环境介绍

主机名 IP
rabbit1 192.168.116.128
rabbit2 192.168.116.129
rabbit3 192.168.116.130

2.部署过程

(1)分别在3台机器上配置/etc/hosts,如下

192.168.116.128 rabbit1
192.168.116.129 rabbit2
192.168.116.130 rabbit3

(2)分别在3台机器上安装erLang和rabbitmq

安装erLang

安装依赖包

yum install -y *epel* gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel

编译安装

mkdir /app/erlang21.3
wget http://erlang.org/download/otp_src_21.3.tar.gz
tar xzf otp_src_21.3.tar.gz
cd otp_src_21.3
./configure --prefix=/app/erlang21.3 --without-javac
make && make install

出现erl命令则说明安装成功;

安装rabbitmq

编译安装

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.8/rabbitmq-server-generic-unix-3.8.8.tar.xz
yum -y install xz
tar xvf rabbitmq-server-generic-unix-3.8.8.tar.xz
mkdir /app/rabbitmq
mv rabbitmq_server-3.8.8 /app/rabbitmq
添加环境
vim /etc/profile
export PATH=$PATH:/app/erlang21.3/bin:/app/rabbitmq/rabbitmq_server-3.8.8/sbin
source /etc/profile

导入rabbitmq的管理界面

rabbitmq-plugins enable rabbitmq_management

设置erlang

找到erlang cookie文件的位置,官方在介绍集群的文档中提到过.erlang.cookie一般会存在这两个地址:第一个是home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在{home}目录下,也就是$home/.erlang.cookie。如果我们使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下。

这里将 node1 的该文件复制到 node2、node3,注意这个文件的权限是 400(默认即是400),因此采用scp的方式只拷贝内容即可;

可以通过cat $home/.erlang.cookie来查看三台机器的cookie是否一致,设置erlang的目的是要保证集群内的cookie内容一致。

使用-detached参数运行各节点

rabbitmqctl stop
rabbitmq-server -detached

然后可以通过rabbitmqctl cluster_status查看节点状态。PS:要先拷贝cookie到另外两台机器上,保证三台机器上的cookie是一致的,然后再启动服务。
由于guest这个用户,只能在本地访问,所以我们要新增一个用户并赋予权限:

添加用户并设置密码:

rabbitmqctl add_user  admin 123456

添加权限(使admin用户对虚拟主机“/” 具有所有权限):

rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

修改用户角色(加入administrator用户组)

rabbitmqctl set_user_tags admin administrator

然后就可以远程访问了,然后可直接配置用户权限等信息。到此,就可以通过http://ip:15672 使用admin 123456 进行登陆了。

到这里的话,每个节点是作为单独的一台RabbitMQ存在的,也可以正常提供服务了

(3)组成集群

rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。

将 rabbit2、rabbit3与 rabbit1 组成集群,这里以rabbit2为例

rabbit2# rabbitmqctl stop_app
rabbit2# rabbitmqctl join_cluster rabbit@rabbit1             ####这里集群的名字一定不要写错了
rabbit2# rabbitmqctl start_app

将rabbit3重复上述操作,也加入rabbit1的集群。

则此时 rabbit2 与 rabbit3 也会自动建立连接,集群配置完毕;(PS:如果要使用内存节点,则可以使用rabbit2 # rabbitmqctl join_cluster --ram rabbit@rabbit1加入集群)集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。

PS:另外一种查看集群是否成功的方式,在web页面上查看

(4)设置镜像队列策略

在任意一个节点上执行如下操作(这里在node1上执行)

首先,在web界面,登陆后,点击“Admin–Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机,同时给用户“admin”和“guest”均加上权限(在页面直接设置、点点点即可);

然后,在linux中执行如下命令

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

则此时镜像队列设置成功。

PS:这里补充一些对于设置镜像队列策略的说明

rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: queue的匹配模式(正则表达式)
Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-modeha-mode:指明镜像队列的模式,有效值为 all/exactly/nodesall:表示在集群中所有的节点上进行镜像exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定ha-params:ha-mode模式需要用到的参数ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
priority:可选参数,policy的优先级

将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。完成这 6 个步骤后,RabbitMQ 高可用集群就已经搭建好了。

小结

过程有些繁琐,但细心总会让你看见光明!

rabbitmq集群部署及配置相关推荐

  1. RabbitMQ 集群部署及配置

    文章目录 一.rabbitmq简述 Rabbitmq 有 3 种模式,但集群模式是 2 种 二.环境准备及软件安装 修改 hosts 文件 (3 台) 三.账号配置 四.启动 rabbitmq 内置 ...

  2. Linux中级实战专题篇:rabbitmq(消息中间件p2p模式和pub模式,消息队列rabbitmq详解,单机安装,集群部署以及配置实战)

    一.消息中间件相关概念 1.简介 消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台相关 的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息 队列模型,可以在分布 ...

  3. RabbitMQ集群部署指南

    文章目录 1.单机部署 1.1.下载镜像 1.2.安装MQ 2.安装DelayExchange插件 2.1.下载插件 2.2.上传插件 2.3.安装插件 3.集群部署 2.1.集群分类 2.2.获取c ...

  4. RabbitMQ集群部署

    一般来说,RabbitMQ部署分布式集群架构有如下三种: 1.Cluster 2.Federation 3.Shovel 其中最常用的就是cluster模式(集群),它可以动态增加节点或减少,但只支持 ...

  5. RabbitMQ集群部署教程(Linux)

    一.简介 Messaging that just works - RabbitMQ是一个开源的遵循AMQP协议实现的基于Erlang语言编写,支持多种客户端(语言),用于在分布式系统中存储消息,转发消 ...

  6. rabbitmq集群安装与配置(故障恢复)

    0.首先按照http://www.cnblogs.com/zhjh256/p/5922562.html在至少两个节点安装好(不建议单机,没什么意义) 1.先了解rabbitmq集群架构,http:// ...

  7. Springboot整合Quartz集群部署以及配置Druid数据源

    参考链接: https://blog.csdn.net/wangmx1993328/article/details/105441308 https://blog.csdn.net/qq_3966905 ...

  8. storm集群部署和配置过程详解

    ---恢复内容开始--- 先整体介绍一下搭建storm集群的步骤: 设置zookeeper集群 安装依赖到所有nimbus和worker节点 下载并解压storm发布版本到所有nimbus和worke ...

  9. 【联邦学习】FATE 集群部署 step2

    [联邦学习]FATE 集群部署step1 [联邦学习]FATE 集群部署step3 配置虚拟机网络 配置虚拟机镜像 all 指的是2个虚拟机都要操作 f1 只的是1号虚拟机 f2 指的是2号虚拟机 配 ...

最新文章

  1. php中的$_GET全局变量,通过URL传递参数
  2. subversion commit 报错A checksum mismatch occurred
  3. php swoole环境搭建,windows系统php环境安装swoole具体步骤
  4. JavaScript学习总结(七)——JavaScript函数(function)
  5. 创建一个简单的WCF程序
  6. python判断序列符号变化的次数
  7. DevOps冲击下的软件测试
  8. opencv图像分析与处理(9)- 选择性滤波
  9. Qt组态软件设计文章导航
  10. 一位瑞典程序员的创业感悟
  11. Kubeadm初始化Kubernetes集群
  12. 用计算机作品装扮校园,童心向党艺绽放 幸福成长梦起航——惠安县八二三实验小学第七届校园文化艺术节之十五“手绘童心 泼洒阳光”计算机作品制作比赛...
  13. “细雨湿衣看不见,闲花落地听无声”---超强作文
  14. Save More Mice (贪心 二分)
  15. 圆满落幕!回顾 eBPF 技术的发展与挑战
  16. 程序员是吃青春饭的?
  17. 猪哥学习群直播第一期:人工智能在银行电信企业中的应用
  18. 腾讯音乐娱乐集团与华纳音乐续签长期战略协议 并将联合成立全新音乐厂牌
  19. 水利闸门液压泵站比例阀控制器
  20. ibm tivoli_IBM Tivoli Directory Server 6.0的SSL配置

热门文章

  1. qt 运动控制软件 界面_开源库分享----一款跨平台图形界面的百度网盘不限速客户端...
  2. java,如何处理大批量数据插入
  3. Unity SenseAR教程:人脸检测之放置脸部挂饰【含源码】
  4. 使用ASP.NET Core和Angular 8的服务器端分页
  5. 2019开发者调查:Python 或成赢家,Java 最不赚钱?
  6. android system webview diable,FV悬浮球橡皮泥主题
  7. clear linux安装教程,Clear Linux OS特性介绍,附下载地址
  8. sklearn保存svm分类模型_机器学习100天-Day1601线性支持向量机分类
  9. ssm框架数据查询一直为null
  10. redistemplate hash 过期时间_redisTemplate的使用以及和stringRedisTemplate的区别