10.2. 使用默认文件日志的消息传递日志持久性


JBoss EAP 消息传递附带了高性能、基于文件的日志,针对消息传递进行了优化。

JBoss EAP 消息传递日志具有可配置的文件大小且仅附加,这可通过启用单写操作来提高性能。它由磁盘上的一组文件组成,这些文件最初会预先创建成固定大小并填写 padding。在执行添加消息、删除消息和更新消息等服务器操作时,操作的记录将附加到日志中,直到日志文件已满,此时使用下一个日志文件。

复杂的垃圾收集算法决定了在所有数据都被删除后是否可以回收和重新使用日志文件。紧凑算法从日志文件中删除死空间并压缩数据。

日志还完全支持本地和 XA 事务。

10.2.1. 消息传递日志文件系统实施

大多数日志用 Java 编写,但已提取了与文件系统的交互,以允许不同的可插拔实施。JBoss EAP 消息传递随附两种实施为:

Java 新 I/O(NIO)
此实施使用标准 Java NIO 与文件系统接口。它提供了极其良好的性能,并在具有 Java 6 或更高版本运行时的任何平台上运行。请注意,JBoss EAP 7 需要 Java 8。JBoss EAP 支持的任何操作系统上均支持使用 NIO。
Linux 异步 IO(ASYNCIO)

此实施使用原生代码打包程序与 Linux 异步 IO 库(ASYNCIO)对话。此实施消除了显式同步的需求。ASYNCIO 通常比 Java NIO 提供更好的性能。

要检查使用哪些日志类型,请发出以下 CLI 请求:

/subsystem=messaging-activemq/server=default:read-attribute(name=runtime-journal-type)
Copy to Clipboard Toggle word wrap

系统返回以下值之一:

Expand
表 10.1. 日志类型返回值
返回值描述

NONE

持久性被禁用

NIO

Java NIO 正在使用

ASYNCIO

使用 libaio 的 ASY NCIO

数据库

使用了 JDBC 持久性

使用 libaio 原生时,以下文件系统已经过测试,且仅在 Red Hat Enterprise Linux 6、Red Hat Enterprise Linux 7 和 Red Hat Enterprise Linux 8 中被支持。它们未经测试,在其他操作系统中不受支持。

  • EXT4
  • XFS
  • NFSv4
  • GFS2

下表列出了已经测试的 HA 共享存储文件系统,包括 libaio 原生和未测试的 HA 共享存储文件系统,以及是否被支持。

Expand
操作系统文件系统支持使用 libaio 原生选项?
(journal-type="ASYNCIO")
不支持使用 libaio Natives?
(journal-type="NIO")

Red Hat Enterprise Linux 6

NFSv4

Red Hat Enterprise Linux 7 及更新的版本

NFSv4

Red Hat Enterprise Linux 6

GFS2

Red Hat Enterprise Linux 7 及更新的版本

GFS2

10.2.2. 标准消息日志文件系统实例

标准 JBoss EAP 消息传递核心服务器使用以下日志实例:

绑定日志

此日志用于存储绑定相关的数据,包括服务器上部署的队列集合及其属性。它还存储 id 序列计数器等数据。

绑定日志始终是 NIO 日志,因为它的吞吐量通常低于消息日志。

此日志中的文件前缀为 activemq-bindings。每个文件都有一个绑定扩展名。文件大小为 1048576,位于 bindings 文件夹中。

Jakarta Messaging Journal

此日志实例存储与 Jakarta 消息传递相关的所有数据,如任何 Jakarta 消息传递队列、topics、连接工厂和这些资源的任何 JNDI 绑定。

通过管理 API 创建的任何 Jakarta 消息传递资源都将保留在此日志中。通过配置文件配置的任何资源都不会。只有在使用 Jakarta 消息传递时,才会创建 Jakarta 消息传递日志。

此日志中的文件前缀为 activemq-jms。每个文件都有 a jms 扩展名。文件大小为 1048576,位于 bindings 文件夹中。

消息日志

此日志实例存储与所有消息相关的数据,包括消息本身和重复 ID 缓存。

默认情况下,JBoss EAP 消息传递将尝试使用 ASYNCIO 日志。如果 ASYNCIO 不可用,例如,没有安装正确的内核版本或 ASYNCIO 的 Linux,它将自动回退到使用任何 Java 平台上提供的 Java NIO。

此日志中的文件前缀为 activemq-data。每个文件都有一个 amq 扩展名。文件大小默认为 10485760(可配置),它位于 journal 文件夹中。

对于大型消息,JBoss EAP 消息传递将其保留在消息日志之外。这在有关 大型消息 的章节中讨论。

也可以将 JBoss EAP 消息传递配置为在内存不足的情况下将消息分页到磁盘。Paging 部分中将对此进行探讨

如果根本不需要持久性,JBoss EAP 消息传递也可以配置为完全不持久保留任何数据到存储,如为 Zero Persistence 配置 JBoss EAP 消息传递 一节中所述。

10.2.3. 配置绑定和 Jakarta 消息传递日志

由于绑定日志与 Jakarta 消息传递日志共享其配置,因此您可以使用下面的单一管理 CLI 命令读取这两者的当前配置。也包含 输出以突出显示默认配置。

/subsystem=messaging-activemq/server=default/path=bindings-directory:read-resource

{
    "outcome" => "success",
    "result" => {
        "path" => "activemq/bindings",
        "relative-to" => "jboss.server.data.dir"
    }
}
Copy to Clipboard Toggle word wrap

请注意,默认情况下日志 的路径activemq/bindings。您可以使用以下管理 CLI 命令更改 路径 位置:

/subsystem=messaging-activemq/server=default/path=bindings-directory:write-attribute(name=path,value=PATH_LOCATION)
Copy to Clipboard Toggle word wrap

另请注意上面输出中的 relative-to 属性。使用 relative-to 时,path 属性的值被视为 relative-to 指定的文件路径的相对。默认情况下,此值为 JBoss EAP 属性 jboss.server.data.dir。对于单机服务器,jboss.server.data.dir 位于 EAP_HOME/standalone/data。对于域,每一服务器自己的 serverX/data/activemq 目录位于 EAP_HOME/domain/servers 下。您可以使用以下管理 CLI 命令更改 relative-to 的值:

/subsystem=messaging-activemq/server=default/path=bindings-directory:write-attribute(name=relative-to,value=RELATIVE_LOCATION)
Copy to Clipboard Toggle word wrap

默认情况下,JBoss EAP 配置为自动创建绑定目录(如果不存在)。使用以下管理 CLI 命令切换此行为:

/subsystem=messaging-activemq/server=default:write-attribute(name=create-bindings-dir,value=TRUE/FALSE)
Copy to Clipboard Toggle word wrap

值设true 将启用自动创建目录。将 值设false 将禁用它。

10.2.4. 配置消息日志位置

您可以使用下面的管理 CLI 命令读取消息日志的位置信息。也包含 输出以突出显示默认配置。

/subsystem=messaging-activemq/server=default/path=journal-directory:read-resource
{
    "outcome" => "success",
    "result" => {
        "path" => "activemq/journal",
        "relative-to" => "jboss.server.data.dir"
    }
}
Copy to Clipboard Toggle word wrap

请注意,默认情况下,日志 的路径activemq/journal。您可以使用以下管理 CLI 命令更改 路径 位置:

/subsystem=messaging-activemq/server=default/path=journal-directory:write-attribute(name=path,value=PATH_LOCATION)
Copy to Clipboard Toggle word wrap
注意

为了获得最佳性能,红帽建议日志位于其自身物理卷中,以便最大程度减少磁盘头移动。如果日志位于与其他可能写入其他文件(如绑定日志、数据库或交易协调器)共享的卷上,那么磁盘头在文件写入时可能会快速移动,从而显著降低性能。

另请注意上面输出中的 relative-to 属性。使用 relative-to 时,path 属性的值被视为 relative-to 指定的文件路径的相对。默认情况下,此值为 JBoss EAP 属性 jboss.server.data.dir。对于单机服务器,jboss.server.data.dir 位于 EAP_HOME/standalone/data。对于域,每一服务器自己的 serverX/data/activemq 目录位于 EAP_HOME/domain/servers 下。您可以使用以下管理 CLI 命令更改 relative-to 的值:

/subsystem=messaging-activemq/server=default/path=journal-directory:write-attribute(name=relative-to,value=RELATIVE_LOCATION)
Copy to Clipboard Toggle word wrap

默认情况下,JBoss EAP 配置为自动创建日志目录(如果不存在)。使用以下管理 CLI 命令切换此行为:

/subsystem=messaging-activemq/server=default:write-attribute(name=create-journal-dir,value=TRUE/FALSE)
Copy to Clipboard Toggle word wrap

值设true 将启用自动创建目录。将 值设false 将禁用它。

10.2.5. 配置消息日志属性

下列属性是消息传递服务器的所有子属性。因此,使用管理 CLI 获取和设置值的命令语法分别相同。

要读取给定属性的当前值,其语法如下:

/subsystem=messaging-activemq/server=default:read-attribute(name=ATTRIBUTE_NAME)
Copy to Clipboard Toggle word wrap

编写属性值的语法遵循对应的模式。

/subsystem=messaging-activemq/server=default:write-attribute(name=ATTRIBUTE_NAME,value=NEW_VALUE)
Copy to Clipboard Toggle word wrap
  • create-journal-dir

    如果设置为 true,日志目录将在 journal-directory 中指定的位置(如果尚不存在)自动创建。默认值为 true

  • journal-file-open-timeout

    此属性修改打开日志文件的超时值。默认值为 5 秒。

  • journal-buffer-timeout

    我们不需要刷新每个需要刷新的写入操作,而是维护一个内部缓冲区,而是在缓冲区已满时或超时过期时清空整个缓冲区,以以较快者为准。这可用于 NIO 和 ASYNCIO,允许系统通过许多需要清空的并发写入更好地扩展。

    此参数控制在尚未填充缓冲区时清空缓冲区的超时时间。ASYNCIO 通常可以应对比 NIO 更高的清空率,因此系统在 NIO 和 ASYNCIO 中保持不同的默认值。NIO 的默认值为 3333333 纳秒,每秒为 300 倍。ASYNCIO 的默认值为 500000 纳秒,每秒为 2000 倍。

    注意

    通过增大超时时间,您可以提高系统吞吐量,但会牺牲延迟,选择默认参数以在吞吐量和延迟之间达到合理的平衡。

  • journal-buffer-size

    ASYNCIO 上定时缓冲区的大小(以字节为单位)。journal-buffer-sizejournal-file-size 必须大于 min-large-message-size。否则,消息不会写入日志中。如需更多信息,请参阅配置 大型消息。

  • journal-compact-min-files

    在考虑压缩日志前,最少的文件数量。只有至少有 journal-compact-min-files 才会启动压缩算法。

    将此设置为 0 将禁用完全压缩功能。虽然日志可能会无限增长,但这可能会很危险。明智地使用它!

    此参数的默认值为 10

  • journal-compact-percentage

    开始紧凑的阈值。当将少于这个百分比视为实时数据时,我们开始缩减。另请注意,在 日志中至少有 journal-compact-min-files 数据文件前,压缩不会启动

    此参数的默认值为 30

  • journal-file-size

    各个日志文件的大小,以字节为单位。此默认值为 10485760 字节,即 10MB。journal-file-sizejournal-buffer-size 必须设置为大于 min-large-message-size。否则,消息不会写入日志中。如需更多信息,请参阅配置 大型消息。

  • journal-max-io

    在将写入请求提交到系统以执行之前,写入请求会被排队。此参数控制任意时间上 IO 队列中的最大写入请求数。如果队列已满,则写入将阻止,直到空间被释放。

    系统会保留这个参数的不同默认值,具体取决于它是 NIO 还是 ASYNCIO。NIO 的默认值为 1,ASYNCIO 的默认值为 500

    存在一个限制,最大 ASYNCIO 的值不能超过在 OS 级别配置时,在 /proc/sys/fs/aio-max-nr(通常为 65536 )中配置的 ASYNCIO。

  • journal-min-files

    日志将维护的最少文件数。当 JBoss EAP 启动且没有初始消息数据时,JBoss EAP 将预先创建 journal-min-files 号文件数。默认值为 2

    创建日志文件并使用 padding 填充它们是一个相当昂贵的操作,我们希望在文件填写时尽可能避免这样做。通过预创建文件,在填写后,日志可以立即恢复下一个日志,而不必暂停创建日志。

    根据您期望队列以稳定状态包含的数据量,您应该调整这一数量的文件以匹配该数据总量。

  • journal-pool-files

    可重复使用的日志文件数量。虽然在回收文件时,ActiveMQ 将根据需要创建任意数量的文件,但是,在回收文件时,它将回滚到 值。默认值为 -1,即没有限制。

  • journal-sync-transactional

    如果设置为 true,则 JBoss EAP 将确保所有事务数据在事务边界上清空到磁盘,如提交、准备或回滚。默认值为 true

  • journal-sync-non-transactional

    如果设置为 true,则 JBoss EAP 将确保每次都清空到磁盘,如发送和确认等非事务消息数据。默认值为 true

  • journal-type

    有效值为 NIOASYNCIO

    选择 NIO 可让 JBoss EAP 使用 Java NIO 日志。ASYNCIO 告诉它使用 Linux 异步 IO 日志。如果您选择 ASYNCIO 但没有运行 Linux,或者您尚未安装 libaio,那么 JBoss EAP 将使用 Java NIO 日志。

10.2.6. 禁用磁盘写入缓存中的备注

无论您是从操作系统执行 fsync() 还是从 Java 程序内部正确同步数据,都会出现这种情况!

默认情况下,许多系统都启用了磁盘写入缓存。这意味着即使在从操作系统同步之后,仍无法保证数据实际将其传输到磁盘,因此在出现故障时,关键数据可能会丢失。

有些更昂贵的磁盘具有非易失性或电池支持的写入缓存,这些写入缓存不一定会在发生故障时丢失数据,但您需要对其进行测试!

如果您的磁盘没有昂贵的非易失性或受电池支持的缓存,且它不是某种冗余阵列的一部分,例如 RAID,并且您需要确保禁用磁盘写入缓存的数据完整性。

请注意,禁用磁盘写入缓存可让您明智地获取性能。如果您使用的是使用在默认设置中启用了写入缓存的磁盘,则不知道您的数据完整性可能会受到破坏,那么禁用它将使您了解磁盘在真正可靠的操作时能执行的速度。

在 Linux 上,您可以使用 IDE 磁盘的工具 hdparm 或 sdparm 或 s ginfo 检查或更改磁盘的写入缓存设置。

在 Windows 上,您可以通过右键单击磁盘并单击 属性 来检查和更改设置。

10.2.7. 安装 libaio

Java NIO 日志性能较高,但是如果您使用 Linux 内核 2.6 或更高版本运行 JBoss EAP 消息传递,红帽强烈建议您使用 ASYNCIO 日志,以获取最佳的持久性性能。

注意

JBoss EAP 仅支持在红帽企业 Linux 第 6、7 或 8 版上安装时,且仅在使用 ext4、xfs、gfs2 或 nfs4 文件系统时支持 ASYNCIO。不可能在其他操作系统或早期版本的 Linux 内核下使用 ASYNCIO 日志。

您将需要安装 libaio,才能使用 ASYNCIO 日志。要安装,请使用以下命令:

  • Red Hat Enterprise Linux 6 和 7:

    yum install libaio
    Copy to Clipboard Toggle word wrap
  • Red Hat Enterprise Linux 8:

    dnf install libaio
    Copy to Clipboard Toggle word wrap
警告

请勿将消息传递日志放在 tmpfs 文件系统上,例如用于 /tmp 目录。如果 ASYNCIO 日志使用 tmpfs,JBoss EAP 将无法启动。

10.2.8. 配置 NFS 共享存储以进行消息传递

在使用专用的共享存储、数据复制高可用性时,您必须将实时服务器和备份服务器配置为使用 NFS 客户端上的共享目录。如果您将一台服务器配置为使用 NFS 服务器上的共享目录,另一个服务器使用 NFS 客户端上的共享目录,则备份服务器无法识别实时服务器启动或正在运行时。因此,为了正常工作,两台服务器必须在 NFS 客户端上指定共享目录。

您还必须为 NFS 客户端挂载配置以下选项:

  • sync :此选项指定所有更改都会立即刷新到磁盘。
  • intr :此选项允许在服务器停机或无法访问时中断 NFS 请求。
  • noac :此选项禁用属性缓存,这是在多个客户端之间实现属性缓存一致性所必需的。
  • soft :此选项指定服务于导出的文件系统的主机不可用,应报告错误,而不是等待服务器恢复在线。
  • lookupcache=none :此选项禁用查找缓存。
  • timeo=n :NFS 客户端在重试 NFS 请求前等待响应,以毫秒为单位的时间(秒数十)。对于 NFS over TCP,默认的 timeo 值为 600 (60 秒)。对于 NFS over UDP,客户端使用自适应算法为常用请求类型(如读取和写入请求)估算适当的超时值。
  • retrans=n :NFS 客户端在尝试进一步恢复操作前重试请求的次数。如果没有指定 retrans 选项,NFS 客户端会尝试每个请求三次。
重要

在配置 timeo 和重新传输 选项时,务必要使用合理的值。默认的 timeo 等待时间为 600 分钟(60 秒),组合回 5 次尝试可等待 ActiveMQ Artemis 检测 NFS 断开连接。

有关如何使用 共享文件系统以实现高可用性的更多信息,请参阅本指南中的共享存储部分

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat