ES 性能优化总结 01

  倒排索引是搜索引擎的核心。搜索引擎的主要目标是在查找发生搜索条件的文档时提供快速搜索。倒排索引是一种像数据结构一样的散列图,可将用户从单词导向文档或网页。它是搜索引擎的核心。其主要目标是快速搜索从数百万文件中查找数据。 

一般情况下,像下面的一样,在书中我们已经倒过来索引。根据这个词,我们可以找到这个词所在的页面。

ElasticSearch中的集群、节点、索引、文档、类型是什么?

  • 群集是一个或多个节点(服务器)的集合,它们共同保存您的整个数据,并提供跨所有节点的联合索引和搜索功能。群集由唯一名称标识,默认情况下为“elasticsearch”。此名称很重要,因为如果节点设置为按名称加入群集,则该节点只能是群集的一部分。

  • 节点是属于集群一部分的单个服务器。它存储数据并参与群集索引和搜索功能。

  • 索引就像关系数据库中的“数据库”。它有一个定义多种类型的映射。索引是逻辑名称空间,映射到一个或多个主分片,并且可以有零个或多个副本分片。 MySQL =>数据库 ElasticSearch =>索引

  • 文档类似于关系数据库中的一行。不同之处在于索引中的每个文档可以具有不同的结构(字段),但是对于通用字段应该具有相同的数据类型。 MySQL => Databases => Tables => Columns / Rows ElasticSearch => Indices => Types =>具有属性的文档

  • 类型是索引的逻辑类别/分区,其语义完全取决于用户。

问题六:

ElasticSearch中的分片是什么? 

在大多数环境中,每个节点都在单独的盒子或虚拟机上运行。 

  • 索引 - 在Elasticsearch中,索引是文档的集合。 

  • 分片 -因为Elasticsearch是一个分布式搜索引擎,所以索引通常被分割成分布在多个节点上的被称为分片的元素。

ElasticSearch中的副本是什么?

一个索引被分解成碎片以便于分发和扩展。副本是分片的副本。一个节点是一个属于一个集群的ElasticSearch的运行实例。一个集群由一个或多个共享相同集群名称的节点组成。

问题八:

ElasticSearch中的分析器是什么?

在ElasticSearch中索引数据时,数据由为索引定义的Analyzer在内部进行转换。 分析器由一个Tokenizer和零个或多个TokenFilter组成。编译器可以在一个或多个CharFilter之前。分析模块允许您在逻辑名称下注册分析器,然后可以在映射定义或某些API中引用它们。

Elasticsearch附带了许多可以随时使用的预建分析器。或者,您可以组合内置的字符过滤器,编译器和过滤器器来创建自定义分析器。

问题九:

什么是ElasticSearch中的编译器?

编译器用于将字符串分解为术语或标记流。一个简单的编译器可能会将字符串拆分为任何遇到空格或标点的地方。Elasticsearch有许多内置标记器,可用于构建自定义分析器。

问题十一:

启用属性,索引和存储的用途是什么?

enabled属性适用于各类ElasticSearch特定/创建领域,如index和size。用户提供的字段没有“已启用”属性。 存储意味着数据由Lucene存储,如果询问,将返回这些数据。

存储字段不一定是可搜索的。默认情况下,字段不存储,但源文件是完整的。因为您希望使用默认值(这是有意义的),所以不要设置store属性 该指数属性用于搜索。

索引属性只能用于搜索。只有索引域可以进行搜索。差异的原因是在分析期间对索引字段进行了转换,因此如果需要的话,您不能检索原始数据。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ElasticSearch 写入速度优化      优化前写入速度2500条/s , 优化后7800条/s

1.TransLog flush 间隔调整

   默认情况下,translog的持久化策略为 : 每个请求都 “flush”, 如果可以接受一定概率的数据丢失,那么可以调整下translog的持久化策略

2.索引刷新间隔 refresh_interval , 目前生产环境是调整为60秒

    默认配置为1秒,每次索引的refresh 都会产生一个新的,可以调整

整体流程:

  1. 数据写入buffer缓冲和translog日志文件中。
    当你写一条数据document的时候,一方面写入到mem buffer缓冲中,一方面同时写入到translog日志文件中。
  2. buffer满了或者每隔1秒(可配),refresh将mem buffer中的数据生成index segment文件并写入os cache,此时index segment可被打开以供search查询读取,这样文档就可以被搜索到了(注意,此时文档还没有写到磁盘上);然后清空mem buffer供后续使用。可见,refresh实现的是文档从内存移到文件系统缓存的过程。
  3. 重复上两个步骤,新的segment不断添加到os cache,mem buffer不断被清空,而translog的数据不断增加,随着时间的推移,translog文件会越来越大。
  4. 当translog长度达到一定程度的时候,会触发flush操作,否则默认每隔30分钟也会定时flush,其主要过程:
    4.1. 执行refresh操作将mem buffer中的数据写入到新的segment并写入os cache,然后打开本segment以供search使用,最后再次清空mem buffer。
    4.2. 一个commit point被写入磁盘,这个commit point中标明所有的index segment。
    4.3. filesystem cache(os cache)中缓存的所有的index segment文件被fsync强制刷到磁盘os disk,当index segment被fsync强制刷到磁盘上以后,就会被打开,供查询使用。
    4.4. translog被清空和删除,创建一个新的translog。

refresh

最原始的ES版本里,必须等待fsync将segment刷入磁盘,才能将segment打开供search使用,这样的话,从一个document写入到它可以被搜索,可能会超过一分钟,主要瓶颈是在fsync实际发生磁盘IO写数据进磁盘,是很耗时的,这就不是近实时的搜索了。为此,引入refresh操作的目的是提高ES的实时性,使添加文档尽可能快的被搜索到,同时又避免频繁fsync带来性能开销,依靠的原理就是文件系统缓存OS cache里缓存的文件可以被打开(open/reopen)和读取,而这个os cache实际是一块内存区域,而非磁盘,所以操作是很快的。

写入流程改进:
1)数据写入到内存buffer队列中
2)每隔一定时间,buffer中的数据被写入segment文件,然后先写入os cache
3)只要segment数据写入os cache,那就直接打开segment供search使用,而不必调用fsync将segment刷新到磁盘

将缓存数据生成segment后刷入os cache,并被打开供搜索的过程就叫做refresh,默认每隔1秒。也就是说,每隔1秒就会将buffer中的数据写入一个新的index segment file,先写入os cache中。所以,es是近实时的,输入写入到os cache中可以被搜索,默认是1秒,所以从数据插入到被搜索到,最长是1秒(可配)。

flush操作与translog

但是,需要注意, index segment刷入到os cache后就可以打开供查询,这个操作是有潜在风险的,因为os cache中的数据有可能在意外的故障中丢失,而此时数据必备并未刷入到os disk,此时数据丢失将是不可逆的,这个时候就需要一种机制,可以将对es的操作记录下来,来确保当出现故障的时候,已经落地到磁盘的数据不会丢失,并在重启的时候可以从操作记录中将数据恢复过来。elasticsearch提供了translog来记录这些操作,结合os cached segments数据定时落盘来实现数据可靠性保证(flush)。

当向elasticsearch发送创建document文档添加请求的时候,document数据会先进入到buffer,与此同时会将操作记录在translog之中,当发生refresh时(数据从index buffer中进入filesystem cache的过程)translog中的操作记录并不会被清除,而当数据从os cache中被写入磁盘之后才会将translog中清空。这个将os cache的索引文件(segment file)持久化到磁盘的过程就是flush,flush之后,这段translog的使命就完成了,因为segment已经写入磁盘,就算故障也可以从磁盘的segment文件中恢复。flush的时机可能是1.定时flush;2.translog大小达到阈值;3.一些重要操作;4.指令触发。

translog记录的是已经在内存生成(segments)并存储到os cache但是还没写到磁盘的那些索引操作(注意,有一种解释说,添加到buffer中但是没有被存入segment中的数据没有被记录到translog中,这依赖于写translog的时机,不同版本可能有变化,不影响理解),此时这些新写入的数据可以被搜索到,但是当节点挂掉后这些未来得及落入磁盘的数据就会丢失,可以通过trangslog恢复。

当然translog本身也是磁盘文件,频繁的写入磁盘会带来巨大的IO开销,因此对translog的追加写入操作的同样操作的是os cache,因此也需要定时落盘(fsync)。translog落盘的时间间隔直接决定了ES的可靠性,因为宕机可能导致这个时间间隔内所有的ES操作既没有生成segment磁盘文件,又没有记录到Translog磁盘文件中,导致这期间的所有操作都丢失且无法恢复。

translog的fsync是ES在后台自动执行的,默认是每5秒钟主动进行一次translog fsync,或者当translog文件大小大于512MB主动进行一次fsync,对应的配置是index.translog.flush_threshold_period 和 index.translog.flush_threshold_size。还需指出的是, 从ES2.0开始,每次index、bulk、delete、update完成的时候也会触发translog flush,当flush到磁盘成功后才给请求端返回 200 OK。这个改变提高了数据安全性,但是会对写入的性能造成不小的影响,因此在可靠性要求不十分严格且写入效率优先的情况下,可以在 index template 里设置如下参数:"index.translog.durability":"async",这相当于关闭了index、bulk等操作的同步flush translog操作,仅使用默认的定时刷新、文件大小阈值刷新的机制,同时可以调高 "index.translog.sync_interval":30s (默认是5s)和index.translog.flush_threshold_size配置选项。

总结一下translog的功能:

  • 保证在filesystem cache中的数据不会因为elasticsearch重启或是发生意外故障的时候丢失。
  • 当系统重启时会从translog中恢复之前记录的操作。
  • 当对elasticsearch进行CRUD操作的时候,会先到translog之中进行查找,因为tranlog之中保存的是最新的数据。
  • translog的清除时间时进行flush操作之后(将数据从filesystem cache刷入disk之中)。

总结一下flush操作的时间点:

  • es的各个shard会每个30分钟进行一次flush操作。
  • 当translog的数据达到某个上限的时候会进行一次flush操作。

有关于translog和flush的一些配置项:

  • index.translog.flush_threshold_ops:当发生多少次操作时进行一次flush。默认是 unlimited。
  • index.translog.flush_threshold_size:当translog的大小达到此值时会进行一次flush操作。默认是512mb。
  • index.translog.flush_threshold_period:在指定的时间间隔内如果没有进行flush操作,会进行一次强制flush操作。默认是30m。
  • index.translog.interval:多少时间间隔内会检查一次translog,来进行一次flush操作。es会随机的在这个值到这个值的2倍大小之间进行一次操作,默认是5s。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

18.3 段合并优化

      段合并Segment merge操作对系统的I/O和内存占用比较高,merge行为目前由Lucene控制

     可以调整段合并的线程数:

        默认为   

18.4  indexing Buffer

        为doc建立索引时使用,缓冲满时会刷入磁盘,生成一个新的segment,除refresh_interval刷新索引外,另一个生成新segment的机会,每个shard都有自己的indexing buffer

   如果执行大量的索引操作,index_buffer的配置可以考虑适当增大

18.5.1  bulk 线程池

          线程数量可以配置为cpu核心数+1,队列大小可以适当增加,但是过大会导致full gc

18.5.2 并发执行bulk 请求

           写入索引的过程,是多个客户端,多线程并行执行

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

refresh
es接收数据请求时先存入内存中,默认每隔一秒会从内存buffer中将数据写入filesystem cache,这个过程叫做refresh;

fsync
translog会每隔5秒或者在一个变更请求完成之后执行一次fsync操作,将translog从缓存刷入磁盘,这个操作比较耗时,如果对数据一致性要求不是跟高时建议将索引改为异步,如果节点宕机时会有5秒数据丢失;

flush
es默认每隔30分钟会将filesystem cache中的数据刷入磁盘同时清空translog日志文件,这个过程叫做flush。

发布了331 篇原创文章 · 获赞 1 · 访问量 3499

猜你喜欢

转载自blog.csdn.net/kuaipao19950507/article/details/103837928