RabbitMQ 群集部署

RabbitMQ  简介

         MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等。

RabbitMQ  使用场景

         在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

         RabbitMQ 支持消息的持久化,也就是数据写在磁盘上。为了数据安全考虑,大多数企业都会选择持久化。当然如果觉得不需要消息持久化,那么使用内存节点即可。

RabbitMQ 的结构图如图所示:

3

实现步骤

        设计架构模式:在一个群集里,有三台服务器,其中一台使用磁盘模式,另两台使用内存模式。两台内存模式的节点无疑速度更快,因此通过客户端连接访问它们。但是客户端不可能分别连接两个内存节点,肯定是通过前端反向代理去轮询分发请求。如果担心前端反向代理服务器故障,可以通过 Keepalived 软件做一个高可用架构。而磁盘模式的节点,由于磁盘 IO 相对较慢,因此仅作为数据备份使用。

         注意这里讲三台服务器都连接上互联网并安装软件包。另外 RabbitMQ 集群节点必须在同一个网段。

RabbitMQ  群集具体配置信息如表所示。

IP 地址   主机名 操作系统  防火墙和SELinux 用途
192.168.66.140   mq01  Centos 7 (64 位)  关闭  磁盘节点
192.168.66.143 mq02  Centos 7 (64 位)  关闭  内存节点
192.168.66.144 mq03 Centos 7 (64 位)  关闭  内存节点


2.安装 epel 源和 rabbitmq-server 软件[root@localhost ~]# vim /etc/hostname                       //更改主机名,另外两台分别为 mq02 ,mq03

mq01.localdomain

[root@localhost ~]# vim /etc/hosts                                //更改 hosts 文件

192.168.66.140 mq01
192.168.66.143 mq02
129.168.66.144 mq03

[root@mq01 ~]# yum install epel-release –y

[root@mq01 ~]# yum install rabbitmq-server –y

3.分别查看插件安装情况

[root@mq01 ~]# rabbitmq-plugins  list
[ ] amqp_client                       3.3.5
[ ] cowboy                            0.5.0-rmq3.3.5-git4b93c2d
[ ] eldap                             3.3.5-gite309de4
[ ] mochiweb                          2.7.0-rmq3.3.5-git680dba8
[ ] rabbitmq_amqp1_0                  3.3.5
[ ] rabbitmq_auth_backend_ldap        3.3.5
[ ] rabbitmq_auth_mechanism_ssl       3.3.5
[ ] rabbitmq_consistent_hash_exchange 3.3.5
[ ] rabbitmq_federation               3.3.5
[ ] rabbitmq_federation_management    3.3.5
[ ] rabbitmq_management               3.3.5
[ ] rabbitmq_management_agent         3.3.5
[ ] rabbitmq_management_visualiser    3.3.5
[ ] rabbitmq_mqtt                     3.3.5
[ ] rabbitmq_shovel                   3.3.5
[ ] rabbitmq_shovel_management        3.3.5
[ ] rabbitmq_stomp                    3.3.5
[ ] rabbitmq_test                     3.3.5
[ ] rabbitmq_tracing                  3.3.5
[ ] rabbitmq_web_dispatch             3.3.5
[ ] rabbitmq_web_stomp                3.3.5
[ ] rabbitmq_web_stomp_examples       3.3.5
[ ] sockjs                            0.3.4-rmq3.3.5-git3132eb9
[ ] webmachine                        1.10.3-rmq3.3.5-gite9359c7

4分别在三个节点添加管理服务,然后启动 rabbitmq 服务

[root@mq01 ~]# rabbitmq-plugins enable rabbitmq_management               //启动管理服务
The following plugins have been enabled:
   mochiweb
   webmachine
   rabbitmq_web_dispatch
   amqp_client
   rabbitmq_management_agent
   rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.


[root@mq01 ~]# systemctl start rabbitmq-server.service                             //启动rabbitmq 服务

查看端口5672

[root@mq01 ~]# netstat -natp | grep 5672
tcp        0      0 0.0.0.0:15672           0.0.0.0:*               LISTEN      2282/beam          
tcp        0      0 0.0.0.0:25672           0.0.0.0:*               LISTEN      2282/beam          
tcp6       0      0 :::5672                 :::*                    LISTEN      2282/be

其中 15672 和 25672 都是 rabbitmq 的管理端口,5672 则是和生产者、消费者通信窗口。

5.在 rabbitmq 服务启动后,此时分别查看群级状态。

[root@mq01 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq01 ...
[{nodes,[{disc,[rabbit@mq01]}]},
  {running_nodes,[rabbit@mq01]},
  {cluster_name,<<"rabbit@mq01">>},
  {partitions,[]}]
...done.

[root@mq02 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq02 ...
[{nodes,[{disc,[rabbit@mq02]}]},
  {running_nodes,[rabbit@mq02]},
  {cluster_name,<<"rabbit@mq02">>},
  {partitions,[]}]
...done.

[root@mq03 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq03 ...
[{nodes,[{disc,[rabbit@mq03]}]},
  {running_nodes,[rabbit@mq03]},
  {cluster_name,<<"rabbit@mq03">>},
  {partitions,[]}]
...done.

检查三台的群集状态,目前相互独立,还未成为群集状态

6.   Rabbitmq 的群集是依赖于 Erlang 的群集来工作的,所以必须先构建起 Eelang 的集群环境。在集群中,个节点是通过一个 magic cookie 来实现的,这个 cookie 存放在 /var/lib/.erlang.cookie 中,文件是 400 权限。所以必须保证各节点 cookie 保持一致。否则节点之间就无法通信。

        将其中一台节点上的 .erlang.cookie 值复制下来保持到其他节点上,需要注意文件的权限为 400 。属主属组 为 rabbitmq。现在三个节点的 rabbitmq 服务都是开启的,但是每个节点的 .erlang.cookie 文件中的值都一样,因此我们需要将三台节点的 rabbitmq 服务停止

[root@mq01 ~]# systemctl stop rabbitmq-server.service             //先关闭rabbitmq 服务(三台都关闭)

分别查看三台节点的 .relang.cookie 中的值

[root@mq01 rabbitmq]# cd /var/lib/rabbitmq/
[root@mq01 rabbitmq]# ls -a
.  ..  .erlang.cookie mnesia
[root@mq01 rabbitmq]# cat .erlang.cookie
ZXSCNEWFINFMZFEEVJOY[root@mq01 rabbitmq]#

[root@mq02 ~]# cd /var/lib/rabbitmq/                                   
[root@mq02 rabbitmq]# ls -a
.  ..  .erlang.cookie  mnesia                                                                              // .erlang.cookie 是隐藏文件,三台节点的值都不一样
[root@mq02 rabbitmq]# cat .erlang.cookie
ICPOPREABNCPJSIIKBJZ[root@mq02 rabbitmq]#

[root@mq03 ~]# cd /var/lib/rabbitmq/
[root@mq03 rabbitmq]# ls -a
.  ..  .erlang.cookie  mnesia
[root@mq03 rabbitmq]# cat .erlang.cookie
NRFLUNPJNNEGAHHFPFXY[root@mq03 rabbitmq]#

将 mq01 上的 .erlang.cookie 的值复制保存到其他两台节点上。(mq01 作为磁盘节点,mq02 和mq03 作为内存节点)

[root@mq02 rabbitmq]# vim .erlang.cookie

ZXSCNEWFINFMZFEEVJOY

[root@mq03 rabbitmq]# vim .erlang.cookie

ZXSCNEWFINFMZFEEVJOY

启动 rabbitmq 服务(三台都起)

[root@mq01 rabbitmq]# systemctl start rabbitmq-server.service  

7. 将 mq02 和 mq03 作为内存节点与 mq01 磁盘节点连接起来,在mq02  和 mq03 执行以下命令

[root@mq02 rabbitmq]# systemctl start rabbitmq-server.service                           //启动 rabbitmq 服务
[root@mq02 rabbitmq]# rabbitmqctl stop_app                                                           //先停掉 rabbitmq 应用
Stopping node rabbit@mq02 ...
...done.
[root@mq02 rabbitmq]# rabbitmqctl join_cluster --ram rabbit@mq01                     // 加入到磁盘节点 
Clustering node rabbit@mq02 with rabbit@mq01 ...
...done.
[root@mq02 rabbitmq]# rabbitmqctl start_app                                                  //启动 rabbirmq 应用         
Starting node rabbit@mq02 ...
...done.
[root@mq02 rabbitmq]# rabbitmqctl cluster_status                                          //查看群集状态
Cluster status of node rabbit@mq02 ...
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq03,rabbit@mq02]}]},              //mq 01为磁盘节点 ,mq02 和 mq03 为内存节点
  {running_nodes,[rabbit@mq03,rabbit@mq01,rabbit@mq02]},
  {cluster_name,<<"rabbit@mq01">>},
  {partitions,[]}]
...done.

mq03 同样操作 

[root@mq03 rabbitmq]# systemctl start rabbitmq-server.service
[root@mq03 rabbitmq]# rabbitmqctl stop_app
Stopping node rabbit@mq03 ...
...done.
[root@mq03 rabbitmq]# rabbitmqctl join_cluster --ram rabbit@mq01
Clustering node rabbit@mq03 with rabbit@mq01 ...
...done.
[root@mq03 rabbitmq]# rabbitmqctl start_app
Starting node rabbit@mq03 ...
...done.
[root@mq03 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq03 ...
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq03,rabbit@mq02]}]},
  {running_nodes,[rabbit@mq02,rabbit@mq01,rabbit@mq03]},
  {cluster_name,<<"rabbit@mq01">>},
  {partitions,[]}]
...done.

上面已经完成了配置 rabbirmq 默认群集模式。

8. 打开浏览器输入 http://192.168.66.140.55672, 它会自动将55672 端口改为 15672 端口,也可将端口直接写为 15672

1

2

猜你喜欢

转载自blog.51cto.com/13706703/2307635