CentOS7上安装配置RabbitMQ

Docker方式

安装Docker

https://www.psvmc.cn/article/2018-12-13-docker-install.html

安装RabbitMQ

1
docker run -dit --name rabbitmq --hostname=rabbitmqhostone -p 5672:5672 -p 15672:15672 --restart=always rabbitmq:3-management

如果创建时未指定 –restart=always ,可通过update 命令设置

1
docker update --restart=always rabbitmq

还可以在使用on-failure策略时,指定Docker将尝试重新启动容器的最大次数。默认情况下,Docker将尝试永远重新启动容器。

1
docker update --restart=on-failure:10 rabbitmq

就可以通过http://ip:15672访问管理页面

默认创建的用户guest,密码也是guest。

登录后直接添加新用户,之后用新用户登录,删除guest用户。

注意

docker环境中配置rabbitmq
rabbitmq的数据库名称规则是,NODENAME@hostname,Docker每次从docker image启动容器的时候会自动生成hostname,这样一来,你保存在主机上的数据库就会没用了,包括之前创建的用户也会没有了。

所以在创建容器的时候必须指定--hostname=rabbitmqhostone,这样docker环境启动后rabbitmq就会一直读取固定目录中的数据了

使用方式可参见:RabbitMQ实战代码 | 码客 (psvmc.cn)

主机安装方式

安装

RabbitMQ和erlang的版本对应关系:RabbitMQ Erlang Version Requirements — RabbitMQ

卸载旧版本

1
2
3
yum remove -y rabbitmq-server
yum remove erlang-erts-R16B-03.18.el7.x86_64
yum remove -y erlang

先安装erlang

1
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash

yum 安装 erlang

1
yum -y install erlang

验证是否成功

1
erl -v

完成后安装RabbitMQ

下载RabbitMQ public signing key

1
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc

下载RabbitMQ的rpm包

1
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.17/rabbitmq-server-3.8.17-1.el7.noarch.rpm

yum安装下载的RabbitMQ的rpm包

1
yum -y install rabbitmq-server-3.8.17-1.el7.noarch.rpm

设置开机自动启动

1
chkconfig rabbitmq-server on

完成后启动服务:

1
service rabbitmq-server restart

查看版本

1
sudo rabbitmqctl status | grep rabbit

可以查看服务状态:

1
service rabbitmq-server status

找到其中类似一下的一行

1
Logs: /var/log/rabbitmq/rabbit@izhp3fm4qmc7vnoeegv7zyz.log

打开对应的文件

1
vi /var/log/rabbitmq/rabbit@izhp3fm4qmc7vnoeegv7zyz.log

里面有这样的一行

1
config file(s) : /etc/rabbitmq/rabbitmq.config (not found)

配置文件未找到 那我们新建配置文件

1
2
cd /etc/rabbitmq/
vi rabbitmq.config

编辑内容如下:

1
[{rabbit, [{loopback_users, []}]}].

这里的意思是开放使用

默认创建的用户guest,密码也是guest。

该用户不能用于远程登录,可用于管理UI的登录。

保存配置后重启服务:

1
2
service rabbitmq-server stop
service rabbitmq-server start

开放5672端口:

1
2
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --reload

开机自启动

1
chkconfig rabbitmq-server on

查看

1
2
3
chkconfig --list
# 或者
systemctl list-units --type=service

添加用户

图形化管理

开启管理UI:

1
2
3
rabbitmq-plugins enable rabbitmq_management
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload

就可以通过http://ip:15672访问管理页面

命令行管理

/etc/rabbitmq/rabbitmq.config配置文件下(如果不存在就自行创建)添加

1
2
3
[
{rabbit,[{tcp_listeners,[5672]},{loopback_users,["admin"]}]}
]

添加用户

1
rabbitmqctl add_user admin admin

授权

1
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

设置用户角色

1
rabbitmqctl set_user_tags admin administrator

查看新添加的admin

1
rabbitmqctl list_users

查看用于的权限

1
rabbitmqctl list_permissions -p /

打开地址:http://ip:15672,使用admin/admin即可登录

RabbitMQ集群

集群配置和启动

如果是在一台机器上同时启动多个 RabbitMQ 节点来组建集群的话,只用上面介绍的方式启动第二、第三个节点将会因为节点名称和端口冲突导致启动失败。

所以在每次调用 rabbitmq-server 命令前,设置环境变量 RABBITMQ_NODENAMERABBITMQ_NODE_PORT 来明确指定唯一的节点名称和端口。

下面的例子端口号从5672开始,每个新启动的节点都加1,节点也分别命名为test_rabbit_1、test_rabbit_2、test_rabbit_3。

启动第1个节点:

1
RABBITMQ_NODENAME=test_rabbit_1 RABBITMQ_NODE_PORT=5672 /usr/sbin/rabbitmq-server -detached

启动第2个节点:

1
RABBITMQ_NODENAME=test_rabbit_2 RABBITMQ_NODE_PORT=5673 /usr/sbin/rabbitmq-server -detached

启动第2个节点前建议将 RabbitMQ 默认激活的插件关掉,否则会存在使用了某个插件的端口号冲突,导致节点启动不成功。

现在第2个节点和第1个节点都是独立节点,它们并不知道其他节点的存在。集群中除第一个节点外后加入的节点需要获取集群中的元数据,所以要先停止 Erlang 节点上运行的 RabbitMQ 应用程序,并重置该节点元数据,再加入并且获取集群的元数据,最后重新启动 RabbitMQ 应用程序。

停止第2个节点的应用程序:

1
/usr/sbin/rabbitmqctl -n test_rabbit_2 stop_app

重置第2个节点元数据:

1
/usr/sbin/rabbitmqctl -n test_rabbit_2 reset

第2节点加入第1个节点组成的集群:

1
/usr/sbin/rabbitmqctl -n test_rabbit_2 join_cluster test_rabbit_1@localhost

启动第2个节点的应用程序

1
/usr/sbin/rabbitmqctl -n test_rabbit_2 start_app

第3个节点的配置过程和第2个节点类似:

1
2
3
4
5
6
RABBITMQ_NODENAME=test_rabbit_3 RABBITMQ_NODE_PORT=5674 /usr/sbin/rabbitmq-server -detached

/usr/sbin/rabbitmqctl -n test_rabbit_3 stop_app
/usr/sbin/rabbitmqctl -n test_rabbit_3 reset
/usr/sbin/rabbitmqctl -n test_rabbit_3 join_cluster test_rabbit_1@localhost
/usr/sbin/rabbitmqctl -n test_rabbit_3 start_app

集群运维

停止某个指定的节点,比如停止第2个节点:

1
RABBITMQ_NODENAME=test_rabbit_2 /usr/sbin/rabbitmqctl stop

查看节点3的集群状态:

1
/usr/sbin/rabbitmqctl -n test_rabbit_3 cluster_status

管理页面

Overview

Totals

image-20211109215648621

所有队列的阻塞情况

  • Ready:待消费的消息总数。
  • Unacked:待应答的消息总数。
  • Total:总数 Ready+Unacked。

所有队列的消费情况

速率=(num1-num0)/(s1-s0) num1:s1时刻的个数。num0:s0时刻的个数。

  • Publish:producter pub消息的速率。
  • Publisher confirm:broker确认pub消息的速率。
  • Deliver(manual ack):customer手动确认的速率。
  • Deliver( auto ack):customer自动确认的速率。
  • Consumer ack:customer正在确认的速率。
  • Redelivered:正在传递’redelivered’标志集的消息的速率。
  • Get (manual ack):响应basic.get而要求确认的消息的传输速率。
  • Get (auto ack):响应于basic.get而发送不需要确认的消息的速率。
  • Return:将basic.return发送给producter的速率。
  • Disk read:queue从磁盘读取消息的速率。
  • Disk write:queue从磁盘写入消息的速率。

整体数量

  • Connections:client的tcp连接的总数。
  • Channels:通道的总数。
  • Exchange:交换器的总数。
  • Queues:队列的总数。
  • Consumers:消费者的总数。

Nodes

启动一个broker都会产生一个node。

image-20211109215728007

broker的属性

  • Name:broker名称
  • File descriptors:broker打开的文件描述符和限制。
  • Socket descriptors:broker管理的网络套接字数量和限制。当限制被耗尽时,RabbitMQ将停止接受新的网络连接。
  • Erlang processes:erlang启动的进程数。
  • Memory:当前broker占用的内存。
  • Disk space:当前broker占用的硬盘。
  • Uptime:当前broker持续运行的时长。
  • Info:未知。
  • Reset stats:未知。

Ports and contexts

image-20211109215803407

Export definitions

定义由用户,虚拟主机,权限,参数,交换,队列和绑定组成。 它们不包括队列的内容或集群名称。 独占队列不会被导出。

Export definitions

导入的定义将与当前定义合并。 如果在导入过程中发生错误,则所做的任何更改都不会回滚。

Connections

当前所有客户端活动的连接。包括生成者和消费者。

image-20211109215845299

连接的属性

  • Name:名称。
  • User name:使用的用户名。
  • State:当前的状态,running:运行中;idle:空闲。
  • SSL/TLS:是否使用ssl进行连接。
  • Protocol:使用的协议。
  • Channels:创建的channel的总数。
  • From client:每秒发出的数据包。
  • To client:每秒收到的数据包。

Channels

当前连接所有创建的通道。

image-20211109215954879

通道的属性

  • Channel:名称。
  • User name:使用的用户名。
  • Mode:渠道保证模式。 可以是以下之一,或者不是:C: confirm。T:transactional(事务)。
  • State :当前的状态,running:运行中;idle:空闲。
  • Unconfirmed:待confirm的消息总数。
  • Prefetch:设置的prefetch的个数。
  • Unacker:待ack的消息总数。
  • publish:producter pub消息的速率。
  • confirm:producter confirm消息的速率。
  • deliver/get:consumer 获取消息的速率。
  • ack:consumer ack消息的速率。

Exchanges

image-20211109220034962

交换器属性

  • Name:名称。
  • Type:exchange type。
  • Features:功能。 可以是以下之一,或者不是:D: 持久化。T:Internal,存在改功能表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定,否则可以推送消息也可以绑定。
  • Message rate in:消息进入的速率。
  • Message rate out:消息出去的速率。

Queues

image-20211109214727470

相关属性

  • Name:名称。
  • Features:功能。 可以是以下之一,或者不是:D: 持久化。
  • State:当前的状态,running:运行中;idle:空闲。
  • Ready:待消费的消息总数。
  • Unacked:待应答的消息总数。
  • Total:总数 Ready+Unacked。
  • incoming:消息进入的速率。
  • deliver/get:消息获取的速率。
  • ack:消息应答的速率。

Admin

image-20211109220205838

用户属性

  • Name:名称。
  • Tags:角色标签,只能选取一个。
  • Can access virtual hosts:允许进入的vhost。
  • Has password:设置了密码。

角色

  • administrator (超级管理员)
    可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
  • monitoring(监控者)
    可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
  • policymaker(策略制定者)
    可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。
  • management(普通管理者)
    仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
  • none(其他)
    无法登陆管理控制台,通常就是普通的生产者和消费者。