安装RabbitMQ(单机&集群)
RabbitMQ安装
在线安装(单机)
安装erlang
rabbitmq是erlang语言编写的,安装rabbitmq之前,需要先安装erlang,这里用erlang的源码进行安装,erlang安装包官网下载地址:http://erlang.org/download/
wget http://erlang.org/download/otp_src_21.1.tar.gz
tar -zxvf otp_src_21.1.tar.gz
cd otp_src_21.1
# 这里要新建一个erlang文件夹,因为erlang编译安装默认是装在/usr/local下的bin和lib中,这里我们将他统一装到/usr/local/erlang中,方便查找和使用。
mkdir -p /usr/local/erlang
# 在编译之前,必须安装以下依赖包
yum install -y make gcc gcc-c++ m4 openssl openssl-devel ncurses-devel unixODBC unixODBC-devel java java-devel
erlang的编译需要用到java环境,如果不装,会报错。然后,直接执行 make && makeinstall 进行编译安装
make && make install
安装后,在 /usr/local/erlang 中就会出现 bin 和 lib 目录,然后将 /usr/local/erlang/bin 这个文件夹加入到环境变量中,加载以下即可直接使用。
vim /etc/profile
######### 添加如下内容 ###############
PATH=$PATH:/usr/local/erlang/bin
########################################
到此,既安装完成,直接输入erl,可以获取到erlang版本信息。
安装RabbitMQ
OK,安装完erlang后,下面安装rabbitmq,安装之前,需要去官网查看一下rabbitmq版本对erlang版本的一个支持情况,官网地址:http://www.rabbitmq.com/which-erlang.html

# 下载源码包
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.8/rabbitmq-server-generic-unix-3.7.8.tar.xz
# 解压
tar -xvf rabbitmq-server-generic-unix-3.7.8.tar.xz -C /usr/local/
# 添加环境变量
vim /etc/profile
------ 添加如下内容 ------
PATH=$PATH:/usr/local/rabbitmq_server-3.7.8/sbin
# 重载一下环境变量
source /etc/profile
# 添加web管理插件
rabbitmq-plugins enable rabbitmq_management
ok,然后就可以启动rabbitmq服务了。
# 后台启动rabbitmq服务
rabbitmq-server -detached
上面,启用了rabbitmq的管理插件,会有一个web管理界面,默认监听端口15672,将此端口在防火墙上打开,则可以访问web界面:

使用默认的用户 guest / guest (此也为管理员用户)登陆,会发现无法登陆,报错:User can only log in via localhost。那是因为默认是限制了guest用户只能在本机登陆,也就是只能登陆 localhost:15672。可以通过修改配置文件rabbitmq.conf,取消这个限制: loopback_users这个项就是控制访问的,如果只是取消guest用户的话,只需要loopback_users.guest = false 即可。
注意:
{loopback_users, [<<"guest">>]}
这个是erlang格式的原配置,后面是一个列表,可以自定义添加多个用户。是用来定义需要被限制登录的用户。默认是只有guest这一个用户。我们这里只需要设置loopback_users.guest = false 就可以解除guest的限制了。如图:

然后,就能登陆到web控制界面:

OK,到此rabbitmq就算是装好了,rabbitmq的webui功能比较齐全,可以做到很多东西,包括常见的用户管理,权限管理,vhost管理等等。如图

点击自身用户,可以设置用户的权限

总的来说,使用webui已经非常方便了,可以实现基本常用的管理操作。
离线安装(单机)
依赖包安装
Rabbitmq安装主要依赖两个rpm依赖包: erlang 和 socat 。
erlang的下载和安装
下载 erlang, 在 packagecloud 页面选择对应版本的erlang的rpm安装包(centos7需要19.3以上版本)。
将下载后的erlang安装包上传到Linux的 /usr/local 目录,然后,使用rpm命令进行安装,命令如下:
sudo rpm -ivh /usr/local/erlang-22.0.6-1.el6.x86_64.rpm
socat 的下载和安装
什么是socat ?
socat 是Linux系统下的一强大易用的网络工具,名字来由是 "Socket CAT",可以看作是netcat的加强版,socat的官方网站:http://www.dest-unreach.org/socat/。socat是一个两个独立数据通道之间的双向数据传输的继电器。这些数据通道包含文件、管道、设备(终端或调制解调器等)、插座(Unix,IP4,IP6 - raw,UDP,TCP)、SSL、SOCKS4客户端或代理CONNECT。 Socat支持广播和多播、抽象Unix sockets、Linux tun/tap、GNU readline 和 PTY。它提供了分叉、记录和进程间通信的不同模式。socat的主要特点就是在两个数据流之间建立通道;且支持众多协议和链接方式:ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl,socket等。
如何下载socat?
首先在 rpmfind 页面上,找到匹配目标Linux(这里是centos 7)系统的 rpm安装包, 这里选择的是socat-1.7.3.2-2.el7.x86_64.rpm 安装包。
安装socat离线包
将下载后的socat安装包上传到Linux的/usr/local目录,使用rpm命令进行安装,命令如下:
sudo rpm -ivh /usr/local/socat-1.7.3.2-2.el7.x86_64.rpm
RabbitMQ安装
第一步:下载需要安装的Rabbitmq版本
到 (Github)[https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.17/rabbitmq-server-3.7.17-1.el7.noarch.rpm] 上下载需要的版本
第二步:rpm命令进行安装RabbitMQ
将安装包上传到Linux的/usr/local目录,然后,使用rpm命令进行安装,命令如下:
sudo rpm -ivh /usr/local/rabbitmq-server-3.7.17-1.el7.noarch.rpm
RabbitMQ配置
- 启动RabbitMQ
启动RabbitMQ消息服务器,可以执行下面的命令:sudo service rabbitmq-server start - RabbitMQ管理账户的配置
执行命令rabbitmqctl add_user admin admin,设置账户密码为 admin/adminrabbitmqctl add_user admin admin - 为管理员设置权限
执行命令rabbitmqctl set_user_tags admin administrator,设置admin为管理员权限rabbitmqctl set_user_tags admin administrator - 打开rabbitmq web管理
执行命令rabbitmq-plugins enable rabbitmq_management,打开rabbitmq web管理。rabbitmq-plugins enable rabbitmq_management - 登陆管理端,并打开访问权限
- 管理链接为:
http://192.168.233.128:15672, 登陆账户密码为设置的 admin/admin - 查看用户权限,默认状态下权限是不允许访问(此时程序访问5672端口是连接被拒绝)。
- 点击用户名,进入用户页面,直接点击设置权限。此时刷新页面回到Users页面,权限变成可访问。
- 停止
[root@localhost work]# service rabbitmq-server stop Redirecting to /bin/systemctl stop rabbitmq-server.service [root@localhost work]# service rabbitmq-server status Redirecting to /bin/systemctl status rabbitmq-server.service ...
开机自启
chkconfig rabbitmq-server on
RabbitMQ常用命令
服务启动停止
- 启动: rabbitmq-server -detached
- 停止: rabbitmqctl stop
插件管理
- 插件列表: rabbitmq-plugins list
- 启动插件: rabbitmq-plugins enable XXX (XXX为插件名)
- 停用插件: rabbitmq-plugins disable XXX
用户管理
- 添加用户: rabbitmqctl add_user username password
- 删除用户: rabbitmqctl delete_user username
- 修改密码: rabbitmqctl change_password username newpassword
- 设置用户角色: rabbitmqctl set_user_tags username tags
- 列出用户: rabbitmqctl list_users
权限管理
- 列出所有用户权限: rabbitmqctl list_permissions
- 查看制定用户权限: rabbitmqctl list_user_permissions username
- 清除用户权限: rabbitmqctl clear_permissions [-p vhostpath] username
- 设置用户权限: rabbitmqctl set_permissions [-p vhostpath] username conf write read
- conf: 一个正则匹配哪些资源能被该用户访问
- write:一个正则匹配哪些资源能被该用户写入
- read:一个正则匹配哪些资源能被该用户读取
集群安装
集群简介
RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。消息队列通过 rabbitmq HA镜像队列进行消息队列实体复制。
普通模式下,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。
镜像模式下,将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
部署说明
这里是默认三台机器上已经部署了RabbitMQ单机,本文章只说明如何部署集群,单机部署请参考Centos7上RabbitMQ单机部署
部署方案
1. 部署规划
准备3台机器,我这里分别为:172.16.6.40,172.16.6.41,172.16.6.42,设置主机名分别为 mem-40,mem-41,mem-42
2. 配置hosts
三台机器上都需要配置,内容一样就可以,前面是IP,后面是各个主机的主机名
vi /etc/hosts
172.16.6.40 mem-40
172.16.6.41 mem-41
172.16.6.42 mem-42
3. 集群部署步骤
1.分别登录到三台机器,启动rabbitmq服务
rabbitmq-server -detached
先启动一台,启动后会在用户的根目录下生成一个 .erlang.cookie 文件,然后把这个文件复制到其它机器的同样目下,必须保证3台机器的cookie是一样的,然后再重启另外两台。
2.查看集群状态
[rabbitmq@mem-40 ~]$ rabbitmqctl cluster_status
Cluster status of node 'rabbit@mem-40' ...
[{nodes,[{disc,['rabbit@mem-40']}]},
{running_nodes,['rabbit@mem-40']},
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
{cluster_name,<<"rabbit@mem-40">>},
{partitions,[]},
{alarms,[{'rabbit@mem-40',[]}]}]
从上面的结果{cluster_name,<<"rabbit@mem-40">>},可以看出来,集群的名称叫 rabbit@mem-40
3.在mem-42主机上做如下操作,将该节点添加到集群(集群名称为上面查询到的名称:rabbit@mem-40)
#添加集群前需要先把本机的rabbitmq应用停掉(⚠️是只停应用)
[rabbitmq@mem-42 ~]$ rabbitmqctl stop_app
Stopping node 'rabbit@mem-42' ...
#添加集群节点
[rabbitmq@mem-42 ~]$ rabbitmqctl join_cluster rabbit@mem-40
#再启动应用
[rabbitmq@mem-42 ~]$ rabbitmqctl start_app
#查看集群状态
[rabbitmq@mem-42 ~]$ rabbitmqctl cluster_status
Cluster status of node 'rabbit@mem-42' ...
[{nodes,[{disc,['rabbit@mem-40','rabbit@mem-42']}]},
{running_nodes,['rabbit@mem-40','rabbit@mem-42']},
{cluster_name,<<"rabbit@mem-40">>},
{partitions,[]}, {alarms,[{'rabbit@mem-40',[]},{'rabbit@mem-42',[]}]}][rabbitmq@mem-42 ~]$
说明:
4.在 mem-41上重复做步骤3的操作,将mem-41添加到集群(这里就不再赘述了)
添加完后就可以在任意节点上查看集群状态,如下,可以看到mem-40、mem-41、mem-42三台服务器都假如到同一个集群了:
[rabbitmq@mem-40 ~]$ rabbitmqctl cluster_status
Cluster status of node 'rabbit@mem-40' ...
[{nodes,[{disc,['rabbit@mem-40','rabbit@mem-41','rabbit@mem-42']}]}, {running_nodes,['rabbit@mem-42','rabbit@mem-40']},
{cluster_name,<<"rabbit@mem-40">>},
{partitions,[]}, {alarms,[{'rabbit@mem-42',[]},{'rabbit@mem-40',[]}]}]
[rabbitmq@mem-40 ~]$
至此,RabbitMQ集群的部署就完成了。后面我们还可以做一些方便集群管理相关的操作,比如导入管理界面、设置镜像队列策略、配置HA等。
4. 导入管理界面
1.分别在三台机器上导入管理界面(也可以只在一台上做,这样就只有这一台可以通过web页面访问,但是可以看到其它服务器上的数据)
rabbitmq-plugins enable rabbitmq_management
rabbitMQ应用的端口默认是5672,导入管理界面后系统会启动15672端口作为web管理端口,这时候可以打开 http://ip:15672 来打开我们的管理界面,如下:

2.添加用户和密码,并设置权限(在任何一台上做就可以了,其它机器上会自动同步)
#用户名admin,密码123456
rabbitmqctl add_user admin 123456
#添加权限(使admin用户对虚拟主机“/” 具有所有权限)
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
#修改用户角色(加入administrator用户组)
rabbitmqctl set_user_tags admin administrator
这样就可以通过admin用户登录管理界面,进行管理操作了。
5. 设置镜像队列策略
在任意节点机器上执行
首先,在web界面,登陆后,点击“Admin--Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机,同时给用户“admin”和“guest”均加上权限(在页面直接设置、点点点即可);

然后,在linux中执行如下命令
rabbitmqctl set_policy -p vhost-test ha-all "^" '{"ha-mode":"all"}'
"vhost-test" 为vhost名称, "^"匹配所有的队列, ha-all 策略名称为ha-all, '{"ha-mode":"all"}' 策略模式为 all 即复制到所有节点,包含新增节点。则此时镜像队列设置成功。
说明:这里的虚拟主机vhost-test是代码中需要用到的虚拟主机,虚拟主机的作用是做一个消息的隔离,本质上可认为是一个rabbitmq-server,是否增加虚拟主机,增加几个,这是由开发中的业务决定,即有哪几类服务,哪些服务用哪一个虚拟主机,这是一个规划)
这里补充一下设置镜像队列策略的说明,有兴趣的可以研究一下。
# rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: queue的匹配模式(正则表达式)
Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
all:表示在集群中所有的节点上进行镜像
exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params:ha-mode模式需要用到的参数
ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manualpriority:可选参数,policy的优先级
6.配置HA
1.安装HA
任意选择一台机器安装HA,我这里选择mem-40这台机器
yum install haproxy
修改配置文件(下面是我的全量配置文件,去掉了注释部分)
vi /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode tcp
log global
option tcplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
# 3次连接失败就认为服务不可用,也可以通过后面设置
retries 3
timeout http-request 10s
timeout queue 1m
# 连接超时时间
timeout connect 10s
# 客户端连接超时时间
timeout client 1m
# 服务器端连接超时时间
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
# 最大连接数
maxconn 3000
#管理页面的代理
listen rabbitmq_admin
bind 0.0.0.0:8004
server node1 172.16.6.40:15672
server node2 172.16.6.41:15672
server node3 172.16.6.42:15672
#后台进程的代理
listen rabbitmq_cluster
bind 0.0.0.0:5670
mode tcp
#负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数)
balance roundrobin
#check inter 5000 是检测心跳频率5s,rise 2是2次正确认为服务器可用,fall 2是2次失败认为服务器不可用
server rabbit1 172.16.6.40:5672 check inter 5000 rise 2 fall 2
server rabbit2 172.16.6.41:5672 check inter 5000 rise 2 fall 2
server rabbit3 172.16.6.42:5672 check inter 5000 rise 2 fall 2
重启服务
systemctl restart haproxy
这样后台可以用172.16.6.40:5670,web管理页面可以通过172.16.6.40:8004进行代理

参考: