rabbitmq安装配置、集群、权限分配

介绍

架构图

RabbitMQ是一个由erlang开发的AMQP的开源实现

概念说明

  • Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输,
  • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
  • Queue:消息的载体,每个消息都会被投到一个或多个队列。
  • Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来.
  • Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
  • vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。
  • Producer:消息生产者,就是投递消息的程序.
  • Consumer:消息消费者,就是接受消息的程序.
  • Channel:消息通道,在客户端的每个连接里,可建立多个channel.

安装

编译工具

1
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel

安装配置Erlang

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#官方下载地址:http://erlang.org/download/otp_src_18.3.tar.gz
mkdir /opt/erlang
cd /opt/erlang
wget http://erlang.org/download/otp_src_18.3.tar.gz
#解压
tar xvf otp_src_18.3.tar.gz
cd otp_src_18.3

#配置 '--prefix'指定的安装目录
./configure --prefix=/usr/local/erlang --with-ssl -enable-threads -enable-smmp-support -enable-kernel-poll --enable-hipe --without-javac

#安装
make && make install

#配置
vim /etc/profile

#在文件末尾添加下面代码 'ERLANG_HOME'等于上一步'--prefix'指定的目录
ERLANG_HOME=/usr/local/erlang
PATH=$ERLANG_HOME/bin:$PATH
export ERLANG_HOME
export PATH

#使环境变量生效
source /etc/profile

#输入命令检验是否安装成功
erl

安装RabbitMQ

RabbitMQ3.6版本无需make、make install 解压就可以用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#官方下载地址http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/rabbitmq-server-generic-unix-3.6.1.tar.xz
mkdir /opt/rabbitmq
cd /opt/rabbitmq
wget rabbitmq-server-generic-unix-3.6.1.tar.xz
#解压rabbitmq,官方给的包是xz压缩包,所以需要使用xz命令
xz -d rabbitmq-server-generic-unix-3.6.1.tar.xz
#xz解压后得到.tar包,再用tar命令解压
tar -xvf rabbitmq-server-generic-unix-3.6.1.tar
#修改文件夹名
mv rabbitmq_server-3.6.1 rabbitmq-3.6.1
#开启管理页面插件
cd ./rabbitmq-3.6.1/sbin/
./rabbitmq-plugins enable rabbitmq_management
#启用RabbitMQWeb管理插件:访问:http://<server-name>:15672/

启动

1
2
3
4
5
6
7
8
9
10
#启动命令,该命令ctrl+c后会关闭服务
./rabbitmq-server
#在后台启动Rabbit
./rabbitmq-server -detached
#关闭服务
./rabbitmqctl stop
#查看状态
#可以查看到缺省监听端口:
#{listeners,[{clustering,25672,"::"},{amqp,5672,"::"}]},
./rabbitmqctl status

配置

配置文件

rabbitmq的配置放在/opt/rabbitmq/rabbitmq_server-3.5.4/etc/rabbitmq目录下

官方解释:The location of these files is distribution-specific. By default, they are not created, but expect to be located in the following places on each platform:

  • Generic UNIX - $RABBITMQ_HOME/etc/rabbitmq/
  • Debian - /etc/rabbitmq/
  • RPM - /etc/rabbitmq/
  • Mac OS X (Homebrew) - ${install_prefix}/etc/rabbitmq/, the Homebrew prefix is usually /usr/local
  • Windows - %APPDATA%\RabbitMQ\

If rabbitmq-env.conf doesn’t exist, it can be created manually in the location, specified by the RABBITMQ_CONF_ENV_FILE variable. On Windows systems, it is named rabbitmq-env.bat.

If rabbitmq.config doesn’t exist, it can be created manually. Set the RABBITMQ_CONFIG_FILE environment variable if you change the location. The Erlang runtime automatically appends the .config extension to the value of this variable.

Restart the server after changes. Windows service users will need to re-install the service after adding or removing a configuration file.

rabbitm的配置文件有三中

一是rabbitmq服务器的属性配置 文件名称为:rabbitmq.config

二是rabbitmq服务器环境变量配置 文件名称为:rabbitmq-env.conf

三是rabbitmq服务器插件开启配置 文件名称为:enabled_plugins

具体的配置选项可以通过rabbitmq的官网了解 网址为:http://www.rabbitmq.com/configure.html

账户管理

RabbitMQ的用户角色分类:
none、management、policymaker、monitoring、administrator

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#进入RabbitMQ安装目录
cd /usr/local/rabbitmq-3.6.1/sbin
#添加用户
#rabbitmqctl add_user Username Password
./rabbitmqctl add_user liuhailin liuhailin
#删除用户
./rabbitmqctl delete_user username
#修改密码
./rabbitmqctl change_password username newpassword
#列出所有用户
./rabbitmqctl list_users
#分配用户标签
#rabbitmqctl set_user_tags <user> [administrator | monitoring | policymaker | management]
./rabbitmqctl set_user_tags rabbitadmin administrator
#创建虚拟主机
./rabbitmqctl add_vhost vhostpath
#删除虚拟主机
./rabbitmqctl delete_vhost vhostpath
#列出所有虚拟主机
./rabbitmqctl list_vhosts
#设置用户权限
#./rabbitmqctl set_permissions [-p vhostpath] username regexp1 regexp2 regexp3 (配置、写、读的权限)
#设置用户权限:rabbitmqctl set_permissions <user> '.*' '.*' '.*' (<conf> <write> <read>,正则表达式,'.*'表示所有权限
./rabbitmqctl set_permissions -p /test liuhailin '.*' '.*' '.*'
#清除用户权限
#./rabbitmqctl clear_permissions [-p vhostpath] username
#列出虚拟主机上的所有权限
# rabbitmqctl list_permissions [-p vhostpath]
#列出用户权限
# rabbitmqctl list_user_permissions username

#关闭节点
# rabbitmqctl stop
#停止RabbitMQ应用
# rabbitmqctl stop_app
#启动RabbitMQ应用
# rabbitmqctl start_app
#显示RabbitMQ中间件各种信息
# rabbitmqctl status
#重置RabbitMQ节点
# rabbitmqctl reset
# rabbitmqctl force_reset
#从它属于的任何集群中移除,从管理数据库中移除所有数据,例如配置过的用户和虚拟宿主, 删除所有持久化的消息。
#force_reset命令和reset的区别是无条件重置节点,不管当前管理数据库状态以及集群的配置。如果数据库或者集群配#置发生错误才使用这个最后 的手段。
#注意:只有在停止RabbitMQ应用后,reset和force_reset才能成功。
#循环日志文件
# rabbitmqctl rotate_logs[suffix]
#集群管理
# rabbitmqctl cluster clusternode…

集群安装配置

环境

  • CentOS 6.5,64位
  • RabbitMQ 集群安装在 3 个节点上:192.168.1.1、192.168.1.2、192.168.1.3;
  • HAProxy 安装在 192.168.1.4 上,用于对外提供 RabbitMQ 均衡。

集群概述

通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等

节点,即每个节点都提供服务给客户端连接,进行消息发送与接收。

这些节点通过 RabbitMQ HA 队列(镜像队列)进行消息队列结构复制。本方案中搭建 3 个节点,并且都是磁盘

节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务

设计集群的目的

  • 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行
  • 通过增加更多的节点来扩展消息通信的吞吐量

节点类型

  • RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和vhost的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。
  • Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启RabbitMQ的时候,丢失系统的配置信息。

使用模式

Rabbit模式大概分为以下三种:单一模式、普通模式、镜像模式

集群功能和原理

RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。

  • 普通模式:默认的集群模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
  • 镜像模式:将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽

实现机制

镜像队列实现了RabbitMQ的高可用性(HA),具体的实现策略如下所示:

ha-mode ha-params 功能
all 镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份。
exactly count 镜像队列将会在集群上复制count份。如果集群数量少于count时候,队列会复制到所有节点上。如果大于Count集群,有一个节点crash后,新进入节点也不会做新的镜像。
nodes node name 镜像队列会在node name中复制。如果这个名称不是集群中的一个,这不会触发错误。如果在这个node list中没有一个节点在线,那么这个queue会被声明在client连接的节点。

Erlang Cookie是保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的Erlang Cookie。具体的目录存放在/var/lib/rabbitmq/.erlang.cookie。

说明: 这就要从rabbitmqctl命令的工作原理说起,RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证。

如果是解压安装的,需要server启动后,保存在用户当前目录~/.erlang.cookie,拷贝这个文件到各个节点相同目录下,并设置访问权限

chmod 777 /var/lib/rabbitmq/.erlang.cookie

修改/etc/hosts

加入集群3个节点的描述

192.168.1.1 node1

192.168.1.2 node2

192.168.1.3 node3

负载均衡

前言:从目前来看,基于RabbitMQ的分布式通信框架主要包括两部分内容,一是要确保可用性和性能,另一个就是编写当节点发生故障时知道如何重连到集群的应用程序。负载均衡就是解决处理节点的选择问题。

安装HAProxy

选择开源的HAProxy为RabbitMQ集群做负载均衡器,在CentOS 7.0中安装HAProxy。

  • 安装epel
1
rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm//1
  • 安装HAProxy
1
yum -y install haproxy1
  • 配置HAProxy
1
2
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
vim /etc/haproxy/haproxy.cfg12
  • 添加配置信息
1
2
3
4
5
6
7
8
9
10
11
listen rabbitmq_local_cluster 127.0.0.1:5670 //前段IP,供product和consumer来进行选择,由于5672端口已经默认使用,这里选择5670端口
mode tcp //负载均衡选项
balance roundrobin //轮询算法将负载发给后台服务器
server rabbit 127.0.0.1:5672 check inter 5000 rise 2 fall 3//负载均衡中的集群节点配置,这里选择的rabbit节点

listen private_monitoring :8100
mode http
option httplog
stats enable
stats uri /stats
stats refresh 60s1234567891011

参考链接

http://www.cnblogs.com/flat_peach/archive/2013/04/07/3004008.html

http://blog.csdn.net/woogeyu/article/details/51119101

http://www.cnblogs.com/lion.net/p/5725474.html

http://www.centoscn.com/CentosServer/cluster/2014/1216/4324.html

http://blog.csdn.net/linvo/article/details/7793706

http://www.dongcoder.com/detail-21167.html

http://www.cnblogs.com/lylife/p/5584019.html

http://diannaowa.blog.51cto.com/3219919/1671623

http://bugfixed.org/?p=402

http://blog.csdn.net/woogeyu/article/details/51119101

坚持技术分享,您的支持将鼓励我继续创作!