RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统。它是由Erlang语言开发。java
AMQP:Advanced Message Queue,高级消息队列协议。他是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。node
RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。具体特色包括:<!--more-->linux
- 可靠性(Reliability):RabbitMQ使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
- 灵活的路由(Flexible Routing):在消息进入队列以前,经过 Exchange 来路由消息的。
- 消息集群(Clustering):多个 RabbitMQ 服务器能够组成一个集群,造成一个逻辑 Broker 。
- 高可用(Highly Available Queues):队列能够在集群中的机器上进行镜像,使得在部分节点出问题的状况下队列仍然可用。
- 多种协议(Multi-protocol):RabbitMQ支持多种消息队列协议,好比STOMP、MQTT等。
- 多语言客户端(Many Clients):RabbitMQ 几乎支持全部经常使用语言,好比 Java、.NET、Ruby 等。
- 管理界面(Management UI):RabbitMQ 提供了一个易用的用户界面,使得用户能够监控和管理消息 Broker 的许多方面。
- 跟踪机制(Tracing):若是消息异常,RabbitMQ 提供了消息跟踪机制,使用者能够找出发生了什么。
- 插件机制(Plugin System):RabbitMQ 提供了许多插件,来从多方面进行扩展,也能够编写本身的插件。
项目结构图:(直接引用百度百科的)git
概念说明:vim
消息队列的使用过程:浏览器
exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。安全
exchange也有几个类型,彻底根据key进行投递的叫作Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。对key进行模式匹配后进行投递的叫作Topic交换机,符号”#”匹配一个或多个词,符号””匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.”只匹配”abc.def”。还有一种不须要key的,叫作Fanout交换机,它采起广播模式,一个消息进来时,投递到与该交换机绑定的全部队列。bash
RabbitMQ支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我想大多数用户都会选择持久化。消息队列持久化包括3个部分:服务器
若是exchange和queue都是持久化的,那么它们之间的binding也是持久化的。若是exchange和queue二者之间有一个持久化,一个非持久化,就不容许创建绑定。cookie
前面说到RabbitMQ是由Erlang语言开发,因此须要先安装Erlang环境
wget http://erlang.org/download/otp_src_20.1.tar.gz
#解压 tar -zvxf otp_src_20.1.tar.gz #配置安装路径编译代码 cd otp_src_20.1/ ./configure --prefix=/opt/erlang --without-javac make && make install
以下安装完成
cd /opt/erlang bin/erl
安装成功
vim /etc/profile #添加下面的配置 #set erlang environment export PATH=$PATH:/opt/erlang/bin #使配置文件生效 source /etc/profile
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.12/rabbitmq-server-generic-unix-3.6.12.tar.xz
xz -d rabbitmq-server-generic-unix-3.6.12.tar.xz tar -vxf rabbitmq-server-generic-unix-3.6.12.tar -C /opt/ cd /opt/ mv rabbitmq-server-3.6.12/ rabbitmq
vim /etc/profile #添加如下配置 #set rabbitmq environment export PATH=$PATH:/opt/rabbitmq/sbin #使得文件生效 source /etc/profile
rabbitmq-server -detached
./sbin/rabbitmqctl status #显示一下信息,说明已经启动 Status of node rabbit@localhost [{pid,1452}, {running_applications, [{rabbit,"RabbitMQ","3.6.12"}, {ranch,"Socket acceptor pool for TCP protocols.","1.3.0"}, {ssl,"Erlang/OTP SSL application","8.2.1"}, {public_key,"Public key infrastructure","1.5"}, {asn1,"The Erlang ASN1 compiler version 5.0.3","5.0.3"}, {crypto,"CRYPTO","4.1"}, {mnesia,"MNESIA CXC 138 12","4.15.1"}, {os_mon,"CPO CXC 138 46","2.4.3"}, {rabbit_common, "Modules shared by rabbitmq-server and rabbitmq-erlang-client", "3.6.12"}, {compiler,"ERTS CXC 138 10","7.1.2"}, {xmerl,"XML parser","1.3.15"}, {syntax_tools,"Syntax tools","2.1.3"}, {sasl,"SASL CXC 138 11","3.1"}, {stdlib,"ERTS CXC 138 10","3.4.2"}, {kernel,"ERTS CXC 138 10","5.4"}]}, {os,{unix,linux}}, {erlang_version, "Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:64] [kernel-poll:true]\n"}, {memory, [{connection_readers,0}, {connection_writers,0}, {connection_channels,0}, {connection_other,0}, {queue_procs,2744}, {queue_slave_procs,0}, {plugins,0}, {other_proc,19513536}, {metrics,184272}, {mgmt_db,0}, {mnesia,61136}, {other_ets,1523640}, {binary,211896}, {msg_index,43568}, {code,21408137}, {atom,891849}, {other_system,17779446}, {total,61620224}]}, {alarms,[]}, {listeners,[{clustering,25672,"::"},{amqp,5672,"::"}]}, {vm_memory_calculation_strategy,rss}, {vm_memory_high_watermark,0.4}, {vm_memory_limit,771637248}, {disk_free_limit,50000000}, {disk_free,36134227968}, {file_descriptors, [{total_limit,924},{total_used,2},{sockets_limit,829},{sockets_used,0}]}, {processes,[{limit,1048576},{used,153}]}, {run_queue,0}, {uptime,21}, {kernel,{net_ticktime,60}}]
rabbitmqctl stop
RabbitMQ网页管理的端口是15672,可是如今还不能访问,须要添加网页插件才能访问
rabbitmq-plugins enable rabbitmq_management
在浏览器中输入ip:15672
在网上看到有人说默认的帐号密码是guest,可是该帐号只能经过localhost登陆。因此须要配置一个用户并设置权限。
rabbitmqctl add_user [username] [password]
rabbitmqctl set_permissions -p "/" [username] ".*" ".*" ".*"
rabbitmqctl set_user_tags [username] administrator
下面就可使用刚添加的用户登陆了。能够在该页面进行RabbitMQ的管理,包括用户的设置。
error: No curses library functions found configure
须要先安装ncurses-devel
yum install ncurses-devel
odbc : ODBC library - link check failed
相似这样的错误,咱们只须要关注APPLICATIONS DISABLED部分的提示信息,如这里就是缺乏odbc,使用命令安装便可
yum install unixODBC unixODBC-devel
RabbitMQ启动以后,默认的名称是Rabbit,监听的端口是5672,若是想在同一台机器上启动多个节点,那么其余的节点就会由于节点名称和端口与默认的冲突而致使启动失败,能够经过设置环境变量来实现,具体方法以下:
rabbitmq-plugins disable rabbitmq_management
rabbitmqctl stop //先中止运行节点,再进行集群部署 #启动第一个节点 RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached #启动第二个节点 RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit_1 rabbitmq-server -detached
#中止rabbit_1节点的应用 rabbitmqctl -n rabbit_1@localhost stop_app #将rabbit_1添加到集群节点rabbit中去 rabbitmqctl -n rabbit_1@localhost join_cluster rabbit@localhost #查看集群节点状态 rabbitmqctl cluster_status #启动rabbit_1节点应用 rabbitmqctl -n rabbit_1@localhost start_app #查看rabbit_1节点的状态 rabbitmqctl -n rabbit_1 status
以下集群配置完毕
不一样于单机多节点的状况,在多机环境,若是要在cluster集群内部署多个节点,须要注意两个方面:
环境介绍
RabbitMQ节点 | IP地址 | 工做模式 | 操做系统 |
---|---|---|---|
rabbitmqCluster | 186.16.195.24 | DISK | CentOS 7.0 - 64位 |
rabbitmqCluster01 | 186.16.195.25 | DISK | CentOS 7.0 - 64位 |
rabbitmqCluster02 | 186.16.195.26 | DISK | CentOS 7.0 - 64位 |
cluster部署过程:
分别在三个节点的/etc/hosts下设置相同的配置信息
186.16.195.24 rabbitmqCluster 186.16.195.25 rabbitmqCluster01 186.16.195.26 rabbitmqCluster02
[root@rabbitmqCluster01]# scp /var/lib/rabbitmq/.erlang.cookie 186.16.195.25:/var/lib/rabbitmq [root@rabbitmqCluster02]# scp /var/lib/rabbitmq/.erlang.cookie 186.16.195.26:/var/lib/rabbitmq12
rabbitmqctl stop rabbitmq-server -detached 12
[root@rabbitmqCluster]#rabbitmqctl cluster_status [root@rabbitmqCluster01]#rabbitmqctl cluster_status [root@rabbitmqCluster02]#rabbitmqctl cluster_status
[root@rabbitmqCluster01]#rabbitmqctl stop_app [root@rabbitmqCluster01]#rabbitmqctl join_cluster rabbit@rabbitmqCluster [root@rabbitmqCluster01]#rabbitmqctl start_app123
[root@rabbitmqCluster]#rabbitmqctl cluster_status