ElasticSearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用ElasticSearch的水平伸缩性,能使数据在生产环境变得更有价值。ElasticSearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elastic Search 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
![0efa31afa8e9f2150d78f844558c85f2.png](https://i-blog.csdnimg.cn/blog_migrate/a42dd05e4c2111934a27c68d959fa385.jpeg)
![d82b73c98c666affec6ea0c73ad8a154.png](https://i-blog.csdnimg.cn/blog_migrate/7e6f50f06ef3ad8e3fcb9e2e8d3e97c5.jpeg)
Elasticsearch的核心优势就是近乎实时,为什么说是近乎实时而非真实意义上的实时呢,因为Elasticsearch能够做到准实时,而并不是完全的实时。下面介绍Elasticsearch是如何索引数据的整个流程。
![2759fd405242a27b91a38c357069194d.png](https://i-blog.csdnimg.cn/blog_migrate/5ad205fb54f71167cb0e424a6409b502.jpeg)
首先,当我们对记录进行修改时,es会把数据同时写到内存缓存区和translog中。而这个时候数据是不能被搜索到的,只有数据形成了segmentFile,才会被搜索到。默认情况下,es每隔一秒钟执行一次refresh,可以通过参数index.refresh_interval来修改这个刷新间隔,执行refresh主要做三件事:
1、所有在内存缓冲区中的文档被写入到一个新的segment中,但是没有调用fsync,因此内存中的数据可能丢失
2、segment被打开使得里面的文档能够被搜索到
3、清空内存缓冲区
从上面可以看出,内存缓存中的数据,每一秒会生成一个新的segment,一分钟就会生成60哥segments。只有在生成segment之后,才会被索引到,所以这里说并非realtime,而是near-realtime。
translog的相当于事务日志,记录着所有对Elasticsearch的操作记录,也是对Elasticsearch的一种备份。因为并不是写到segment就表示数据落到磁盘了,实际上segment是存储在系统缓存(page cache)中的,只有达到一个周期或者数据量达到一定值,才会flush到磁盘上。这个时候如果系统内存中的segment丢失,是可以通过translog来恢复的。这个flush过程主要做了三件事:
1、往磁盘里写入commit point信息。
2、文件系统中的segment,fsync到磁盘。
3、清空translog文件。
translog可以保证缓存中的segment的恢复,但translog也不是实时也磁盘的,也就是说,内存中的translog丢了的话,也会有丢失数据的可能。所以translog也要进行flush。translog的flush主要有三个条件:
1、可以设置是否在某些操作之后进行强制flush,比如索引的删除或批量请求之后。
2、translog大小超过512mb或者超过三十分钟会强制对segment进行flush,随后会强制对translog进行flush,这种情况缓存中的translog在flush之后会被清空。
3、默认5s,会强制对translog进行flush。最小值可配置100ms。
6.3版本显示保留translog文件的最长持续时间。默认为12h。
参考官网:https://www.elastic.co/guide/en/elasticsearch/reference/6.3/index-modules-translog.html#_translog_settings
总结
translog是保证es数据安全的关键所在,增加flush的频率可以减少数据丢失的风险,但是所带来的是非常大的性能开销,所以生产上要根据具体的业务需求来进行配置的优化。对实时要求不高的长久,可以考虑增加refresh的时间间隔,这会很有效的提升性能。
后续文档将发布如何部署单实例和分布式ES集群,请关注,谢谢。