第 6 章 保留消息数据


AMQ Broker 有两个用于持久性存储(即 存储)消息数据的选项:

在日志中保留消息
这是默认选项。基于日志的持久性是一个高性能选项,可将消息写入文件系统上的日志中。
在数据库中保留消息
此选项使用 Java 数据库连接(JDBC )连接将消息永久保留到您选择的数据库。

另外,您还可以将代理配置为 保留任何消息数据。如需更多信息,请参阅 第 6.3 节 “禁用持久性”

代理使用不同的解决方案来持久保留消息日志之外的大型消息。如需更多信息,请参阅 第 8 章 处理大量消息

代理也可以配置为在低内存情况下将消息分页到磁盘。如需更多信息,请参阅 第 7.1 节 “配置消息分页”

注意

有关 AMQ Broker 支持哪些数据库和网络文件系统的当前信息,请参阅红帽客户门户网站 中的 Red Hat AMQ 7 支持的配置

6.1. 在日志中持久保留消息数据

代理日志是磁盘上的一组 仅附加 文件。每个文件都预先创建为固定大小,并在最初填充 padding。随着消息操作在代理上执行,记录会附加到日志的末尾。通过附加记录,代理可以最小化磁盘头移动和随机访问操作,这通常是磁盘上最慢的操作。当一个日志文件已满时,代理会新建一个。

日志文件大小可以配置,最大程度减少各个文件使用的磁盘柱面数量。然而,现代磁盘拓扑比较复杂,代理无法控制该文件所映射到的柱面。因此,日志文件大小难以精确控制。

代理使用的其他持久性相关功能有:

  • 垃圾收集 算法,用于确定特定日志文件是否仍在使用。如果不再使用日志文件,代理可以回收该文件以供重复使用。
  • 压缩算法,用于从日志中移除死空间并压缩数据。这会使日志使用磁盘上的文件更少。
  • 支持本地交易.
  • 在使用 JMS 客户端时支持扩展架构(XA)事务.

大多数日志都用 Java 编写。但是,会提取与实际文件系统的交互,以便您可以使用不同的可插拔实施。AMQ Broker 包括以下实现:

NIO
NIO(新 I/O)使用标准 Java NIO 与文件系统进行接口。这提供了极其良好的性能,并在具有 Java 6 或更高版本运行时的任何平台上运行。有关 Java NIO 的更多信息,请参阅 Java NIO
AIO

AIO(Aynshcronous I/O)使用精简原生打包程序与 Linux 异步 I/O 库(libaio)对话。使用 AIO 时,数据将重新调用代理到磁盘,从而避免完全显式同步。默认情况下,代理会尝试使用 AIO 日志,并在 AIO 不可用时返回使用 NIO。

AIO 的性能优于 Java NIO.要了解如何安装 libaio,请参阅 第 6.1.1 节 “安装 Linux 异步 I/O 库”

以下子部分中的步骤演示了如何为基于日志的持久性配置代理。

6.1.1. 安装 Linux 异步 I/O 库

红帽建议使用 AIO 日志(而不是 NIO)来提高持久性性能。

注意

AIO 日志 不能 与其他操作系统或早期版本的 Linux 内核一起使用。

要使用 AIO 日志,您必须安装 Linux 异步 I/O 库(libaio)。要安装 libaio,请使用 yum 命令,如下所示:

yum install libaio

6.1.2. 配置基于日志的持久性

以下流程描述了如何查看代理用于基于日志的持久性的默认配置。您可以根据需要使用此描述来调整配置。

  1. 打开 <broker_instance_dir>/etc/broker.xml 配置文件。

    默认情况下,代理配置为使用基于日志的持久性,如下所示。

    <configuration>
      <core>
        ...
        <persistence-enabled>true</persistence-enabled>
        <journal-type>ASYNCIO</journal-type>
        <bindings-directory>./data/bindings</bindings-directory>
        <journal-directory>./data/journal</journal-directory>
        <journal-datasync>true</journal-datasync>
        <journal-min-files>2</journal-min-files>
        <journal-pool-files>-1</journal-pool-files>
        <journal-device-block-size>4096</journal-device-block-size>
        <journal-file-size>10M</journal-file-size>
        <journal-buffer-timeout>12000</journal-buffer-timeout>
        <journal-max-io>4096</journal-max-io>
        ...
      </core>
    </configuration>
    启用持久性
    如果此参数的值设为 true,代理将使用基于文件的日志实现消息持久性。
    journal-type
    要使用的日志类型。如果设置为 ASYNCIO,代理首先会尝试使用 AIO。如果没有找到 AIO,代理将使用 NIO。
    bindings-directory
    绑定日志的文件系统位置。默认值为相对于 <broker_instance_dir> 目录。
    journal-directory
    消息日志的文件系统位置。默认值为相对于 <broker_instance_dir> 目录。
    journal-datasync
    如果此参数的值设为 true,代理将使用 fdatasync 功能确认磁盘写入。
    journal-min-files
    在代理启动时最初创建的日志文件数。
    journal-pool-files
    回收未使用的文件后要保留的文件数.默认值 -1 表示在清理过程中不会删除任何文件。
    journal-device-block-size
    存储设备上日志所使用的数据块的最大大小,以字节为单位。默认值为 4096 字节。
    journal-file-size
    指定日志目录中各个日志文件的最大大小,以字节为单位。达到此限制时,代理会启动新文件。此参数还支持字节表示法(如 K、M、G)或二进制等效(Ki、Mi、Gi)。如果您的配置中没有明确指定此参数,则默认值为 10485760 字节(10MiB)。
    journal-buffer-timeout
    指定代理刷新日志缓冲区的频率,以纳秒为单位。AIO 通常使用高于 NIO 的清空率,因此代理为 NIO 和 AIO 维护不同的默认值。如果您的配置中没有明确指定此参数,则 NIO 的默认值为 3333 纳秒(即每秒 300 倍)。AIO 的默认值为 50000 纳秒(即,每秒为 2000 倍)。
    journal-max-io

    任意时间上 IO 队列中的最大写入请求数。如果队列已满,代理会阻止进一步写入,直到可用空间为止。

    如果您使用 NIO,这个值应该始终为 1。如果您使用的是 AIO,且此参数未在配置中明确指定,则默认值为 500

  2. 根据上述描述,根据需要调整您的存储设备的持久性配置。

其它资源

6.1.3. 关于绑定日志

绑定日志用于存储与绑定相关的数据,如代理中部署的队列集合及其属性。它还存储 ID 序列计数器等数据。

绑定日志始终使用 NIO,因为与消息日志相比,它通常是较低的吞吐量。此日志中的文件前缀为 activemq-bindings。每个文件还具有扩展名 .bindings,默认大小为 1048576 字节。

要配置绑定日志,请在 <broker_instance_dir>/etc/broker.xml 配置文件 的核心 元素中包括以下参数。

bindings-directory
绑定日志的目录。默认值为 <broker_instance_dir>/data/bindings
create-bindings-dir
如果此参数的值设为 true,代理会在 bindings-directory 中指定的位置自动创建绑定目录(如果不存在)。默认值为 true

6.1.4. 关于 JMS 日志

JMS 日志存储与 JMS 相关的所有数据,包括 JMS 队列、主题和连接工厂,以及这些资源的任何 JNDI 绑定。通过管理 API 创建的任何 JMS 资源都将保留在此日志中,但通过配置文件配置的任何资源都不保留。代理 仅在 使用 JMS 时创建 JMS 日志。

JMS 日志中的文件前缀为 activemq-jms。每个文件的扩展名为 .jms,默认大小为 1048576 字节。

JMS 日志通过绑定日志共享其配置。

其它资源

6.1.5. 压缩日志文件

AMQ Broker 包含一个压缩算法,用于从日志中移除死空间并压缩数据,使其占用的磁盘空间较少。

以下子部分显示如何:

6.1.5.1. 配置日志文件压缩

代理使用以下条件来确定何时开始压缩:

  • 为日志创建的文件数。
  • 日志文件中的实时数据百分比。

达到这两个条件的配置值后,紧凑过程将解析日志并删除所有死记录。因此,日志包含的文件更少。

以下步骤演示了如何为日志文件压缩配置代理。

流程

  1. 打开 <broker_instance_dir>/etc/broker.xml 配置文件。
  2. core 元素中添加 journal-compact-min-filesjournal-compact-percentage 参数,并指定值。例如:

    <configuration>
      <core>
        ...
        <journal-compact-min-files>15</journal-compact-min-files>
        <journal-compact-percentage>25</journal-compact-percentage>
        ...
      </core>
    </configuration>
    journal-compact-min-files
    代理在开始压缩前必须创建的最少日志文件数量。默认值为 10。将值设为 0 可禁用紧凑。禁用压缩时您应该小心,因为日志的大小可能会无限期地增加。
    journal-compact-percentage
    日志文件中的实时数据百分比。如果将少于这个百分比视为实时数据(并且已达到 journal-compact-min-files 配置的值),则开始压缩。默认值为 30

6.1.5.2. 使用命令行界面运行紧凑

以下步骤演示了如何使用命令行界面(CLI)压缩日志文件。

流程

  1. 作为 <broker_instance_dir> 目录的所有者,停止代理。以下示例显示了用户 amq-broker

    su - amq-broker
    cd <broker_instance_dir>/bin
    $ ./artemis stop
  2. (可选)运行以下 CLI 命令以获取数据工具的完整参数列表:默认情况下,该工具使用 <broker_instance_dir>/etc/broker.xml 中找到的设置。

    $ ./artemis help data compact.
  3. 运行以下 CLI 命令以压缩数据:

    $ ./artemis data compact.
  4. 在工具成功压缩数据后,重启代理。

    $ ./artemis run

其它资源

6.1.6. 禁用磁盘写入缓存

大多数磁盘包含硬件写入缓存。写入缓存可以提高磁盘的可见性性能,因为稍后写入会写到磁盘中。默认情况下,许多系统都启用了磁盘写入缓存。这意味着即使在从操作系统进行同步之后,也无法保证数据已实际传输到磁盘。因此,如果发生故障,关键数据可能会丢失。

有些更昂贵的磁盘具有非易失性或受电池支持写入缓存,这些缓存不一定会在出现故障时丢失数据,但您应进行测试。如果您的磁盘没有这样的功能,您应该确保禁用写入缓存。请注意,禁用磁盘写入缓存可能会对性能造成负面影响。

以下步骤演示了如何在 Windows 上的 Linux 中禁用磁盘写入缓存。

流程

  1. 在 Linux 上,若要管理磁盘写入缓存设置,请使用 tools hdparm (用于 IDE 磁盘)或 sdparmsginfo (用于 SDSI/SATA 磁盘)。
  2. 在 Windows 上,要管理磁盘写入器缓存设置,请右键单击磁盘。选择 属性.
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.