CentOS7下RabbitMQ的安装介绍

介绍

RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统。它是由Erlang语言开发。java

AMQP:Advanced Message Queue,高级消息队列协议。他是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。node

RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。具体特色包括:<!--more-->linux

  1. 可靠性(Reliability):RabbitMQ使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
  2. 灵活的路由(Flexible Routing):在消息进入队列以前,经过 Exchange 来路由消息的。
  3. 消息集群(Clustering):多个 RabbitMQ 服务器能够组成一个集群,造成一个逻辑 Broker 。
  4. 高可用(Highly Available Queues):队列能够在集群中的机器上进行镜像,使得在部分节点出问题的状况下队列仍然可用。
  5. 多种协议(Multi-protocol):RabbitMQ支持多种消息队列协议,好比STOMP、MQTT等。
  6. 多语言客户端(Many Clients):RabbitMQ 几乎支持全部经常使用语言,好比 Java、.NET、Ruby 等。
  7. 管理界面(Management UI):RabbitMQ 提供了一个易用的用户界面,使得用户能够监控和管理消息 Broker 的许多方面。
  8. 跟踪机制(Tracing):若是消息异常,RabbitMQ 提供了消息跟踪机制,使用者能够找出发生了什么。
  9. 插件机制(Plugin System):RabbitMQ 提供了许多插件,来从多方面进行扩展,也能够编写本身的插件。

基本概念

项目结构图:(直接引用百度百科的)git

概念说明:vim

  • Broker:消息队列服务器的实体,是一个中间件应用,负责接收消息生产者的消息,而后将消息发送至消息接收者或其余的Braker
  • Exchange:消息交换机,是消息第一个到达的地方,消息经过它指定的路由规则,分发到不一样的消息队列中去。
  • Queue:消息队列,消息经过发送和路由以后最终达到的地方,到达Queue的消息即进入逻辑上等待消费的状态。每一个消息都会被发送到一个或多个队列。
  • Binding:绑定,它的做用就是把Exchange和Queue按照路由规则绑定起来,也就是Exchange和Queue之间的虚拟连接。
  • Routing Key:路由关键字,Exchange根据这个关键字进行消息投递。
  • Virtual host:虚拟主机,是对Broker的虚拟划分,将消费者、生产者和它们依赖的AMQP相关结构进行隔离,通常都是为了安全考虑。好比:咱们能够在一个Broker中设置多个虚拟主机,对不一样用户进行权限的分离。
  • Connection:链接。表明生产者、消费者、Broker之间进行通讯的物理网络。
  • Channel:消息通道,用于链接生产者和消费者的逻辑结构。在客户端每一个链接里,可创建多个Channel,每一个Channel表明一个会话任务,经过Channel能够隔离同一个链接中的不一样交互内容。
  • Producer:消息生产者。
  • Consumer:消息消费者。

消息队列的使用过程:浏览器

  1. 客户端链接到消息队列服务器,打开一个channel。
  2. 客户端声明一个exchange,并设置相关属性。
  3. 客户端声明一个queue,并设置相关属性。
  4. 客户端使用routing key,在exchange和queue之间创建好绑定关系。
  5. 客户端投递消息到exchange。

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个部分:服务器

  1. exchange持久化,在声明时指定durable => 1
  2. queue持久化,在声明时指定durable => 1
  3. 消息持久化,在投递时指定delivery_mode => 2(1是非持久化)

若是exchange和queue都是持久化的,那么它们之间的binding也是持久化的。若是exchange和queue二者之间有一个持久化,一个非持久化,就不容许创建绑定。cookie

安装介绍

Erlang安装配置

前面说到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

RabbitMQ的安装配置

  • 下载安装,从官网下载,点击下载 ,进入选择版本。在linux环境下须要下带有unix的,以下:
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.12/rabbitmq-server-generic-unix-3.6.12.tar.xz
  • 解压,这里将其解压到opt目录中。解压以后进入opt目录,修改rabbitmq的文件夹
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服务操做

  • 启动服务
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}}]
  • 中止RabbitMQ
rabbitmqctl stop

配置网页插件

RabbitMQ网页管理的端口是15672,可是如今还不能访问,须要添加网页插件才能访问

rabbitmq-plugins enable rabbitmq_management

在浏览器中输入ip:15672

在网上看到有人说默认的帐号密码是guest,可是该帐号只能经过localhost登陆。因此须要配置一个用户并设置权限。

  1. 添加用户
rabbitmqctl add_user [username] [password]
  1. 添加权限
rabbitmqctl set_permissions -p "/" [username] ".*" ".*" ".*"
  1. 修改用户角色
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,若是想在同一台机器上启动多个节点,那么其余的节点就会由于节点名称和端口与默认的冲突而致使启动失败,能够经过设置环境变量来实现,具体方法以下:

  1. 先关闭上面的网页管理插件
rabbitmq-plugins disable rabbitmq_management
  1. 首先在机器上设置设置两个节点rabbit和rabbit_01
rabbitmqctl stop //先中止运行节点,再进行集群部署
#启动第一个节点
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached
#启动第二个节点
RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit_1 rabbitmq-server -detached
  1. 将第二个节点rabbit-01加入到第一个集群节点rabbit中
#中止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集群内部署多个节点,须要注意两个方面:

  • 保证须要部署的这几个节点在同一个局域网内
  • 须要有相同的Erlang Cookie,不然不能进行通讯,为保证cookie的彻底一致,采用从一个节点copy的方式

环境介绍

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
  • 设置不一样节点间同一认证的Erlang Cookie
    采用从主节点copy的方式保持Cookie的一致性
[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
  • 使用 -detached运行各节点
rabbitmqctl stop
rabbitmq-server -detached 12
  • 查看各节点的状态
[root@rabbitmqCluster]#rabbitmqctl cluster_status
[root@rabbitmqCluster01]#rabbitmqctl cluster_status
[root@rabbitmqCluster02]#rabbitmqctl cluster_status
  • 建立并部署集群,以rabbitmqCluster01节点为例:
[root@rabbitmqCluster01]#rabbitmqctl stop_app
[root@rabbitmqCluster01]#rabbitmqctl join_cluster rabbit@rabbitmqCluster
[root@rabbitmqCluster01]#rabbitmqctl start_app123
  • 查看集群状态
[root@rabbitmqCluster]#rabbitmqctl cluster_status

参考

  1. CentOS7下RabbitMQ服务安装配置
  2. 消息队列之 RabbitMQ
  3. RabbitMQ分布式集群架构和高可用性(HA)
  4. https://geewu.gitbooks.io/rabbitmq-quick/content/
相关文章
相关标签/搜索