第 6 章 持久性消息数据
对于持久性( storing)消息数据,AMQ Broker 有两个选项。
另外,您还可以将代理配置为 保留 任何消息数据。更多信息请参阅 第 6.3 节 “禁用持久性”。
代理使用不同的解决方案来持久保留消息日志之外的大型消息。请参阅 第 8 章 处理大型消息 了解更多信息。
代理也可以在低内存情况下配置为将信息分页到磁盘。请参阅 第 7.1 节 “配置消息分页” 了解更多信息。
有关 AMQ Broker 支持哪些数据库和网络文件系统的当前信息,请参阅红帽客户门户网站中的 Red Hat AMQ 7 支持的配置。
6.1. 在日志中保留消息数据 复制链接链接已复制到粘贴板!
代理日志是磁盘上 一组仅 附加文件。每个文件都预先创建为固定大小,最初使用 padding 填充。当消息传递操作在代理上执行时,记录会附加到日志的末尾。附加记录允许代理最小化磁盘头移动和随机访问操作,通常是磁盘上的最慢的操作。当一个日志文件满时,代理会创建一个新日志文件。
日志文件大小是可配置的,从而最大程度减少每个文件使用的磁盘 cylinders 数。但是,现代磁盘拓扑比较复杂,代理无法控制文件映射到哪个循环。因此,日志文件大小难以精确控制。
代理使用的其他与持久性相关的功能有:
- 确定特定日志文件是否仍在使用的 垃圾回收 算法。如果日志文件不再使用,代理可以回收文件以供重复使用。
- 从日志中删除死空间并压缩数据的压缩算法。这会导致磁盘上使用较少的文件的日志。
- 支持本地事务。
- 在使用 JMS 客户端时支持扩展架构(XA)事务。
大多数日志都是以 Java 编写的。但是,与实际文件系统交互是抽象的,因此您可以使用不同的可插拔的实现。AMQ Broker 包括以下实现:
- NIO
- NIO (新 I/O)使用标准的 Java NIO 与文件系统接口。这提供了非常好的性能,并在具有 Java 6 或更高版本运行时的任何平台上运行。有关 Java NIO 的更多信息,请参阅 Java NIO。
- AIO
AIO (Aynshcronous I/O)使用精简原生打包程序与 Linux Asynchronous I/O 库(
libaio
)进行通信。使用 AIO 时,代理会在数据进入磁盘后调用回来,从而避免了显式同步。默认情况下,代理尝试使用 AIO 日志,并在 AIO 不可用时回退到使用 NIO。与 Java NIO 相比,AIO 通常提供更好的性能。要了解如何安装
libaio
,请参阅 第 6.1.1 节 “安装 Linux 同步 I/O 库”。
以下子小节中的流程演示了如何为基于日志的持久性配置代理。
6.1.1. 安装 Linux 同步 I/O 库 复制链接链接已复制到粘贴板!
红帽建议使用 AIO 日志(而不是 NIO)来提高持久性性能。
无法与其他操作系统或早期版本的 Linux 内核一起使用 AIO 日志。
要使用 AIO 日志,您必须安装 Linux Asynchronous I/O 库(libaio
)。要安装 libaio
,请使用 yum
命令,如下所示:
yum install libaio
yum install libaio
6.1.2. 配置基于日志的持久性 复制链接链接已复制到粘贴板!
以下流程描述了如何查看代理用于基于日志的持久性的默认配置。您可以根据需要使用此描述来调整配置。
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。默认情况下,代理配置为使用基于日志的持久性,如下所示。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用持久性
-
如果此参数的值设置为
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 的默认值是 3333333 纳秒(每秒 300 次)。AIO 的默认值为 50000 纳秒(每秒 2000 次)。
journal-max-io
最多可在 IO 队列中的写入请求数。如果队列已满,代理会阻止进一步的写入,直到有可用空间为止。
如果您使用 NIO,则该值应始终为
1
。如果您使用 AIO,且此参数未在配置中明确指定,则默认值为500
。
- 根据上述描述,根据您的存储设备的要求调整您的持久性配置。
其他资源
- 要了解可用于配置基于日志的持久性的所有参数,请参阅 附录 E, 消息传递日志配置元素。
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.3 节 “关于绑定日志”。
6.1.5. 配置日志保留 复制链接链接已复制到粘贴板!
您可以将 AMQ Broker 配置为保留每个创建的日志文件的副本。配置日志保留后,您可以重新执行日志文件副本中的消息,以将消息发送到代理。
6.1.5.1. 配置日志保留 复制链接链接已复制到粘贴板!
您可以将 AMQ Broker 配置为在特定时间段内保留日志文件副本,或直到达到存储限制或两者为止。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 -
在
core
元素内,添加journal-retention-directory
属性。指定控制日志文件的保留
或两者。此外,指定日志文件副本的文件系统位置。以下示例将 AMQ Broker 配置为将日志文件副本保存在期间
或存储限制data/retention
目录中7
天,或直到文件使用10GB
存储。
周期
- 保存日志文件副本的时间周期。当时间段过期时,AMQ Broker 会删除超过指定时间段的任何文件。
unit
-
应用到保留周期的测量单位。默认值为
DAYS
。其他有效的值为HOURS
、MINUTES
和SECONDS
。 目录
- 日志文件复制的文件系统位置。指定目录相对于 < broker_instance_dir> 目录。
storage-limit
- 所有日志文件副本可以使用的最大存储。如果达到存储限制,代理会删除最旧的日志文件,以便为新日志文件复制提供空间。设置存储限制是确保日志文件保留不会导致代理耗尽磁盘空间并关闭的有效方法。
6.1.5.2. 为代理中存在的地址重播日志文件副本中的消息 复制链接链接已复制到粘贴板!
如果要从日志文件副本重新执行的信息地址存在于 AMQ Broker 上,请使用以下步骤重新显示信息。您可以将消息重新显示到代理上的原始地址或不同地址。
流程
- 登录到 AMQ 管理控制台。如需更多信息,请参阅访问 AMQ 管理控制台。
- 在主菜单中,单击 Artemis。
- 在文件夹树中,单击 addresses 以显示地址列表。
- 点 Addresses 选项卡。
- 在您要重播消息的地址的 Action 列中,单击 operations。
选择重播操作。
- 如果您希望 replay 操作搜索所有日志文件副本中要重播的信息,请点 replay (String,String) 操作。
- 如果您希望重播操作仅在特定时间段内创建的日志文件副本中搜索信息,请选择 replay (String,String, String,String) 操作。在 startScanDate 和 endScanDate 字段中,指定时间段。
指定重播选项。
- 在 target 字段中,指定要发送重播消息的地址。如果将此字段留空,信息将重新显示到代理的原始地址。
-
(可选)在 filter 字段中,指定一个字符串来仅重播与过滤器字符串匹配的消息。例如,如果消息具有 storeID 属性,您可以使用过滤
storeID="1000"
来重播存储 ID 值为 1000 的所有消息。如果您没有指定过滤器,扫描的日志文件副本中的所有信息都会重新显示到 AMQ Broker。
- 点 Execute。
其他资源
- 有关使用 AMQ 管理控制台的更多信息,请参阅使用 AMQ 管理控制台。
6.1.5.3. 在日志文件复制中重播从代理中删除的地址 复制链接链接已复制到粘贴板!
如果要从日志文件副本中重播的消息地址已从 AMQ Broker 中删除,请使用以下步骤将信息重新定向到代理上的不同地址。
流程
- 登录到 AMQ 管理控制台。如需更多信息,请参阅访问 AMQ 管理控制台。
- 在主菜单中,单击 Artemis。
- 在文件夹树中,单击顶级服务器。
- 单击 Operations 选项卡。
选择重播操作。
- 如果您希望 replay 操作搜索所有日志文件副本中要重播的信息,请点 replay (String,String,String) 操作。
- 如果您希望重播操作仅在特定时间段内创建的日志文件副本中搜索信息,请选择 replay (String,String,String,String,String,String) 操作。在 startScanDate 和 endScanDate 字段中,指定时间段。
指定重播选项。
- 在 address 字段中,指定要重播的消息地址。
- 在 target 字段中,指定要发送重播消息的地址。
-
(可选)在 filter 字段中,指定一个字符串来仅重播与过滤器字符串匹配的消息。例如,如果消息具有 storeID 属性,您可以使用过滤
storeID="1000"
来重播存储 ID 值为 1000 的所有消息。如果您没有指定过滤器,扫描的日志文件副本中的所有信息都会重新显示到 AMQ Broker。
- 点 Execute。
其他资源
- 有关使用 AMQ 管理控制台的更多信息,请参阅使用 AMQ 管理控制台。
6.1.6. 紧凑日志文件 复制链接链接已复制到粘贴板!
AMQ Broker 包含一个压缩算法,它从日志中删除死空间并压缩数据,使其占用较少的磁盘空间。
以下子部分演示了如何:
6.1.6.1. 配置日志文件压缩 复制链接链接已复制到粘贴板!
代理使用以下条件来决定何时开始压缩:
- 为日志创建的文件数。
- 日志文件中实时数据的百分比。
在达到这两个条件的值后,压缩过程会解析日志并删除所有死记录。因此,日志包含较少的文件。
以下流程演示了如何为日志文件压缩配置代理。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在
core
元素中,添加journal-compact-min-files
和journal-compact-percentage
参数并指定值。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow journal-compact-min-files
-
代理在压缩开始前创建的最小日志文件数。默认值为
10
。将值设为0
可禁用压缩。禁用压缩时应小心,因为日志的大小可能会无限期增长。 journal-compact-percentage
-
日志文件中实时数据的百分比。当这个百分比小于这个百分比时(且达到了
journal-compact-min-files
的配置值),则压缩开始。默认值为30
。
6.1.6.2. 使用命令行界面运行压缩 复制链接链接已复制到粘贴板!
以下步骤演示了如何使用命令行界面(CLI)压缩日志文件。
流程
作为 <
broker_instance_dir>
目录的所有者,停止代理。以下示例显示了用户amq-broker
。su - amq-broker cd <broker_instance_dir>/bin $ ./artemis stop
su - amq-broker cd <broker_instance_dir>/bin $ ./artemis stop
Copy to Clipboard Copied! Toggle word wrap Toggle overflow (可选)运行以下 CLI 命令以获取数据工具的完整参数列表。默认情况下,该工具使用 <
broker_instance_dir> /etc/broker.xml 中的设置
。./artemis help data compact.
$ ./artemis help data compact.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下 CLI 命令以压缩数据:
./artemis data compact.
$ ./artemis data compact.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在工具成功压缩数据后,重启代理。
./artemis run
$ ./artemis run
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
- AMQ Broker 包括用于管理日志文件的多个 CLI 命令。如需更多信息,请参阅附录中的命令行工具。
6.1.7. 禁用磁盘写入缓存 复制链接链接已复制到粘贴板!
大多数磁盘都包含硬件写缓存。写缓存可提高磁盘的明显性能,因为写入稍后写入会很好地写入磁盘。默认情况下,许多系统附带启用了磁盘写入缓存。这意味着,即使在从操作系统同步后,也无法保证数据实际将其提供给磁盘。因此,如果发生故障,关键数据可能会丢失。
有些更昂贵的磁盘具有非易失性或电池支持的写缓存,这些缓存不一定会在失败时丢失数据,但您应该测试它们。如果您的磁盘没有这样的功能,您应该确保禁用了写缓存。请注意,禁用磁盘写入缓存可能会对性能造成负面影响。
下面的步骤演示了如何在 Windows 上的 Linux 上禁用磁盘写入缓存。
流程
-
在 Linux 上,要管理磁盘写缓存设置,请使用工具
hdparm
(用于 IDE 磁盘)或sdparm
或sginfo
(用于 SDSI/SATA 磁盘)。 - 在 Windows 上,要管理磁盘写器缓存设置,请右键单击磁盘。选择 属性。