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)
/subsystem=messaging-activemq/server=default:read-attribute(name=runtime-journal-type)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 系统返回以下值之一:
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 命令读取这两者的当前配置。也包含 输出以突出显示默认配置。
请注意,默认情况下日志 的路径
为 activemq/bindings
。您可以使用以下管理 CLI 命令更改 路径
位置:
/subsystem=messaging-activemq/server=default/path=bindings-directory:write-attribute(name=path,value=PATH_LOCATION)
/subsystem=messaging-activemq/server=default/path=bindings-directory:write-attribute(name=path,value=PATH_LOCATION)
另请注意上面输出中的 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)
/subsystem=messaging-activemq/server=default/path=bindings-directory:write-attribute(name=relative-to,value=RELATIVE_LOCATION)
默认情况下,JBoss EAP 配置为自动创建绑定目录(如果不存在)。使用以下管理 CLI 命令切换此行为:
/subsystem=messaging-activemq/server=default:write-attribute(name=create-bindings-dir,value=TRUE/FALSE)
/subsystem=messaging-activemq/server=default:write-attribute(name=create-bindings-dir,value=TRUE/FALSE)
将 值设
为 true
将启用自动创建目录。将 值设
为 false
将禁用它。
10.2.4. 配置消息日志位置 复制链接链接已复制到粘贴板!
您可以使用下面的管理 CLI 命令读取消息日志的位置信息。也包含 输出以突出显示默认配置。
请注意,默认情况下,日志 的路径
为 activemq/journal
。您可以使用以下管理 CLI 命令更改 路径
位置:
/subsystem=messaging-activemq/server=default/path=journal-directory:write-attribute(name=path,value=PATH_LOCATION)
/subsystem=messaging-activemq/server=default/path=journal-directory:write-attribute(name=path,value=PATH_LOCATION)
为了获得最佳性能,红帽建议日志位于其自身物理卷中,以便最大程度减少磁盘头移动。如果日志位于与其他可能写入其他文件(如绑定日志、数据库或交易协调器)共享的卷上,那么磁盘头在文件写入时可能会快速移动,从而显著降低性能。
另请注意上面输出中的 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)
/subsystem=messaging-activemq/server=default/path=journal-directory:write-attribute(name=relative-to,value=RELATIVE_LOCATION)
默认情况下,JBoss EAP 配置为自动创建日志目录(如果不存在)。使用以下管理 CLI 命令切换此行为:
/subsystem=messaging-activemq/server=default:write-attribute(name=create-journal-dir,value=TRUE/FALSE)
/subsystem=messaging-activemq/server=default:write-attribute(name=create-journal-dir,value=TRUE/FALSE)
将 值设
为 true
将启用自动创建目录。将 值设
为 false
将禁用它。
10.2.5. 配置消息日志属性 复制链接链接已复制到粘贴板!
下列属性是消息传递服务器的所有子属性。因此,使用管理 CLI 获取和设置值的命令语法分别相同。
要读取给定属性的当前值,其语法如下:
/subsystem=messaging-activemq/server=default:read-attribute(name=ATTRIBUTE_NAME)
/subsystem=messaging-activemq/server=default:read-attribute(name=ATTRIBUTE_NAME)
编写属性值的语法遵循对应的模式。
/subsystem=messaging-activemq/server=default:write-attribute(name=ATTRIBUTE_NAME,value=NEW_VALUE)
/subsystem=messaging-activemq/server=default:write-attribute(name=ATTRIBUTE_NAME,value=NEW_VALUE)
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-size
和journal-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-size
和journal-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
有效值为
NIO
或ASYNCIO
。选择
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
或 sginfo
检查或更改磁盘的写入缓存设置。
在 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
yum install libaio
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Red Hat Enterprise Linux 8:
dnf install libaio
dnf install libaio
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
请勿将消息传递日志放在 tmpfs 文件系统上,例如用于 /tmp
目录。如果 ASYNCIO 日志使用 tmpfs,JBoss EAP 将无法启动。