跳至主要內容

安装RabbitMQ(单机&集群)

soulballad环境配置CentOSCentOS约 3969 字大约 13 分钟

RabbitMQ安装

在线安装(单机)

安装erlang

rabbitmq是erlang语言编写的,安装rabbitmq之前,需要先安装erlang,这里用erlang的源码进行安装,erlang安装包官网下载地址:http://erlang.org/download/open in new window

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.htmlopen in new window

img

# 下载源码包
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界面:

img

使用默认的用户 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的限制了。如图:

img

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

img

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

img

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

img

总的来说,使用webui已经非常方便了,可以实现基本常用的管理操作。

离线安装(单机)

依赖包安装

Rabbitmq安装主要依赖两个rpm依赖包: erlangsocat

erlang的下载和安装

下载 erlang, 在 packagecloudopen in new window 页面选择对应版本的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?

首先在 rpmfindopen in new window 页面上,找到匹配目标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配置

  1. 启动RabbitMQ
    启动RabbitMQ消息服务器,可以执行下面的命令:
    sudo service rabbitmq-server start
  2. RabbitMQ管理账户的配置
    执行命令 rabbitmqctl add_user admin admin,设置账户密码为 admin/admin
    rabbitmqctl add_user admin admin
  3. 为管理员设置权限
    执行命令 rabbitmqctl set_user_tags admin administrator,设置admin为管理员权限
    rabbitmqctl set_user_tags admin administrator
  4. 打开rabbitmq web管理
    执行命令 rabbitmq-plugins enable rabbitmq_management,打开rabbitmq web管理。
    rabbitmq-plugins enable rabbitmq_management
  5. 登陆管理端,并打开访问权限
  • 管理链接为:http://192.168.233.128:15672, 登陆账户密码为设置的 admin/admin
  • 查看用户权限,默认状态下权限是不允许访问(此时程序访问5672端口是连接被拒绝)。
  • 点击用户名,进入用户页面,直接点击设置权限。此时刷新页面回到Users页面,权限变成可访问。
  1. 停止
    [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单机部署open in new window

部署方案

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 来打开我们的管理界面,如下:

img

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”均加上权限(在页面直接设置、点点点即可);

img

然后,在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进行代理

img

参考:

上次编辑于:
贡献者: soulballad