第 1 章 索引数据网格缓存
Data Grid 可以在您的缓存中创建值索引,以提高查询性能,从而比非索引查询更快地提供结果。索引还允许您在查询中使用全文本搜索功能。
Data Grid 使用 Apache Lucene 技术在缓存中索引值。
1.1. 配置 Data Grid 以索引缓存
在缓存配置中启用索引,并指定在创建索引时数据网格应包含哪些实体。
在使用查询时,您应该始终将 Data Grid 配置为索引缓存。索引对您的查询提供了显著的性能,可让您更快地了解您的数据。
流程
在缓存配置中启用索引。
<distributed-cache> <indexing> <!-- Indexing configuration goes here. --> </indexing> </distributed-cache>
提示在
配置中添加
indexing 元素可启用索引,而无需包含enabled=true
属性。对于添加此元素的远程缓存,也会隐式将编码配置为 ProtoStream。
使用
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
软件包名称对模式中的Book
消息进行索引。package book_sample; /* @Indexed */ message Book { /* @Text(projectable = true) */ optional string title = 1; /* @Text(projectable = true) */ optional string description = 2; // no native Date type available in Protobuf optional int32 publicationYear = 3; 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 配置控制索引的存储和构建方式。
索引存储
您可以配置 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>
索引路径
当 storage 为 'filesystem' 时,指定索引的文件系统路径。该值可以是相对或绝对路径。相对路径相对于配置的全局持久位置创建,或者在禁用全局状态时到当前工作目录。
默认情况下,缓存名称用作索引路径的相对路径。
在设置自定义值时,请确保使用相同的索引实体在缓存之间没有冲突。
索引启动模式
当 Data Grid 启动时,它可以执行操作以确保索引与缓存中的数据一致。默认情况下,缓存启动时不会进行索引操作,但您可以将 Data Grid 配置为:
缓存启动时清除索引。
- Data Grid 同步执行清晰(purge)操作。缓存只有在清除完成后才可用。
当缓存启动时重新索引缓存。
- Data Grid 异步执行 reindex 操作。根据缓存的大小,重新索引操作可能需要更长的时间来完成。
自动清除或重新索引缓存。
- 如果数据是易失性,并且索引是持久的,则数据网格会在启动时清除缓存。
- 如果数据持久,并且索引是易失性,则 Data Grid 会在其启动时重新索引缓存。
缓存启动时清除索引
<distributed-cache> <indexing storage="filesystem" startup-mode="purge"> <!-- Additional indexing configuration goes here. --> </indexing> </distributed-cache>
当缓存启动时重建索引
<distributed-cache> <indexing storage="local-heap" startup-mode="reindex"> <!-- Additional indexing configuration goes here. --> </indexing> </distributed-cache>
索引模式
indexing-mode
控制如何将缓存操作传播到索引中。
auto
- Data Grid 会立即对缓存应用任何更改到索引中。这是默认的模式。
manual
-
只有在显式调用 reindex 操作时,Data Grid 更新索引。配置
手动模式
,例如,当您要对索引执行批处理更新时。
将 indexing-mode
设置为 manual
:
<distributed-cache> <indexing indexing-mode="manual"> <!-- Additional indexing configuration goes here. --> </indexing> </distributed-cache>
索引读取器
索引读取器是一个内部组件,提供对索引的访问来执行查询。随着索引内容的变化,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>
索引写器
索引写器是一个内部组件,它构造由一个或多个片段(sub-indexes)组成的索引,可随着时间的推移合并以提高性能。较少的片段通常意味着查询期间的开销较少,因为索引读取器操作需要考虑所有片段。
Data Grid 在内部使用 Apache Lucene,并在两个层(内存和存储)中索引条目。新条目会首先进入内存索引,然后在出现 flush 时,到配置的索引存储。发生定期提交操作,从之前清空的数据中创建片段,并将所有索引更改永久更改。
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>
属性 | 描述 |
---|---|
| 以毫秒为单位,索引更改会清除到索引存储,并且执行提交的时间(以毫秒为单位)。因为操作非常昂贵,因此应该避免小的值。默认值为 1000 ms (1 秒)。 |
|
在将缓冲的内存中刷新到索引存储前可以缓冲的最大条目数。较大的值会导致索引速度更快,但使用更多内存。当与 |
|
在清除索引存储前,可用于缓冲添加的条目和删除的最大内存量。较大的值会导致索引速度更快,但使用更多内存。为了加快索引性能,您应该设置此属性而不是 |
| 由于 Infinispan 15.0,因此会忽略此配置。索引引擎现在使用 Infinispan 线程池。 |
| 默认 4。用于每个索引类型的内部队列数量。每个队列包含应用于索引和队列的修改批量处理。增加队列数量将导致增加索引吞吐量,但只有在瓶颈是 CPU 时。 |
|
默认 4000。每个队列可以容纳的最大元素数。增加 |
| 为索引操作启用低级追踪信息。启用此属性可显著提高性能。您应该只使用此低级追踪作为故障排除的最后资源。 |
要配置数据网格如何合并索引片段,您可以使用 index-merge
子元素。
属性 | 描述 |
---|---|
| 索引片段在合并前可以具有的最大条目数。有超过这个条目数量的片段不会被合并。较小的值在频繁更改索引时执行更好,如果索引没有经常更改,较大的值可以提供更好的搜索性能。 |
| 一次合并的片段数量。使用较小的值时,合并的频率会更频繁地使用更多资源,但片段总数平均会降低,从而提高了搜索性能。较大的值(超过 10)最适合编写大量情况。 |
| 后台合并的最小目标大小(以 MB 为单位)。小于这个大小的片段会更积极地合并。设置太大的值可能会导致昂贵的合并操作,即使它们比较频繁。 |
|
后台合并的最大片段大小(以 MB 为单位)。大于这个大小的片段永远不会在后台合并。把它设置为较低值有助于降低内存要求,并避免在最佳搜索速度下一些合并操作。当强制合并索引和 |
|
强制合并并覆盖 |
|
在计算网段中的条目时,是否应该考虑索引中已删除条目的数量。设置 |
其他资源
索引分片
当您有大量数据时,您可以将 Data Grid 配置为将索引数据分成多个名为分片的索引。在分片中启用数据分布可提高性能。默认情况下禁用分片。
使用 shards
属性配置索引数量。分片数量必须大于 1
。
<distributed-cache> <indexing> <index-sharding shards="6" /> </indexing> </distributed-cache>