Rocky Linux 安装 RabbitMQ

一、概要

1. 环境

(1) Rocky Linux 9.1

(2) Rabbit MQ 3.11.16

2. 安装方式

针对RHEL系统,Rabbit MQ官方介绍了两种安装方式:

(1) 通过Yum repositories安装,需要配置Yum repositories文件并设置Rabbit MQ镜像地址。这是官方强烈推荐的安装方式,也是本文选择的安装方式;

(2) 下载RPM包,手动安装Rabbit MQ及其依赖;

Rabbit MQ的RPM包的下载地址为:

https://github.com/rabbitmq/rabbitmq-server/releases

需要解决的依赖可参考:

https://www.rabbitmq.com/install-rpm.html#package-dependencies

二、安装与配置

1. 安装Signing Keys(签名密钥)

签名密钥用于校验软件包的签名,确保软件包的合法性。

## primary RabbitMQ signing key
sudo rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc

## modern Erlang repository
sudo rpm --import 'https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/gpg.E495BB49CC4BBE5B.key'

## RabbitMQ server repository
sudo rpm --import 'https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/gpg.9F4587F226208342.key'

2. 仓库文件

(1) 创建仓库文件

sudo vi /etc/yum.repos.d/rabbitmq.repo

(2) 初始化

# In /etc/yum.repos.d/rabbitmq.repo

##
## Zero dependency Erlang RPM
##

[modern-erlang]
name=modern-erlang-el9
# uses a Cloudsmith mirror @ yum1.novemberain.com.
# Unlike Cloudsmith, it does not have traffic quotas
baseurl=https://yum1.novemberain.com/erlang/el/9/$basearch
repo_gpgcheck=1
enabled=1
gpgkey=https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/gpg.E495BB49CC4BBE5B.key
gpgcheck=1
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
pkg_gpgcheck=1
autorefresh=1
type=rpm-md

[modern-erlang-noarch]
name=modern-erlang-el9-noarch
# uses a Cloudsmith mirror @ yum1.novemberain.com.
# Unlike Cloudsmith, it does not have traffic quotas
baseurl=https://yum1.novemberain.com/erlang/el/9/noarch
repo_gpgcheck=1
enabled=1
gpgkey=https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/gpg.E495BB49CC4BBE5B.key
       https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
gpgcheck=1
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
pkg_gpgcheck=1
autorefresh=1
type=rpm-md

[modern-erlang-source]
name=modern-erlang-el9-source
# uses a Cloudsmith mirror @ yum1.novemberain.com.
# Unlike Cloudsmith, it does not have traffic quotas
baseurl=https://yum1.novemberain.com/erlang/el/9/SRPMS
repo_gpgcheck=1
enabled=1
gpgkey=https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/gpg.E495BB49CC4BBE5B.key
       https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
gpgcheck=1
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
pkg_gpgcheck=1
autorefresh=1


##
## RabbitMQ Server
##

[rabbitmq-el9]
name=rabbitmq-el9
baseurl=https://yum1.novemberain.com/rabbitmq/el/9/$basearch
repo_gpgcheck=1
enabled=1
# Cloudsmith's repository key and RabbitMQ package signing key
gpgkey=https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/gpg.9F4587F226208342.key
       https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
gpgcheck=1
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
pkg_gpgcheck=1
autorefresh=1
type=rpm-md

[rabbitmq-el9-noarch]
name=rabbitmq-el9-noarch
baseurl=https://yum1.novemberain.com/rabbitmq/el/9/noarch
repo_gpgcheck=1
enabled=1
# Cloudsmith's repository key and RabbitMQ package signing key
gpgkey=https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/gpg.9F4587F226208342.key
       https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
gpgcheck=1
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
pkg_gpgcheck=1
autorefresh=1
type=rpm-md

[rabbitmq-el9-source]
name=rabbitmq-el9-source
baseurl=https://yum1.novemberain.com/rabbitmq/el/9/SRPMS
repo_gpgcheck=1
enabled=1
gpgkey=https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/gpg.9F4587F226208342.key
gpgcheck=0
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
pkg_gpgcheck=1
autorefresh=1
type=rpm-md

(3) 更新

sudo dnf update -y

3. 安装

(1) 安装依赖

sudo dnf install socat logrotate -y
sudo dnf install erlang-25.3.2 -y

(2) 校验Erlang

erl

(3) 安装Rabbit MQ

sudo dnf install -y rabbitmq-server

(4) 校验

sudo rabbitmqctl version

(5) 启动

sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
systemctl status rabbitmq-server

(6) 目录

默认情况下,安装之后Rabbit MQ的值如下:

a. 节点名称(node): rabbit@<hostname>

b. 安装目录(home dir): /var/lib/rabbitmq

c. 配置文件(config files): /etc/rabbitmq/rabbitmq.conf, /etc/rabbitmq/advanced.config

4. 管理员页面

(1) 开启管理员页面插件

sudo rabbitmq-plugins enable rabbitmq_management

(2) 重启

sudo systemctl restart rabbitmq-server

(3) 防火墙

sudo firewall-cmd --permanent --add-port=15672/tcp
sudo firewall-cmd --reload

(4) 添加管理员

Rabbit MQ自带一个guest用户,但仅能通过localhost进行访问。

a. 添加管理员并设置密码

sudo rabbitmqctl add_user admin

b. 对管理员赋权

sudo rabbitmqctl set_user_tags admin administrator

c. 校验,列出所有的用户

sudo rabbitmqctl list_users

d. 对admin分配vhost权限:

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

(5) 访问

http://<IP Address>:15672/

三、最佳实践

Rabbit MQ官方收集了若干最佳实践的博客和视频在https://www.rabbitmq.com/best-practices.html,这些最佳实践大致可以分为两大类,一类是配置层面的改进,另一类是使用方面的方法论。本文节选部分内容罗列:

1. Rabbit MQ配置

(1) 自动删除无用的队列

可通过以下方法实现:

a. 设置TTL policy;

b. 设置队列的自动过期时间,当最后一个消费者离线之后,经过“自动过期时间”该队列就会被删除;

2. 如何使用Rabbit MQ

(1) 尽可能维持短队列

为了在运行过程中释放内存,Rabbit会将RAM中的数据刷入磁盘(Page out),执行Page out需要时间并且无法处理消息,所以如果单个消息的size很大则会影响Rabbit MQ的性能和吞吐率。

如果必须要通过MQ传递大消息,则应先将body进行压缩,然后再将消息推入MQ;

(2) 使用懒队列模式(lazy queue)

懒队列会将消息尽可能早的异动到磁盘中,当消费者需要消费数据时再把消息从磁盘加载到内存中。

懒队列出现的目的是为了应对长队列(比如包含数百万消息的队列)的出现。

参考: https://www.rabbitmq.com/lazy-queues.html

(3) 队列长度限制

设置max-length以控制队列的最长长度,超过之后数据将会被丢入死信队列;

设置max-length-bytes以控制队列容纳的最大数量量,超过之后数据将会被丢入死信队列;

Rabbit MQ官方建议使用Policy来设置以上配置。

参考:https://www.rabbitmq.com/maxlength.html

(4) 链接(connection)和通道(channel)

每个TCP链接会占用大约100KB的内存,如果开启了TLS会更多。Rabbit MQ强烈建议遵守以下规则:

a. 每个进程使用一个TCP链接,该链接应该长期保持;

b. 每个线程使用不同的通道,不同线程之间不要共享通道;

c. 不重复开关TCP链接或通道;

d. 生产者和消费不共用一个TCP链接;

(5) 消息丢失

a. 生产者需要开启发布确认,直到MQ服务端确认收到消息才能继续下一个消息的生产;

b. 消费者需要开启消费确认,对于重要的消息需要开启手动确认,直到处理完毕才可以将消息ack。

(6) 数据持久化

a. 服务端应对消息丢失需要配置Message,Exchange,Queue的durable属性并在生产者端将delivery mode设置为persistent,否则broker重启之后未被消费的消息将会丢失。

该方案会将MQ中的消息存储至磁盘中,这样做带来的问题是会影响Rabbit MQ的性能,降低其吞吐率。

b. 另一个方案是考虑在数据库层通过修改状态值来保证数据的完整性,通过CronJob定时轮训状态未达标的数据,重新生产并消费此类数据,而MQ则可以关闭持久化相关的配置。

该方案需要引入额外的代码实现,但可以提高Rabbit MQ的性能,增加其吞吐率。

(7) 消费者Prefetch value

在手动ack模式下,Prefetch value控制消费者一次接受到的最大消息数量,默认值为0(无限制),在数据量巨大的时候这可能会导致消费者端崩溃。设置Prefetch value可以遵循以下原则:

a. 如果单个消息处理时间较长且有多个消费者实例,则应该将该值设置为1,这样每个消费者都会得到消息投递;

b. 如果单个消息处理时间较短,或者消费者实例较少,则应该将该值设置的稍微大一些,具体数值可分情况而定,比如:

单个消息处理时间为5ms但是单次delivery时间为60ms,单个ack时间也是60ms,这样处理一条消息需要125ms,处理12条数据需要1500ms,平均速度为125ms/message。如果设置Prefetch value=12,则处理12条数据需要120+12*5=180ms,平均速率为15ms/message。

注意Prefetch value设置在自动确认模式下无效。

参考:https://www.rabbitmq.com/consumer-prefetch.html

3. 高可用&高性能

(1) 对于集群应用,使用Quorum队列代替原有的镜像队列,Rabbit MQ官方已经确认镜像队列集群会在未来的版本中移除;

参考: https://www.cloudamqp.com/blog/reasons-you-should-switch-to-quorum-queues.html

(2) 使用插件将队列分配到不同节点以提高性能

a. 一致性哈希交换插件(Consistent hash exchange plugin)

参考:https://github.com/rabbitmq/rabbitmq-consistent-hash-exchange

b. 分片交换插件(RabbitMQ sharding)

参考:https://github.com/rabbitmq/rabbitmq-sharding

四、参考

1. 官方

https://www.rabbitmq.com/install-rpm.html

2. 其他

https://techviewleo.com/install-configure-rabbitmq-server-on-rocky/

https://www.atlantic.net/dedicated-server-hosting/how-to-install-and-configure-rabbitmq-server-on-rocky-linux-8/

posted @ 2023-05-28 17:17  白马黑衣  阅读(1254)  评论(0)    收藏  举报