1、RabbitMQ概念
RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发。RabbitMQ听说具备良好的性能和时效性,同时还可以很是好的支持集群和负载部署,很是适合在较大规模的分布式系统中使用。web
消息中间件的工做过程能够用生产者消费者模型来表示.即,生产者不断的向消息队列发送信息,而消费者从消息队列中消费信息.具体过程以下:正则表达式
从上图可看出,对于消息队列来讲,生产者,消息队列,消费者是最重要的三个概念,生产者发消息到消息队列中去,消费者监听指定的消息队列,而且当消息队列收到消息以后,接收消息队列传来的消息,而且给予相应的处理.消息队列经常使用于分布式系统之间互相信息的传递.ubuntu
Rabbit模式大概分为如下三种:单一模式、普通模式、镜像模式
单一模式:最简单的状况,非集群模式,即单实例服务。
普通模式:默认的集群模式。
queue建立以后,若是没有其它policy,则queue就会按照普通模式集群。对于Queue来讲,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构,但队列的元数据仅保存有一份,即建立该队列的rabbitmq节点(A节点),当A节点宕机,你能够去其B节点查看,./rabbitmqctl list_queues 发现该队列已经丢失,但声明的exchange还存在。
当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并通过B发送给consumer。
因此consumer应尽可能链接每个节点,从中取消息。即对于同一个逻辑队列,要在多个节点创建物理Queue。不然不管consumer连A或B,出口总在A,会产生瓶颈。
该模式存在一个问题就是当A节点故障后,B节点没法取到A节点中还未消费的消息实体。
若是作了消息持久化,那么得等A节点恢复,而后才可被消费;若是没有持久化的话,队列数据就丢失了。
镜像模式:把须要的队列作成镜像队列,存在于多个节点,属于RabbitMQ的HA方案。
该模式解决了上述问题,其实质和普通模式不一样之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。
该模式带来的反作用也很明显,除了下降系统性能外,若是镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通信大大消耗掉。
因此在对可靠性要求较高的场合中适用,一个队列想作成镜像队列,须要先设置policy,而后客户端建立队列的时候,rabbitmq集群根据“队列名称”自动设置是普通集群模式或镜像队列。具体以下:
队列经过策略来使能镜像。策略能在任什么时候刻改变,rabbitmq队列也近可能的将队列随着策略变化而变化;非镜像队列和镜像队列之间是有区别的,前者缺少额外的镜像基础设施,没有任何slave,所以会运行得更快。
为了使队列称为镜像队列,你将会建立一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。
了解集群中的基本概念:
RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将全部数据放在内存,磁盘节点将数据放在磁盘。不过,如前文所述,若是在投递消息时,打开了消息的持久化,那么即便是内存节点,数据仍是安全的放在磁盘。
一个rabbitmq集群中能够共享user,vhost,queue,exchange等,全部的数据和状态都是必须在全部节点上复制的,一个例外是,那些当前只属于建立它的节点的消息队列,尽管它们可见且可被全部节点读取。rabbitmq节点能够动态的加入到集群中,一个节点它能够加入到集群中,也能够从集群环集群会进行一个基本的负载均衡。
集群中有两种节点:
1 内存节点:只保存状态到内存(一个例外的状况是:持久的queue的持久内容将被保存到disk)
2 磁盘节点:保存状态到内存和磁盘。
内存节点虽然不写入磁盘,可是它执行比磁盘节点要好。集群中,只须要一个磁盘节点来保存状态就足够了若是集群中只有内存节点,那么不能中止它们,不然全部的状态,消息等都会丢失。vim
RabitMQ的工做流程centos
对于RabbitMQ来讲,除了这三个基本模块之外,还添加了一个模块,即交换机(Exchange).它使得生产者和消息队列之间产生了隔离,生产者将消息发送给交换机,而交换机则根据调度策略把相应的消息转发给对应的消息队列.那么RabitMQ的工做流程以下所示:缓存
交换机的主要做用是接收相应的消息而且绑定到指定的队列.交换机有四种类型,分别为Direct,topic,headers,Fanout.
1).Direct是RabbitMQ默认的交换机模式,也是最简单的模式.即建立消息队列的时候,指定一个BindingKey.当发送者发送消息的时候,指定对应的Key.当Key和消息队列的BindingKey一致的时候,消息将会被发送到该消息队列中.
2).topic转发信息主要是依据通配符,队列和交换机的绑定主要是依据一种模式(通配符+字符串),而当发送消息的时候,只有指定的Key和该模式相匹配的时候,消息才会被发送到该消息队列中.
3).headers也是根据一个规则进行匹配,在消息队列和交换机绑定的时候会指定一组键值对规则,而发送消息的时候也会指定一组键值对规则,当两组键值对规则相匹配的时候,消息会被发送到匹配的消息队列中.
4).Fanout是路由广播的形式,将会把消息发给绑定它的所有队列,即使设置了key,也会被忽略.安全
2、RabbitMQ的安装
1.ubuntu16.04中安装RabbitMQ
1).首先必需要有Erlang环境支持
安装以前要装一些必要的库:
# sudo apt-get install build-essential
# sudo apt-get install libncurses5-dev
# sudo apt-get install libssl-dev
# sudo apt-get install m4
# sudo apt-get install unixodbc unixodbc-dev
# sudo apt-get install freeglut3-dev libwxgtk2.8-dev
# sudo apt-get install xsltproc
# sudo apt-get install fop
# sudo apt-get install tk8.5
安装好以后运行:
# sudo apt-get install erlang
完成后在控制台输入命令:
erl
能够查看erlang安装版本状况
2).安装RabbitMQ(能够用两种方式)
自动安装
# sudo apt-get install rabbitmq-server
若是没有问题,那就直接安装了,不用设置什么东西
查看运行状态
# service rabbitmq-server status
手动安装
1).首先建立一个文件夹用来下载RabbitMQ
# mkdir rabbitmqsoft
# cd rabbitmqsoft
2).获取安装包(这里选择2.7.0 unix版本)
# wget http://www.rabbitmq.com/releases/rabbitmq-server/v2.7.0/rabbitmq-server-generic-unix-2.7.0.tar.gz
--解压
# tar -zxvf rabbitmq-server-generic-unix-2.7.0.tar.gz
# cd rabbitmq_server-2.7.0/
3).运行
# sbin/rabbitmq-server
4).查看运行状态(打开另一个终端)
# cd ~/rabbitmqsoft/rabbitmq_server-2.7.0/
# sbin/rabbitmqctl status
到底为止,Ubuntu系统下安装RabbitMQ就完成了
1.centos7中安装RabbitMQ
1).首先须要安装erlang
#rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
#yum install erlang
安装过程当中会有提示,一路输入“y”便可。
2).完成后安装RabbitMQ:
先下载rpm:
#wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm
下载完成后安装:
#yum install rabbitmq-server-3.6.6-1.el7.noarch.rpm
完成后启动服务:
#service rabbitmq-server start
能够查看服务状态:
#service rabbitmq-server status
3、RabbitMQ的配置
1.修改配置文件
经过查看服务状态:
#service rabbitmq-server status网络
这里能够看到log文件的位置,转到文件位置,打开文件:负载均衡
这里显示的是没有找到配置文件,咱们能够本身建立这个文件
#cd /etc/rabbitmq/
#vim rabbitmq.config
编辑内容以下:
[{rabbit, [{loopback_users, []}]}].
这里的意思是开放使用,rabbitmq默认建立的用户guest,密码也是guest,这个用户默认只能是本机访问,localhost或者127.0.0.1,从外部访问须要添加上面的配置。
保存配置后重启服务:
#service rabbitmq-server stop
#service rabbitmq-server start
2.安装插件
#/sbin/rabbitmq-plugins enable rabbitmq_management
重启rabbitmq服务
#service rabbitmq-server restart
到此,就能够经过http://ip:15672 使用guest,guest 进行登录web页面了
4、RabbitMQ用户角色及权限控制
1.RabbitMQ的用户角色分类:
none、management、policymaker、monitoring、administrator
2.RabbitMQ各种角色描述:
none
不能访问 management plugin
management
用户能够经过AMQP作的任何事外加:
列出本身能够经过AMQP登入的virtual hosts
查看本身的virtual hosts中的queues, exchanges 和 bindings
查看和关闭本身的channels 和 connections
查看有关本身的virtual hosts的“全局”的统计信息,包含其余用户在这些virtual hosts中的活动。
policymaker
management能够作的任何事外加:
查看、建立和删除本身的virtual hosts所属的policies和parameters
monitoring
management能够作的任何事外加:
列出全部virtual hosts,包括他们不能登陆的virtual hosts
查看其余用户的connections和channels
查看节点级别的数据如clustering和memory使用状况
查看真正的关于全部virtual hosts的全局的统计信息
administrator
policymaker和monitoring能够作的任何事外加:
建立和删除virtual hosts
查看、建立和删除users
查看建立和删除permissions
关闭其余用户的connections
3.建立用户并设置角色:
能够建立管理员用户,负责整个MQ的运维,例如:
$sudo rabbitmqctl add_user user_admin passwd_admin
赋予其administrator角色:
$sudo rabbitmqctl set_user_tags user_admin administrator
能够建立RabbitMQ监控用户,负责整个MQ的监控,例如:
$sudo rabbitmqctl add_user user_monitoring passwd_monitor
赋予其monitoring角色:
$sudo rabbitmqctl set_user_tags user_monitoring monitoring
能够建立某个项目的专用用户,只能访问项目本身的virtual hosts
$sudo rabbitmqctl add_user user_proj passwd_proj
赋予其monitoring角色:
$sudo rabbitmqctl set_user_tags user_proj management
建立和赋角色完成后查看并确认:
$sudo rabbitmqctl list_users
4.RabbitMQ权限控制
默认virtual host:"/"
默认用户:guest
guest具备"/"上的所有权限,仅能有localhost访问RabbitMQ包括Plugin,建议删除或更改密码。可经过将配置文件中loopback_users置孔来取消其本地访问的限制:
[{rabbit, [{loopback_users, []}]}]
用户仅能对其所能访问的virtual hosts中的资源进行操做。这里的资源指的是virtual hosts中的exchanges、queues等,操做包括对资源进行配置、写、读。配置权限可建立、删除、资源并修改资源的行为,写权限可向资源发送消息,读权限从资源获取消息。好比:
exchange和queue的declare与delete分别须要exchange和queue上的配置权限
exchange的bind与unbind须要exchange的读写权限
queue的bind与unbind须要queue写权限exchange的读权限
发消息(publish)需exchange的写权限
获取或清除(get、consume、purge)消息需queue的读权限
对何种资源具备配置、写、读的权限经过正则表达式来匹配,具体命令以下:
set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
其中,<conf> <write> <read>的位置分别用正则表达式来匹配特定的资源,如'^(amq\.gen.*|amq\.default)$'能够匹配server生成的和默认的exchange,'^$'不匹配任何资源
须要注意的是RabbitMQ会缓存每一个connection或channel的权限验证结果、所以权限发生变化后须要重连才能生效。
为用户赋权:
$sudo rabbitmqctl set_permissions -p /vhost1 user_admin '.*' '.*' '.*'
该命令使用户user_admin具备/vhost1这个virtual host中全部资源的配置、写、读权限以便管理其中的资源
查看权限:
$sudo rabbitmqctl list_user_permissions user_admin
Listing permissions for user "user_admin" ...
/vhost1<span style="white-space:pre"> </span>.*<span style="white-space:pre"> </span>.*<span style="white-space:pre"> </span>.*
$sudo rabbitmqctl list_permissions -p /vhost1
Listing permissions in vhost "/vhost1" ...
user_admin<span style="white-space:pre"> </span>.*<span style="white-space:pre"> </span>.*<span style="white-space:pre"> </span>.* 运维