第 1 章 索引数据网格缓存


Data Grid 可在您的缓存中创建值索引,以提高查询性能,从而提供比非索引查询更快地的结果。索引还允许您在查询中使用全文本搜索功能。

注意

Data Grid 使用 Apache Lucene 技术来索引缓存中的值。

1.1. 将 Data Grid 配置为索引缓存

在缓存配置中启用索引,并指定在创建索引时应包含哪些实体数据网格。

在使用查询时,您应该始终将 Data Grid 配置为索引缓存。索引为您的查询提供了显著的性能,允许您更快地了解您的数据。

流程

  1. 在缓存配置中启用索引。

    <distributed-cache>
      <indexing>
        <!-- Indexing configuration goes here. -->
      </indexing>
    </distributed-cache>
    提示

    在您的 配置中添加 indexing 元素可启用索引,而无需包含 enabled=true 属性。

    对于远程缓存,添加此元素也会隐式将编码配置为 ProtoStream。

  2. 使用 indexed-entity 元素指定要索引的实体。

    <distributed-cache>
      <indexing>
        <indexed-entities>
          <indexed-entity>...</indexed-entity>
        </indexed-entities>
      </indexing>
    </distributed-cache>

protobuf 消息

  • 指定 schema 中声明的消息作为 indexed-entity 元素的值,例如:

    <distributed-cache>
      <indexing>
        <indexed-entities>
          <indexed-entity>org.infinispan.sample.Car</indexed-entity>
          <indexed-entity>org.infinispan.sample.Truck</indexed-entity>
        </indexed-entities>
      </indexing>
    </distributed-cache>

    此配置使用 book_sample 软件包名称对模式中的书签消息进行索引。

    package book_sample;
    
    /* @Indexed */
    message Book {
    
        /* @Field(store = Store.YES, analyze = Analyze.YES) */
        optional string title = 1;
    
        /* @Field(store = Store.YES, analyze = Analyze.YES) */
        optional string description = 2;
        optional int32 publicationYear = 3; // no native Date type available in Protobuf
    
        repeated Author authors = 4;
    }
    
    message Author {
        optional string name = 1;
        optional string surname = 2;
    }

Java 对象

  • 指定包含 @Indexed 注释的每个类的完全限定名称(FQN)。

XML

<distributed-cache>
  <indexing>
    <indexed-entities>
      <indexed-entity>book_sample.Book</indexed-entity>
    </indexed-entities>
  </indexing>
</distributed-cache>

ConfigurationBuilder

import org.infinispan.configuration.cache.*;

ConfigurationBuilder config=new ConfigurationBuilder();
config.indexing().enable().storage(FILESYSTEM).path("/some/folder").addIndexedEntity(Book.class);

1.1.1. 索引配置

Data Grid 配置控制索引的存储和构建方式。

1.1.1.1. 索引存储

您可以配置 Data Grid 如何存储索引:

  • 在主机文件系统中,这是默认值并在重启之间保留索引。
  • 在 JVM 堆内存中,这意味着索引不会在重启后。
    您应该仅将索引存储在 JVM 堆内存中,以用于小型数据集。

File system

<distributed-cache>
  <indexing storage="filesystem" path="${java.io.tmpdir}/baseDir">
    <!-- Indexing configuration goes here. -->
  </indexing>
</distributed-cache>

JVM 堆内存

<distributed-cache>
  <indexing storage="local-heap">
    <!-- Additional indexing configuration goes here. -->
  </indexing>
</distributed-cache>

1.1.1.2. 索引读取器

索引读取器是一个内部组件,提供对索引的访问来执行查询。随着索引内容的变化,Data Grid 需要刷新读取器,以便搜索结果为最新版本。您可以为索引读取器配置刷新间隔。默认情况下,如果索引自上次刷新后改变,Data Grid 会在每个查询前读取索引。

<distributed-cache>
  <indexing storage="filesystem" path="${java.io.tmpdir}/baseDir">
    <!-- Sets an interval of one second for the index reader. -->
    <index-reader refresh-interval="1000"/>
    <!-- Additional indexing configuration goes here. -->
  </indexing>
</distributed-cache>

1.1.1.3. 索引写入器

索引写入程序是一个内部组件,它构造由一个或多个片段(子索引)组成的索引,可随着时间的推移合并以提高性能。较少的片段通常意味着在查询期间较少的开销,因为索引读取器操作需要考虑所有片段。

数据中心在内部使用 Apache Lucene,并在两个层(内存和存储)中索引条目。新条目首先进入内存索引,然后在发生清除时进入配置的索引存储。定期提交操作发生,从之前清除的数据创建片段,并使所有索引更改持久。

注意

index-writer 配置是可选的。对于大多数情况和自定义配置,默认值应该只用于调整性能。

<distributed-cache>
  <indexing storage="filesystem" path="${java.io.tmpdir}/baseDir">
    <index-writer commit-interval="2000"
                  low-level-trace="false"
                  max-buffered-entries="32"
                  queue-count="1"
                  queue-size="10000"
                  ram-buffer-size="400"
                  thread-pool-size="2">
      <index-merge calibrate-by-deletes="true"
                   factor="3"
                   max-entries="2000"
                   min-size="10"
                   max-size="20"/>
    </index-writer>
    <!-- Additional indexing configuration goes here. -->
  </indexing>
</distributed-cache>
表 1.1. 索引写入器配置属性
属性描述

commit-interval

索引在内存中缓冲的索引更改的时间(以毫秒为单位)会刷新到索引存储中,并执行提交。由于操作非常昂贵,因此应该避免较小的值。默认值为 1000 毫秒(1 秒)。

max-buffered-entries

在将内存刷新到索引存储前可缓冲的最大条目数。较大的值会导致索引更快,但使用更多内存。当与 ram-buffer-size 属性结合使用时,会首先发生刷新事件。

ram-buffer-size

在将添加的条目刷新到索引存储前,可用于缓冲添加条目的最大内存量。较大的值会导致索引更快,但使用更多内存。为加快索引性能,您应该设置此属性而不是 max-buffered-entries。当与 max-buffered-entries 属性结合使用时,会首先进行刷新事件。

thread-pool-size

对索引执行写入操作的线程数量。

queue-count

用于每个索引类型的内部队列数量。每个队列都包含一系列应用于索引和队列的修改,这些修改并行处理。增加队列数量将导致索引吞吐量增加,但只有瓶颈是 CPU 时。对于最佳结果,请不要为大于 thread-pool-size 的值的 queue-count 设置值。

queue-size

每个队列可以保留的最大元素数。增加 queue-size 值会增加索引操作期间使用的内存量。设置太小的值可能会阻止索引操作。

low-level-trace

为索引操作启用低级追踪信息。启用此属性可显著降低性能。您应该只使用这个低级追踪作为故障排除的最后资源。

要配置 Data Grid 如何合并索引片段,您可以使用 index-merge 子元素。

表 1.2. 索引合并配置属性
属性描述

max-entries

索引片段在合并前可以具有的最大条目数。超过此条目的片段不会合并。较小的值在频繁更改索引时更好地执行,如果索引经常没有改变,较大的值可以提供更好的搜索性能。

因素

同时合并的片段数。使用较小的值时,合并会更频繁地使用更多资源,但片段总数会降低,从而增加搜索性能。较大的值(同意大于 10)最适合大量编写场景。

min-size

最小片段的目标大小(以 MB 为单位)用于后台合并。小于这个大小的片段会更积极地合并。设置太大的值可能会导致昂贵的合并操作,即使它们的频率较低。

max-size

后台合并的最大片段大小(以 MB 为单位)。大于这个大小的片段不会在后台合并。把它设置为较低值有助于降低内存要求,并避免在最佳搜索速度成本上出现一些合并操作。当强制合并索引和 max-forced-size 时,此属性会被忽略。

max-forced-size

强制合并并覆盖 max-size 属性的最大片段大小(以 MB 为单位)。把它设置为与 max-size 或 lower 相同的值。但是,由于删除了文档,设置这个值太低,降低搜索性能。

calibrate-by-deletes

在计算片段中的条目时,是否应该考虑索引中删除条目的数量。设置 false 将导致因为 max-entries 导致的更频繁地合并,但会更积极地将段与许多已删除的文档合并,从而提高了查询性能。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.