美文网首页
RabbitMQ 集群安装

RabbitMQ 集群安装

作者: 46f31ed46b17 | 来源:发表于2018-03-13 20:13 被阅读102次

环境说明

  • 系统环境
hostname              IP地址         操作系统            
tk226-nw-f05-dx1-08   10.2.210.176   Oracle Linux 7.4 - 64位 
tk226-nw-f05-dx1-09   10.2.210.177   Oracle Linux 7.4 - 64位 
tk226-nw-f05-dx1-10   10.2.210.178   Oracle Linux 7.4 - 64位 

下载安装包

推荐一个 Linux包下载网站,很多依赖包都可以在这个网站找到
https://pkgs.org/

https://pkgs.org

一, 安装Erlang

RabbitMQ 使用 Erlang 语言编写,所以在安装 RabbitMQ 需要先安装Erlang,这跟 java 程序需要安装 jdk 应该是一个道理的.

Erlang的安装有很多种,这里为了方便,我选择的是 zero dependency Erlang RPM package for running RabbitMQ (0 依赖 RPM 包)。

[root@tk226-nw-f05-dx1-08 ~]#rpm -ivh erlang-20.2.3-1.el7.centos.x86_64.rpm

二, 安装RabbitMQ

  • 安装RabbitMQ,由于系统缺少socat包,所以需要先安装依赖
[root@tk226-nw-f05-dx1-08 ~]# rpm -ivh socat-1.7.3.2-1.1.el7.x86_64.rpm
[root@tk226-nw-f05-dx1-08 ~]# rpm -ivh rabbitmq-server-3.7.4-1.el7.noarch.rpm
  • 进入/sbin目录,运行./rabbitmq-server -detached启动服务。
[root@tk226-nw-f05-dx1-08 ~]#./rabbitmq-server -detached  #这是后台服务运行
  • 运行./rabbitmqctl status检查状态
[root@tk226-nw-f05-dx1-08 ~]# ./rabbitmqctl status  #监测服务状态
  • 启动Web管理界面
[root@tk226-nw-f05-dx1-08 ~]# rabbitmq-plugins enable rabbitmq_management #启动web

输入http://ip地址:端口号(默认:15672)
默认可是可以再本地登陆,使用guest用户,密码也是guest. http://localhost:15672
注意:guest用户不能远程登陆。

  • 增加用户(默认guest只允许本地访问)
[root@tk226-nw-f05-dx1-08 ~]#rabbitmqctl add_user admin admin 
[root@tk226-nw-f05-dx1-08 ~]#rabbitmqctl set_user_tags admin administrator #设置用户分组
[root@tk226-nw-f05-dx1-08 ~]#rabbitmqctl set_permissions -p "/" admin "." "." ".*" #设置默认vhost(“/”)访问权限

访问10.2.210.176:15672

RabbitMQ WebUI

三,RabbitMQ Cluster 配置

  • 局域网配置
    分别在三个节点的/etc/hosts下设置相同的配置信息
10.2.210.176 tk226-nw-f05-dx1-08
10.2.210.177 tk226-nw-f05-dx1-09
10.2.210.178 tk226-nw-f05-dx1-10
  • 同步Erlang Cookie
    采用从主节点copy的方式保持Cookie的一致性
[root@tk226-nw-f05-dx1-08 ~]# scp /var/lib/rabbitmq/.erlang.cookie 10.2.210.177:/var/lib/rabbitmq
[root@tk226-nw-f05-dx1-08 ~]# scp /var/lib/rabbitmq/.erlang.cookie 10.2.210.178:/var/lib/rabbitmq
  • 使用 -detached运行各节点
rabbitmqctl stop
rabbitmq-server -detached 
  • 查看各节点的状态
[root@tk226-nw-f05-dx1-08 ~]# rabbitmqctl cluster_status
[root@tk226-nw-f05-dx1-09 ~]# rabbitmqctl cluster_status
[root@tk226-nw-f05-dx1-10 ~]# rabbitmqctl cluster_status
  • 创建并部署集群
[root@tk226-nw-f05-dx1-09 ~]# rabbitmqctl stop_app 
[root@tk226-nw-f05-dx1-09 ~]# rabbitmqctl join_cluster rabbit@tk226-nw-f05-dx1-08
[root@tk226-nw-f05-dx1-09 ~]# rabbitmqctl start_app
[root@tk226-nw-f05-dx1-10 ~]# rabbitmqctl stop_app
[root@tk226-nw-f05-dx1-10 ~]# rabbitmqctl join_cluster rabbit@tk226-nw-f05-dx1-08
[root@tk226-nw-f05-dx1-10 ~]# rabbitmqctl start_app
  • 查看集群状态
[root@tk226-nw-f05-dx1-08 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@tk226-nw-f05-dx1-08 ...
[{nodes,[{disc,['rabbit@tk226-nw-f05-dx1-08','rabbit@tk226-nw-f05-dx1-09',
                'rabbit@tk226-nw-f05-dx1-10']}]},
 {running_nodes,['rabbit@tk226-nw-f05-dx1-10','rabbit@tk226-nw-f05-dx1-09',
                 'rabbit@tk226-nw-f05-dx1-08']},
 {cluster_name,<<"rabbit@tk226-nw-f05-dx1-08">>},
 {partitions,[]},
 {alarms,[{'rabbit@tk226-nw-f05-dx1-10',[]},
          {'rabbit@tk226-nw-f05-dx1-09',[]},
          {'rabbit@tk226-nw-f05-dx1-08',[]}]}]
集群状态
  • 总结
  1. cookie在所有节点上必须完全一样,同步时一定要注意。
  2. erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。
  3. 如果queue是非持久化queue,则如果创建queue的那个节点失败,发送方和接收方可以创建同样的queue继续运作。但如果是持久化queue,则只能等创建queue的那个节点恢复后才能继续服务。
  4. 在集群元数据有变动的时候需要有disk node在线,但是在节点加入或退出的时候所有的disk node必须全部在线。如果没有正确退出disk node,集群会认为这个节点当掉了,在这个节点恢复之前不要加入其它节点。

四,RabbitMQ HA

1.镜像模式概念

在服务负载不是很大的情况下,一般我们只需要一个节点便能为我们提供服务,可这难免会发生单点故障,要解决这个问题,我们便需要配置集群和镜像。

队列模式

做一下简单的比较,为直观起见,流程简化为单链接,中间为RabbitMQ节点,上方为publisher,下方为consumer。

  • 单一模式:最简单的情况,非集群模式。

    没什么好说的。

  • 普通模式:默认的集群模式。

    对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。

    当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。

    所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。

    该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。

    如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,然后就没有然后了……

  • 镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案

    该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。

    该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。

    所以在对可靠性要求较高的场合中适用。

2.配置镜像队列

  • 方法1 :使用命令行来设置
set_policy [-p vhostpath] [--priority priority] [--apply-to apply-to] {name} {pattern} {definition}

./rabbitmqctl set_policy -p '/' --priority 9 --apply-to all ha-all "^.*" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

说明

|   ha-mode           |    ha-params
-------------------------------------------------------------
|  -p '/'             |    设置vhost信息。
-------------------------------------------------------------
| --priority 10       |    设置优先级。高数字会优先处理。
-------------------------------------------------------------
| --apply-to queue    |    作用对象。queue、exchanges,all
-------------------------------------------------------------
| name                |    规则名称
-------------------------------------------------------------
  • 方法2 :web管理页面设置

web配置镜像复制比较简单也比较直观

镜像配置 配置完成后

3. 如何检查队列镜像是否成功

创建 test 队列,在WebUI中可以看到该队列使用了哪些policies,镜像的份数,点击队列还可以查看详细信息。

test队列 Detail

到此,RabbitMQ的安装,集群及镜像就全部完了。

相关文章

网友评论

      本文标题:RabbitMQ 集群安装

      本文链接:https://www.haomeiwen.com/subject/ycyzfftx.html