ElasticSearch 写索引过程:

  • 写入索引时,Es首先写入内存同时添加事物日志,确保内存数据丢失时可以恢复数据。
  • 此时的内存指的是jvm内存,索引写入内存时是不可以被搜索到的。
  • 当达到一定时间或内存达到一定量,此时进行一次刷新,将内存数据写入到文件缓存系统,文件缓存系统开辟一个段segment来存储数据,文件缓存系统是指系统内存。打开段,则文件缓存系统的数据可被搜索。日志数据保留,内存清空。
  • 当事物日志达到512M或时间到达30分钟,则会进行再次刷新。先将内存数据刷新到文件缓存系统,然后文件缓存系统数据刷新到磁盘,清空日志数据,生成提交点,将提交点数据同步到磁盘。

集群写索引

  • 一个集群拥有多个节点,写索引如何确保写到哪里?
  • 通过路由来确定写入那个节点的主分片,路由公式
  • routing一般是指文档ID,对id进行哈希,然后对主分片数量取余可确保获得的分片位于1到num_of_primary_shards-1.
  • 在主分片写完后,会向其余节点的副分片发送写入请求进行数据写入的同步,副分片所在节点写完后,向主分片节点发送成功标志,当所有副分片成功后,主分片所在节点向客户端返回成功。
  • 客户端第一次请求可能会落在任何一个节点上,该节点此时被称为协调节点,协调节点根据路由计算要写到哪个节点上。

由此可知:配置合理的主分片和副分片可以达到良好的读写性能。

集群查询

  • 如果是通过文档id继续查询,则查询随机落到任何一个节点后,可以通过路由得到该文档所在分片的节点和副本节点,从而向改主节点或者副本节点的任意一个节点发送查询请求,获取结果。
  • 普通查询:查询落在一个节点上时,该节点创建一个一个from+size 的有限队列,然后向索引的其余节点发送查询请求。
  • 其余节点接到请求后,在本地创建from+size的优先队列,查询到结果后将文档id和得分返回给协调节点。
  • 协调节点进行排序,获取到size数据。
  • 然后通过文档ID获取文档详细数据,返回给客户端。