RabbitMQ 简介前端
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通讯方法。应用程序经过读写出入队列的消息(针对应用程序的数据)来通讯,而无需专用链接来连接它们。消息传递指的是程序之间经过在消息中发送数据进行通讯,而不是经过直接调用彼此来通讯,直接调用一般是用于诸如远程过程调用的技术。排队指的是应用程序经过 队列来通讯。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等。node
RabbitMQ 使用场景git
在项目中,将一些无需即时返回且耗时的操做提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提升了系统的吞吐量。web
RabbitMQ 支持消息的持久化,也就是数据写在磁盘上。为了数据安全考虑,大多数企业都会选择持久化。固然若是以为不须要消息持久化,那么使用内存节点便可。vim
RabbitMQ 的结构图如图所示:浏览器
实现步骤安全
设计架构模式:在一个群集里,有三台服务器,其中一台使用磁盘模式,另两台使用内存模式。两台内存模式的节点无疑速度更快,所以经过客户端链接访问它们。可是客户端不可能分别链接两个内存节点,确定是经过前端反向代理去轮询分发请求。若是担忧前端反向代理服务器故障,能够经过 Keepalived 软件作一个高可用架构。而磁盘模式的节点,因为磁盘 IO 相对较慢,所以仅做为数据备份使用。服务器
注意这里讲三台服务器都链接上互联网并安装软件包。另外 RabbitMQ 集群节点必须在同一个网段。cookie
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