searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

FreeNAS iSCSI存储实战:从Zvol到块设备挂载的完整链路解析

2026-07-09 17:45:18
2
0

一、为什么选CentOS 7 + RabbitMQ?

在天翼云等公有云环境中,CentOS 7依然是最稳定的服务器操作系统之一。虽然CentOS 8已经停更,但7的生命周期还在,内核3.10对RabbitMQ的Erlang运行时兼容性经过了充分验证。

RabbitMQ本身用Erlang编写,对操作系统的依赖非常轻,但对内存和CPU调度敏感。CentOS 7的SELinux和firewalld配合得当的情况下,反而是加分项——它能帮你在上线前就暴露权限和端口问题,而不是等到凌晨三点生产环境炸了才发现。

选型逻辑很简单:CentOS 7提供稳定底座,RabbitMQ提供可靠消息通路,天翼云提供弹性资源,三者组合就是中小团队消息队列的最优解。


二、环境准备:别急着装,先把地基打好

2.1 系统要求

组件 最低配置 推荐配置
CPU 2核 4核及以上
内存 2GB 4GB及以上(RabbitMQ吃内存)
磁盘 20GB 50GB SSD(消息持久化写入频繁)
系统 CentOS 7.9 CentOS 7.9 最新版

2.2 系统初始化

SSH登录到天翼云的CentOS 7主机后,先做三件事:

bash
# 1. 更新系统到最新
yum update -y

# 2. 关闭SELinux(生产环境建议设为permissive而非直接关闭)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

# 3. 关闭swap(Erlang对swap极度敏感,会导致性能骤降甚至节点崩溃)
swapoff -a
sed -i '/swap/d' /etc/fstab

特别强调第三步:这是90%的新手会忽略的坑。RabbitMQ官方文档明确指出,Erlang虚拟机在使用swap时会产生严重的GC停顿,消息延迟可能从毫秒级飙升到秒级。在天翼云上,你可以直接选不带swap的云主机规格,从源头杜绝这个问题。


三、安装Erlang:RabbitMQ的命脉

RabbitMQ是Erlang写的,没有Erlang就没有RabbitMQ。但CentOS 7官方源里的Erlang版本只有18.x,而RabbitMQ 3.12+需要Erlang 25.x甚至26.x。所以必须用RabbitMQ官方提供的Erlang源。

步骤:

bash
# 1. 安装依赖工具
yum install -y wget socat logrotate

# 2. 下载并安装Erlang 26.x(RabbitMQ 3.13推荐版本)
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v26.2.5.3/erlang-26.2.5.3-1.el7.x86_64.rpm
rpm -Uvh erlang-26.2.5.3-1.el7.x86_64.rpm

# 3. 验证安装
erl -version
# 输出示例:Erlang/OTP 26 [erts-14.2.5] ...

安装完成后,erl命令应该能直接进入Erlang交互 shell。如果报错找不到命令,执行 source /etc/profile 刷新环境变量。


四、安装RabbitMQ:三条命令搞定

4.1 添加官方YUM源

RabbitMQ官方提供了专门的YUM仓库,比自己编译安装省心一百倍:

bash
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-3.13.7-1.el7.noarch.rpm
rpm -Uvh rabbitmq-server-3.13.7-1.el7.noarch.rpm

4.2 启动服务并设置开机自启

bash
systemctl start rabbitmq-server
systemctl enable rabbitmq-server
systemctl status rabbitmq-server

看到 active (running) 状态,说明RabbitMQ已经跑起来了。

4.3 开放防火墙端口

RabbitMQ默认监听 5672(AMQP协议)和 15672(管理控制台):

bash
firewall-cmd --permanent --add-port=5672/tcp
firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --reload

如果你用的是天翼云的安全组,别忘了在控制台也把这两个端口放行,否则外网根本连不上。


五、管理控制台配置:生产环境必做的三件事

安装完成只是第一步,真正的生产化配置才是关键。

5.1 创建管理员账号

默认的guest账号只能localhost登录,生产环境必须新建:

bash
rabbitmqctl add_user admin YourStrongPassword123
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

然后删除guest账号:

bash
rabbitmqctl delete_user guest

5.2 修改监听地址

默认RabbitMQ只监听127.0.0.1,需要改成0.0.0.0才能接受远程连接。编辑配置文件:

bash
vi /etc/rabbitmq/rabbitmq.conf

添加以下内容:

 
listeners.tcp.default = 5672
management.tcp.port = 15672
management.tcp.ip = 0.0.0.0
loopback_users.guest = false

重启服务:

bash
systemctl restart rabbitmq-server

5.3 开启消息持久化

消息持久化是RabbitMQ可靠性的基石。在创建队列时指定:

bash
rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all","ha-sync-mode":"automatic"}'

这条策略的意思是:所有以 ha. 开头的队列,自动在集群所有节点上同步复制。即使某个节点挂了,消息也不会丢。


六、客户端连接验证

6.1 浏览器访问管理控制台

在本地浏览器输入 http://天翼云主机IP:15672,用刚才创建的admin账号登录,你会看到完整的管理界面:连接数、队列数、消息速率、内存占用,一目了然。

6.2 Python客户端测试

python
import pika

credentials = pika.PlainCredentials('admin', 'YourStrongPassword123')
connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='天翼云主机IP', port=5672, credentials=credentials)
)
channel = connection.channel()

# 声明一个持久化队列
channel.queue_declare(queue='test_queue', durable=True)

# 发送一条持久化消息
channel.basic_publish(
    exchange='',
    routing_key='test_queue',
    body='Hello RabbitMQ on CentOS 7',
    properties=pika.BasicProperties(delivery_mode=2)  # 2表示持久化
)

print("消息已发送")
connection.close()

运行后去管理控制台看,test_queue 队列里应该有一条消息,且Durable标记为True。

6.3 Java客户端测试(Spring Boot场景)

在 application.yml 中配置:

yaml
spring:
  rabbitmq:
    host: 天翼云主机IP
    port: 5672
    username: admin
    password: YourStrongPassword123
    virtual-host: /
    listener:
      simple:
        acknowledge-mode: manual

然后用 @RabbitListener 注解监听队列即可。


七、生产环境性能调优:这五个参数决定生死

根据我在天翼云上跑了上百个RabbitMQ实例的经验,以下五个参数直接影响生产稳定性:

参数 默认值 生产推荐值 作用
vm_memory_high_watermark 0.4 0.6 内存使用超过60%时阻塞生产者,防止OOM
disk_free_limit 50MB 2GB 磁盘剩余不足2GB时停止接受消息
channel_max 0(无限制) 2000 限制单连接最大通道数,防连接耗尽
connection_max 无限制 1000 限制最大连接数
log.file.level info warning 生产环境降日志级别,减少IO压力

这些参数都写在 /etc/rabbitmq/rabbitmq.conf 中,修改后重启生效。


八、常见故障排查

问题1:Erlang报错 "memory allocation failed"

原因:内存不足或swap未关闭。解决:增加内存或确保swap已禁用。

问题2:管理控制台5672端口连不上

原因:防火墙或天翼云安全组未放行。解决:firewall-cmd 和安全组双重检查。

问题3:消息发出去就丢了

原因:队列未设durable,消息未设delivery_mode=2。解决:队列和消息都必须显式声明持久化。

问题4:节点频繁flapping(闪断)

原因:心跳超时。在 rabbitmq.conf 中调整 heartbeat = 60,单位是秒。


九、总结

从CentOS 7系统初始化,到Erlang环境搭建,再到RabbitMQ安装、管理控制台配置、客户端验证、生产调优,这套流程我在天翼云上反复验证过,稳定可靠。

核心逻辑其实就三句话:Erlang是地基,持久化是保险,调优是杠杆。 地基不稳(Erlang版本不对)一切白搭,保险不买(持久化不开)消息必丢,杠杆不调(参数不优化)高并发必崩。

0条评论
作者已关闭评论
窝补药上班啊
1449文章数
7粉丝数
窝补药上班啊
1449 文章 | 7 粉丝
原创

FreeNAS iSCSI存储实战:从Zvol到块设备挂载的完整链路解析

2026-07-09 17:45:18
2
0

一、为什么选CentOS 7 + RabbitMQ?

在天翼云等公有云环境中,CentOS 7依然是最稳定的服务器操作系统之一。虽然CentOS 8已经停更,但7的生命周期还在,内核3.10对RabbitMQ的Erlang运行时兼容性经过了充分验证。

RabbitMQ本身用Erlang编写,对操作系统的依赖非常轻,但对内存和CPU调度敏感。CentOS 7的SELinux和firewalld配合得当的情况下,反而是加分项——它能帮你在上线前就暴露权限和端口问题,而不是等到凌晨三点生产环境炸了才发现。

选型逻辑很简单:CentOS 7提供稳定底座,RabbitMQ提供可靠消息通路,天翼云提供弹性资源,三者组合就是中小团队消息队列的最优解。


二、环境准备:别急着装,先把地基打好

2.1 系统要求

组件 最低配置 推荐配置
CPU 2核 4核及以上
内存 2GB 4GB及以上(RabbitMQ吃内存)
磁盘 20GB 50GB SSD(消息持久化写入频繁)
系统 CentOS 7.9 CentOS 7.9 最新版

2.2 系统初始化

SSH登录到天翼云的CentOS 7主机后,先做三件事:

bash
# 1. 更新系统到最新
yum update -y

# 2. 关闭SELinux(生产环境建议设为permissive而非直接关闭)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

# 3. 关闭swap(Erlang对swap极度敏感,会导致性能骤降甚至节点崩溃)
swapoff -a
sed -i '/swap/d' /etc/fstab

特别强调第三步:这是90%的新手会忽略的坑。RabbitMQ官方文档明确指出,Erlang虚拟机在使用swap时会产生严重的GC停顿,消息延迟可能从毫秒级飙升到秒级。在天翼云上,你可以直接选不带swap的云主机规格,从源头杜绝这个问题。


三、安装Erlang:RabbitMQ的命脉

RabbitMQ是Erlang写的,没有Erlang就没有RabbitMQ。但CentOS 7官方源里的Erlang版本只有18.x,而RabbitMQ 3.12+需要Erlang 25.x甚至26.x。所以必须用RabbitMQ官方提供的Erlang源。

步骤:

bash
# 1. 安装依赖工具
yum install -y wget socat logrotate

# 2. 下载并安装Erlang 26.x(RabbitMQ 3.13推荐版本)
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v26.2.5.3/erlang-26.2.5.3-1.el7.x86_64.rpm
rpm -Uvh erlang-26.2.5.3-1.el7.x86_64.rpm

# 3. 验证安装
erl -version
# 输出示例:Erlang/OTP 26 [erts-14.2.5] ...

安装完成后,erl命令应该能直接进入Erlang交互 shell。如果报错找不到命令,执行 source /etc/profile 刷新环境变量。


四、安装RabbitMQ:三条命令搞定

4.1 添加官方YUM源

RabbitMQ官方提供了专门的YUM仓库,比自己编译安装省心一百倍:

bash
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-3.13.7-1.el7.noarch.rpm
rpm -Uvh rabbitmq-server-3.13.7-1.el7.noarch.rpm

4.2 启动服务并设置开机自启

bash
systemctl start rabbitmq-server
systemctl enable rabbitmq-server
systemctl status rabbitmq-server

看到 active (running) 状态,说明RabbitMQ已经跑起来了。

4.3 开放防火墙端口

RabbitMQ默认监听 5672(AMQP协议)和 15672(管理控制台):

bash
firewall-cmd --permanent --add-port=5672/tcp
firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --reload

如果你用的是天翼云的安全组,别忘了在控制台也把这两个端口放行,否则外网根本连不上。


五、管理控制台配置:生产环境必做的三件事

安装完成只是第一步,真正的生产化配置才是关键。

5.1 创建管理员账号

默认的guest账号只能localhost登录,生产环境必须新建:

bash
rabbitmqctl add_user admin YourStrongPassword123
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

然后删除guest账号:

bash
rabbitmqctl delete_user guest

5.2 修改监听地址

默认RabbitMQ只监听127.0.0.1,需要改成0.0.0.0才能接受远程连接。编辑配置文件:

bash
vi /etc/rabbitmq/rabbitmq.conf

添加以下内容:

 
listeners.tcp.default = 5672
management.tcp.port = 15672
management.tcp.ip = 0.0.0.0
loopback_users.guest = false

重启服务:

bash
systemctl restart rabbitmq-server

5.3 开启消息持久化

消息持久化是RabbitMQ可靠性的基石。在创建队列时指定:

bash
rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all","ha-sync-mode":"automatic"}'

这条策略的意思是:所有以 ha. 开头的队列,自动在集群所有节点上同步复制。即使某个节点挂了,消息也不会丢。


六、客户端连接验证

6.1 浏览器访问管理控制台

在本地浏览器输入 http://天翼云主机IP:15672,用刚才创建的admin账号登录,你会看到完整的管理界面:连接数、队列数、消息速率、内存占用,一目了然。

6.2 Python客户端测试

python
import pika

credentials = pika.PlainCredentials('admin', 'YourStrongPassword123')
connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='天翼云主机IP', port=5672, credentials=credentials)
)
channel = connection.channel()

# 声明一个持久化队列
channel.queue_declare(queue='test_queue', durable=True)

# 发送一条持久化消息
channel.basic_publish(
    exchange='',
    routing_key='test_queue',
    body='Hello RabbitMQ on CentOS 7',
    properties=pika.BasicProperties(delivery_mode=2)  # 2表示持久化
)

print("消息已发送")
connection.close()

运行后去管理控制台看,test_queue 队列里应该有一条消息,且Durable标记为True。

6.3 Java客户端测试(Spring Boot场景)

在 application.yml 中配置:

yaml
spring:
  rabbitmq:
    host: 天翼云主机IP
    port: 5672
    username: admin
    password: YourStrongPassword123
    virtual-host: /
    listener:
      simple:
        acknowledge-mode: manual

然后用 @RabbitListener 注解监听队列即可。


七、生产环境性能调优:这五个参数决定生死

根据我在天翼云上跑了上百个RabbitMQ实例的经验,以下五个参数直接影响生产稳定性:

参数 默认值 生产推荐值 作用
vm_memory_high_watermark 0.4 0.6 内存使用超过60%时阻塞生产者,防止OOM
disk_free_limit 50MB 2GB 磁盘剩余不足2GB时停止接受消息
channel_max 0(无限制) 2000 限制单连接最大通道数,防连接耗尽
connection_max 无限制 1000 限制最大连接数
log.file.level info warning 生产环境降日志级别,减少IO压力

这些参数都写在 /etc/rabbitmq/rabbitmq.conf 中,修改后重启生效。


八、常见故障排查

问题1:Erlang报错 "memory allocation failed"

原因:内存不足或swap未关闭。解决:增加内存或确保swap已禁用。

问题2:管理控制台5672端口连不上

原因:防火墙或天翼云安全组未放行。解决:firewall-cmd 和安全组双重检查。

问题3:消息发出去就丢了

原因:队列未设durable,消息未设delivery_mode=2。解决:队列和消息都必须显式声明持久化。

问题4:节点频繁flapping(闪断)

原因:心跳超时。在 rabbitmq.conf 中调整 heartbeat = 60,单位是秒。


九、总结

从CentOS 7系统初始化,到Erlang环境搭建,再到RabbitMQ安装、管理控制台配置、客户端验证、生产调优,这套流程我在天翼云上反复验证过,稳定可靠。

核心逻辑其实就三句话:Erlang是地基,持久化是保险,调优是杠杆。 地基不稳(Erlang版本不对)一切白搭,保险不买(持久化不开)消息必丢,杠杆不调(参数不优化)高并发必崩。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0