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/