RabbitMQ在CentOS上的最佳实践
erl -version验证版本。curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash添加仓库,再执行sudo yum install -y rabbitmq-server安装。sudo systemctl start rabbitmq-server、sudo systemctl enable rabbitmq-server。通过sudo systemctl status rabbitmq-server验证服务状态。sudo rabbitmq-plugins enable rabbitmq_management。默认通过http://服务器IP:15672访问,初始用户guest(仅限本地登录)。guest用户(仅限本地访问),创建新用户并分配管理员角色:rabbitmqctl add_user admin your_password
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
sudo firewall-cmd --permanent --add-port=5672/tcp
sudo firewall-cmd --permanent --add-port=15672/tcp
sudo firewall-cmd --reload
```。
/etc/security/limits.conf,添加:* soft nofile 65535
* hard nofile 65535
同时修改/etc/systemd/system/rabbitmq-server.service.d/override.conf,添加:[Service]
LimitNOFILE=65535
重启服务生效。/etc/rabbitmq/rabbitmq.conf中设置内存阈值(如使用内存的40%)和磁盘空间限制(如剩余1GB时停止接收消息):vm_memory_high_watermark.relative = 0.4
disk_free_limit.absolute = 1GB
net_ticktime)和最大连接数(max_connections),提升网络吞吐量:net_ticktime = 60
tcp_listen_options.backlog = 4096
vm_memory_high_watermark = 0.6
这些参数可根据服务器资源(CPU、内存、磁盘)调整。.erlang.cookie文件(位于/var/lib/rabbitmq/.erlang.cookie)内容一致(各节点复制该文件并设置权限chmod 400 /var/lib/rabbitmq/.erlang.cookie)。启动节点后,将节点加入集群:rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@node1 # node1为集群中已有节点的主机名
rabbitmqctl start_app
rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
此策略会将ha.前缀的队列镜像到2个节点,自动同步数据。rabbitmq_prometheus插件(sudo rabbitmq-plugins enable rabbitmq_prometheus),通过Grafana导入RabbitMQ仪表盘(如官方提供的“RabbitMQ Overview”),监控队列长度、消息速率、内存使用等指标。sudo rabbitmqctl list_queues)、清空队列(sudo rabbitmqctl purge_queue queue_name)、导出/导入定义(sudo rabbitmqctl export_definitions /path/to/file.json、sudo rabbitmqctl import_definitions /path/to/file.json)。delivery_mode=2(持久化),声明队列时设置durable=true(持久化队列),确保消息不因服务器重启丢失:# Python示例(pika库)
channel.queue_declare(queue='my_queue', durable=True)
channel.basic_publish(
exchange='',
routing_key='my_queue',
body='Hello World!',
properties=pika.BasicProperties(delivery_mode=2)
)
channel.confirm_delivery()
try:
channel.basic_publish(...)
print("Message confirmed")
except pika.exceptions.UnroutableError:
print("Message not routed")
def callback(ch, method, properties, body):
print("Received:", body)
ch.basic_ack(delivery_tag=method.delivery_tag) # 手动确认
channel.basic_consume(queue='my_queue', on_message_callback=callback)
channel.start_consuming()
```。