2 万字详解,彻底讲透 Elasticsearch( 九 )


Elasticsearch 通过在后台定期进行段合并来解决这个问题 。小的段被合并到大的段,然后这些大的段再被合并到更大的段 。
段合并的时候会将那些旧的已删除文档从文件系统中清除 。被删除的文档不会被拷贝到新的大段中 。合并的过程中不会中断索引和搜索 。

2 万字详解,彻底讲透 Elasticsearch

文章插图
段合并在进行索引和搜索时会自动进行,合并进程选择一小部分大小相似的段,并且在后台将它们合并到更大的段中,这些段既可以是未提交的也可以是已提交的 。
合并结束后老的段会被删除,新的段被 Flush 到磁盘,同时写入一个包含新段且排除旧的和较小的段的新提交点,新的段被打开可以用来搜索 。
段合并的计算量庞大,而且还要吃掉大量磁盘 I/O,段合并会拖累写入速率,如果任其发展会影响搜索性能 。
Elasticsearch 在默认情况下会对合并流程进行资源限制,所以搜索仍然有足够的资源很好地执行 。
性能优化
 
存储设备磁盘在现代服务器上通常都是瓶颈 。Elasticsearch 重度使用磁盘,你的磁盘能处理的吞吐量越大,你的节点就越稳定 。
这里有一些优化磁盘 I/O 的技巧:
  • 使用 SSD 。就像其他地方提过的,他们比机械磁盘优秀多了 。
  • 使用 RAID 0 。条带化 RAID 会提高磁盘 I/O,代价显然就是当一块硬盘故障时整个就故障了 。不要使用镜像或者奇偶校验 RAID 因为副本已经提供了这个功能 。
  • 另外,使用多块硬盘,并允许 Elasticsearch 通过多个 path.data 目录配置把数据条带化分配到它们上面 。
  • 不要使用远程挂载的存储,比如 NFS 或者 SMB/CIFS 。这个引入的延迟对性能来说完全是背道而驰的 。
  • 如果你用的是 EC2,当心 EBS 。即便是基于 SSD 的 EBS,通常也比本地实例的存储要慢 。
 
内部索引优化
2 万字详解,彻底讲透 Elasticsearch

文章插图
Elasticsearch 为了能快速找到某个 Term,先将所有的 Term 排个序,然后根据二分法查找 Term,时间复杂度为 logN,就像通过字典查找一样,这就是 Term Dictionary 。
现在再看起来,似乎和传统数据库通过 B-Tree 的方式类似 。但是如果 Term 太多,Term Dictionary 也会很大,放内存不现实,于是有了 Term Index 。
就像字典里的索引页一样,A 开头的有哪些 Term,分别在哪页,可以理解 Term Index是一棵树 。
这棵树不会包含所有的 Term,它包含的是 Term 的一些前缀 。通过 Term Index 可以快速地定位到 Term Dictionary 的某个 Offset,然后从这个位置再往后顺序查找 。
在内存中用 FST 方式压缩 Term Index,FST 以字节的方式存储所有的 Term,这种压缩方式可以有效的缩减存储空间,使得 Term Index 足以放进内存,但这种方式也会导致查找时需要更多的 CPU 资源 。
对于存储在磁盘上的倒排表同样也采用了压缩技术减少存储所占用的空间 。
 
调整配置参数调整配置参数建议如下: