MQ(Message Queue消息队列)是一种应用程序对应用程序的通讯方法。应用程序经过读写出入队列的消息(针对应用程序的数据)来通讯,而无需专用连接来链接他们。消息传递指的是程序之间经过在消息中发送数据进行通讯,而不是经过直接调用彼此来通讯,直接调用一般是用于诸如远程过程调用的技术。排队指的是应用程序经过队列来通讯。队列的使用除去接收和发送应用程序同时执行的要求。node
RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者没法快速消费,那么须要一个中间层。保存这个数据。git
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。web
RabbitMQ使用Erlang开发的,集群很是方便,由于Erlang天生就是一门分布式语言,但其自己并不支持负载均衡。RabbitMQ模式大概分为三种:vim
IP地址 | 主机名 | 操做系统 | 用途 |
---|---|---|---|
192.168.58.141 | rabbitmq01 | CentOS7 | 磁盘节点 |
192.168.58.132 | rabbitmq02 | CentOS7 | 内存节点 |
192.168.58.130 | rabbitmq03 | CentOS7 | 内存节点 |
首先咱们须要配置三个节点的hosts文件,将下面内容分别加入到三台服务器上。浏览器
[root@rabbitmq01 /]# vim /etc/hosts 192.168.58.141 rabbitmq01 192.168.58.132 rabbitmq02 192,168.58.130 rabbitmq03
而后须要修改三个节点的主机名,修改每一个节点的/etc/hostname文件安全
[root@rabbitmq01 /]# vim /etc/hostname rabbitmq01
[root@rabbitmq02 /]# vim /etc/hostname rabbitmq02
[root@rabbitmq03 /]# vim /etc/hostname rabbitmq03
而后将三个节点重启,当启动之后要关闭防火墙和加强性安全功能。服务器
[root@rabbitmq01 /]# systemctl stop firewalld.service [root@rabbitmq01 /]# setenforce 0 [root@rabbitmq01 /]# yum install -y epel-release #安装epel源 [root@rabbitmq01 /]# yum install -y rabbitmq-server #安装rabbitmq软件包 [root@rabbitmq01 /]# ln -s /usr/lib/rabbitmq/bin/* /usr/bin #创建软连接,方便直接使用命令 [root@rabbitmq01 /]# rabbitmq-plugins list #查看插件安装状况 [e] amqp_client 3.3.5 [ ] cowboy 0.5.0-rmq3.3.5-git4b93c2d [ ] eldap 3.3.5-gite309de4 [e] 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 [E] rabbitmq_management 3.3.5 [e] 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 [e] 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 [e] webmachine 1.10.3-rmq3.3.5-gite9359c7 [root@rabbitmq01 /]# rabbitmq-plugins enable rabbitmq_management #启用rabbitmq_management服务 [root@rabbitmq01 /]# systemctl start rabbitmq-server.service #启动mq服务 [root@rabbitmq01 /]# netstat -ntap | grep 5672 tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 3878/beam tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 3878/beam tcp6 0 0 :::5672 :::* LISTEN 3878/beam
有上面三个端口开启说明正常。15672和55672都是rabbitmq的管理端口,5672是生产者、消费者通讯的端口。cookie
[root@rabbitmq01 /]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq01 ... [{nodes,[{disc,[rabbit@rabbitmq01]}]}, {running_nodes,[rabbit@rabbitmq01]}, {cluster_name,<<"rabbit@rabbitmq01">>}, {partitions,[]}] ...done. #检查三台的集群状态,目前相互独立,没有造成集群。 [root@rabbitmq01 /]# vim /var/lib/rabbitmq/.erlang.cookie #三台节点服务器的这个文件中的编码须要配置成同样的,复制内容到其余两台 PKBPLZGDCESRUHHDCOJV
而后将rabbitmq0二、rabbitmq03做为内存节点与rabbitmq01磁盘节点链接起来,在rabbitmq02和rabbit03上执行下面的命令:负载均衡
[root@rabbitmq02 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq01 Clustering node rabbit@rabbitmq02 with rabbit@rabbitmq01 ... ...done. [root@rabbitmq03 yum.repos.d]# rabbitmqctl join_cluster --ram rabbit@rabbitmq01 Clustering node rabbit@rabbitmq03 with rabbit@rabbitmq01 ... ...done.
在rabbitmq01节点上查看集群状态:tcp
[root@rabbitmq01 /]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq01 ... [{nodes,[{disc,[rabbit@rabbitmq01]}, {ram,[rabbit@rabbitmq03,rabbit@rabbitmq02]}]}, {running_nodes,[rabbit@rabbitmq01]}, {cluster_name,<<"rabbit@rabbitmq01">>}, {partitions,[]}] ...done. #能够看到集群中的成员
打开浏览器输入http://192.168.58.141:15672,能够看到访问页面,帐号密码都是guest,进入到里面就能看到图形化的界面。