6.2. 在数据库中持久保留消息数据


当您在数据库中持久保留消息数据时,代理使用 Java 数据库连接(JDBC )连接将消息和绑定数据存储在数据库表中。表中的数据使用 AMQ Broker 日志编码进行编码。有关支持的数据库的详情,请查看红帽客户门户网站 中的 Red Hat AMQ 7 支持的配置

重要

管理员可以根据组织更广泛的 IT 基础架构的要求,选择将消息数据存储在数据库中。但是,使用数据库会对消息传递系统的性能造成负面影响。具体来说,通过 JDBC 将消息传递数据写入数据库表可为代理带来显著的性能开销。

6.2.1. 配置 JDBC 持久性

以下流程演示了如何配置代理以在数据库表中存储消息和绑定数据。

流程

  1. 将适当的 JDBC 客户端库添加到代理运行时。为此,请将相关 .jar 文件添加到 <broker_instance_dir>/lib 目录中。
  2. 打开 <broker_instance_dir>/etc/broker.xml 配置文件。
  3. core 元素中,添加一个 包含 数据库存储元素的 storage 元素。

    <configuration>
      <core>
        <store>
           <database-store>
           </database-store>
        </store>
      </core>
    </configuration>
  4. database-store 元素中,添加 JDBC 持久性的配置参数并指定值。例如:

    <configuration>
      <core>
        <store>
           <database-store>
              <jdbc-connection-url>jdbc:oracle:data/oracle/database-store;create=true</jdbc-connection-url>
              <jdbc-user>ENC(5493dd76567ee5ec269d11823973462f)</jdbc-user>
              <jdbc-password>ENC(56a0db3b71043054269d11823973462f)</jdbc-password>
              <bindings-table-name>BINDINGS_TABLE</bindings-table-name>
              <message-table-name>MESSAGE_TABLE</message-table-name>
              <large-message-table-name>LARGE_MESSAGES_TABLE</large-message-table-name>
              <page-store-table-name>PAGE_STORE_TABLE</page-store-table-name>
              <node-manager-store-table-name>NODE_MANAGER_TABLE</node-manager-store-table-name>
              <jdbc-driver-class-name>oracle.jdbc.driver.OracleDriver</jdbc-driver-class-name>
              <jdbc-network-timeout>10000</jdbc-network-timeout>
              <jdbc-lock-renew-period>2000</jdbc-lock-renew-period>
              <jdbc-lock-expiration>20000</jdbc-lock-expiration>
              <jdbc-journal-sync-period>5</jdbc-journal-sync-period>
           </database-store>
        </store>
      </core>
    </configuration>
    jdbc-connection-url
    数据库服务器的完整 JDBC 连接 URL。连接 URL 应当包含所有配置参数和数据库名称。
    jdbc-user
    您的数据库服务器的加密用户名。有关加密配置文件中使用的用户名和密码的详情请参考 第 5.9 节 “加密配置文件中的密码”
    jdbc-password
    加密您的数据库服务器密码。有关加密配置文件中使用的用户名和密码的详情请参考 第 5.9 节 “加密配置文件中的密码”
    bindings-table-name
    存储绑定数据的表的名称。指定表名称可让您在多个服务器之间共享一个数据库,而无需干扰。
    message-table-name
    存储消息数据的表的名称。指定此表名称可让您在多个服务器之间共享一个数据库,而无需干扰。
    large-message-table-name
    保留大量消息和相关数据的表名称。此外,如果客户端以区块形式流传输大型消息,块将存储在这个表中。指定此表名称可让您在多个服务器之间共享一个数据库,而无需干扰。
    page-store-table-name
    存储目录信息的表的名称。指定此表名称可让您在多个服务器之间共享一个数据库,而无需干扰。
    node-manager-store-table-name
    用于实时和备份代理的共享存储高可用性(HA)锁定及其他 HA 相关数据的表名称。指定此表名称可让您在多个服务器之间共享一个数据库,而无需干扰。使用共享存储 HA 的每个实时备份对必须使用相同的表名称。您不能在多个(不相关的)实时备份对间共享相同的表。
    jdbc-driver-class-name
    JDBC 数据库驱动程序的完全限定类名称。有关支持的数据库的详情,请查看红帽客户门户网站 中的 Red Hat AMQ 7 支持的配置
    jdbc-network-timeout
    JDBC 网络连接超时,以毫秒为单位.默认值为 20000 毫秒。将 JDBC 用于共享存储 HA 时,建议将超时设为小于或等于 jdbc-lock-expiration 的值。
    jdbc-lock-renew-period
    当前 JDBC 锁定的续订期的时长,以毫秒为单位。当这次调整后,代理可以续订锁定。建议设置比 jdbc-lock-expiration 值小几个倍的值。这为代理提供了足够时间来扩展租期,并给予代理时间尝试在发生连接问题时续订锁定。默认值为 2000 毫秒。
    jdbc-lock-expiration

    以毫秒为单位计算当前 JDBC 锁定的时间(即获取或续订),即使 jdbc-lock-renew-period 的值已经过期。

    代理定期尝试根据 jdbc-lock-renew-period 的值续订它拥有的锁定。如果代理 无法 续订锁定(例如,因为连接问题),代理会一直尝试续订锁定,直到自锁定上次成功获取或更新后通过 jdbc-lock-expiration 的值。

    上述续订行为的例外是,当另一个代理获取锁定时。如果数据库管理系统(DBMS)和代理之间出现时间偏差,或者垃圾回收需要长时间暂停,则可能会发生这种情况。在这种情况下,最初拥有锁定的代理会认为锁定丢失,且不会尝试更新锁定。

    在过期时间过后,如果 JDBC 锁定没有被当前拥有的代理续订,则另一个代理可以建立 JDBC 锁定。

    jdbc-lock-expiration 的默认值为 20000 毫秒。

    jdbc-journal-sync-period
    代理日志与 JDBC 同步的持续时间,以毫秒为单位。默认值为 5 毫秒。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.