我遇到过这样的情况:RabbitMQ 使用的总内存为 6.2 GB,其中 6.1 GB 由 Erlang 编写器使用。但是,我在硬盘上找不到这个大小的分页。如果 RabbitMQ 崩溃会发生什么?我会丢失所有数据吗?
请检查以下 rabbitmqctl 状态
{memory,
[{total,6692084888},
{connection_readers,99864},
{connection_writers,25697536},
{connection_channels,95040},
{connection_other,1942280},
{queue_procs,189536},
{queue_slave_procs,0},
{plugins,645288},
{other_proc,14228968},
{mnesia,101896},
{mgmt_db,615664},
{msg_index,14967232},
{other_ets,5246072},
{binary,6598589536},
{code,22475925},
{atom,883633},
{other_system,6306418}]},
{alarms,[memory]},
{listeners,
[{clustering,25672,"::"},
{amqp,5672,"127.0.0.1"},
{'amqp/ssl',5671,"::"},
{'stomp/ssl',61614,"::"}]},
{vm_memory_high_watermark,0.4},
{vm_memory_limit,6687214796},
{disk_free_limit,819462080},
{disk_free,2658975744},
{file_descriptors,
[{total_limit,924},
{total_used,23},
{sockets_limit,829},
{sockets_used,19}]},
{processes,[{limit,1048576},{used,407}]},
{run_queue,0},
{uptime,151129}]
- 当 RabbitMQ 出现故障或崩溃时会发生什么?队列中的消息会丢失吗?或者发生什么情况?
- msg_store_persistent 和 msg_store_transient 有什么区别?
Erlang R16B03(erts-5.10.4)
RabbitMQ 版本 3.4.2
谢谢
答案1
“当 RabbitMQ 出现故障或崩溃时会发生什么?队列中的消息会丢失吗?”
这取决于您告诉 RabbitMQ 的内容。
如果您使用持久队列,并且发布者发送持久消息,则丢失数据的风险很小,因为持久消息一到达持久队列就会写入磁盘。此外,RabbitMQ 还提供“确认”扩展让发布者知道消息何时真正排队,以及何时写入磁盘。
如果您不使用持久队列和持久消息,则当代理重新启动或崩溃时消息将会丢失。
“msg_store_persistent 和 msg_store_transient 之间有什么区别?”
msg_store_persistent
包含持久队列中排队的持久消息。这些消息一进入队列就会写入磁盘。此外,在代理重新启动或崩溃后,它们仍然可用。msg_store_transient
包含已分页到磁盘以释放一些内存的其他消息。此消息存储在 RabbitMQ 启动期间基本上被清空。
关于您看到的内存消耗,自 3.4.2 版以来,RabbitMQ 中已修复了几个内存泄漏问题。如果您在较新版本中仍看到此行为,请详细描述您的工作负载。