Elasticsearch的索引过程

59 阅读3分钟
  1. 接收文档

    • 客户端(例如,使用Elasticsearch的REST API或Java High-Level REST Client)向Elasticsearch集群发送一个索引请求,包含要索引的文档。
    • 请求通常指定了要存储文档的索引名称和文档ID(如果未指定,Elasticsearch将自动生成一个)。
  2. 序列化文档

    • Elasticsearch需要将文档转换为一种可以在网络上发送和集群节点之间传输的格式。这通常意味着将文档序列化为JSON。
  3. 路由

    • Elasticsearch使用文档的_id_routing字段来确定文档应该存储在哪个分片上。这是通过哈希函数实现的,确保相同的文档总是路由到相同的分片。
  4. 写入主分片

    • 索引请求被发送到文档所属的主分片。Elasticsearch确保每个文档只写入一个主分片,以避免数据冗余。
    • 主分片将新文档写入其内部的段(segment),这些段是Elasticsearch存储数据的基本单位。
  5. 复制到副本分片

    • 如果为索引配置了副本分片,主分片会将新文档复制到其所有副本分片上,以确保数据的高可用性和容错能力。
    • 副本分片通常是异步更新的,这意味着在某些情况下,副本分片上的数据可能稍微落后于主分片。
  6. 刷新(Refresh)

    • 在文档被写入主分片后,该文档不会立即变得可搜索。这是因为Elasticsearch需要等待一个刷新操作,该操作会将内部的段合并到可以搜索的状态。
    • 客户端可以通过设置refresh参数来控制何时执行刷新操作。例如,可以设置refresh=true来在索引请求后立即刷新,或者refresh=wait_for来等待下一个自动刷新。
  7. 段合并与优化

    • 随着时间的推移,分片会积累许多小的段,这会影响搜索性能。因此,Elasticsearch会定期执行段合并操作,将多个小段合并成较大的段,以减少I/O操作和内存使用。
    • 在合并过程中,Elasticsearch还会执行一些优化操作,如删除旧的或不再需要的文档。
  8. 持久化到磁盘

    • Elasticsearch使用文件系统缓存来加速读写操作,但为了确保数据的持久性,它还会定期将段持久化到磁盘。
    • 在某些情况下,如节点故障或系统崩溃,未持久化的数据可能会丢失。因此,合理配置持久化策略和监控文件系统缓存的使用情况是很重要的。

整个索引过程对最终用户来说是透明的,但在设计和优化Elasticsearch集群时,了解这些内部机制是非常重要的。此外,Elasticsearch提供了许多配置选项和API,允许用户细粒度地控制索引过程,以满足特定的性能、可用性和一致性要求。