• Geek_817ea4
    2019-08-05
    l老师我总结了一下,帮忙看看有没有错误之处和遗漏的地方:
    1)客户端发起数据写入请求,对你写的这条数据根据_routing规则选择发给哪个Shard。
    确认Index Request中是否设置了使用哪个Filed的值作为路由参数,
    如果没有设置,则使用Mapping中的配置,
    如果mapping中也没有配置,则使用_id作为路由参数,然后通过_routing的Hash值选择出Shard,最后从集群的Meta中找出出该Shard的Primary节点。
    2)写入请求到达Shard后,先把数据写入到内存(buffer)中,同时会写入一条日志到translog日志文件中去。
    当写入请求到shard后,首先是写Lucene,其实就是创建索引。
    索引创建好后并不是马上生成segment,这个时候索引数据还在缓存中,这里的缓存是lucene的缓存,并非Elasticsearch缓存,lucene缓存中的数据是不可被查询的。
    3)执行refresh操作:从内存buffer中将数据写入os cache(操作系统的内存),产生一个segment file文件,buffer清空。
    写入os cache的同时,建立倒排索引,这时数据就可以供客户端进行访问了。
    默认是每隔1秒refresh一次的,所以es是准实时的,因为写入的数据1秒之后才能被看到。
    buffer内存占满的时候也会执行refresh操作,buffer默认值是JVM内存的10%。
    通过es的restful api或者java api,手动执行一次refresh操作,就是手动将buffer中的数据刷入os cache中,让数据立马就可以被搜索到。
    若要优化索引速度, 而不注重实时性, 可以降低刷新频率。
    4)translog会每隔5秒或者在一个变更请求完成之后,将translog从缓存刷入磁盘。
    translog是存储在os cache中,每个分片有一个,如果节点宕机会有5秒数据丢失,但是性能比较好,最多丢5秒的数据。。
    可以将translog设置成每次写操作必须是直接fsync到磁盘,但是性能会差很多。
    可以通过配置增加transLog刷磁盘的频率来增加数据可靠性,最小可配置100ms,但不建议这么做,因为这会对性能有非常大的影响。
    5)每30分钟或者当tanslog的大小达到512M时候,就会执行commit操作(flush操作),将os cache中所有的数据全以segment file的形式,持久到磁盘上去。
    第一步,就是将buffer中现有数据refresh到os cache中去。
    清空buffer 然后强行将os cache中所有的数据全都一个一个的通过segmentfile的形式,持久到磁盘上去。
    将commit point这个文件更新到磁盘中,每个Shard都有一个提交点(commit point), 其中保存了当前Shard成功写入磁盘的所有segment。
    把translog文件删掉清空,再开一个空的translog文件。
    flush参数设置:
    index.translog.flush_threshold_period:
    index.translog.flush_threshold_size:
    #控制每收到多少条数据后flush一次
    index.translog.flush_threshold_ops:
    6)Segment的merge操作:
    随着时间,磁盘上的segment越来越多,需要定期进行合并。
    Es和Lucene 会自动进行merge操作,合并segment和删除已经删除的文档。
    我们可以手动进行merge:POST index/_forcemerge。一般不需要,这是一个比较消耗资源的操作。
    展开

    作者回复: 非常棒的总结。你是听了课查了文档总结的吗?

    当数据从hot移动到warm,官方建议手工执行一下_forcemerge

     5
     23
  • Ryoma
    2019-09-04
    看到这一节的Index Buffer、Transaction log、Merge、Flush、fsync 等莫名觉得很亲切,在 MySQL 及 Redis 中也有类似的名词,目的虽然不尽相同但也有异曲同工之妙,果然技术都是殊途同归。

    作者回复: 嗯 👍

    
     2
  • 于曦程
    2019-08-08
    老师,Transaction Log的写入和Flush看上去类似,都是真正落到磁盘上;我的问题是为什么设计这么复杂,引入index buffer,又用Transaction Log保证数据不丢失,直接把索引落到磁盘不更简单吗?

    作者回复: tranactionlog 每次落盘,也可以配置成async,异步操作。

    refresh默认一秒生成一个segment,你可以修改刷新的时间,这样就是数据被查到的实施性降低了。你也可以在大量数据写入时,暂时将它设置成-1,也就是不自动刷新。

    这两个参数,在数据写入时,都是可以做优化的点。缺点就是分别损失了搜索的实时性和数据的安全性。


    这样的设计有一定的灵活性和可配置性。直接都做落盘处理,在有些情况下不够灵活

     1
     2
  • 氧气🌙 🐟 🌺
    2019-08-04
    1、认真学完您的课程想参加认证考试,还需要学习官方的Elasticsearch Engineer I和Elasticsearch Engineer II吗?Elasticsearch Engineer I和Elasticsearch Engineer II价格很贵。认证考试费400$
    2、配套学习资料除官方的Elasticsearch Reference [7.1]外,老师可以推荐几本书吗?

    作者回复: 我觉得先可以吧视频课程都过一下,然后再结合考试的纲要熟悉一下相关的api。其实要真的能把api都通读一下,我觉得不需要再看专门的书了。

    
     2
  • godtrue
    2019-09-21
    老师,Segment落盘耗性能,Transaction Log同样是落盘为什么就相对好很多?她们落盘的方式差在哪里?看评论说Transaction Log的落盘是顺序写?是这个原因嘛?她们落盘的数据结构是否也不同,Segment是倒排索引的结构,倒排索引的结构是一个复杂的二维表的结构嘛?Transaction Log的结构是怎样的?
    
     1
  • LiPeng
    2019-09-08
    老师有几个问题看了3遍视频还没懂,麻烦您解答一下:
    1 ,index buff,segment和trans log存在内存中是这3分别是在jvm内存,还是单独占用了系统内存。
    2,flush时“调用fsync将缓存中的segments写入磁盘”,这个segment写入磁盘,和trans log写入磁盘感觉作用没什么区别,为什么这么设计呢,另外es.date目录看到的文件是指segment写入磁盘的文件,还是translog写入的
    3,segment是指单个倒排索引,那么那些不需要索引的字段是以怎样的方式存储到了哪里?内存还是磁盘?
    4 我公司es所在的服务器 系统的buff/cache隔一段时间就会有好几g,一直不明白为什么,看了视频,可能是es的segment和trans log对吗?
    5 哪些数据会存入jvm本身的内存?
    6 此视频对应的文档我没找到?老师可以告知吗?
    小白问题比较多,希望能收到您的回复,谢谢您!
    展开
     1
     1
  • 勁
    2019-08-03
    老师你好,请问合并segments会影响集群吗

    作者回复: 一般情况,我们不需要去手工执行force_merge,因为这是一个比较消耗资源的操作。只有在一些特殊的场景,例如把数据从hot节点移动到warm节点后,才会考虑手动执行force merge。

    
     1
  • Geek_96e358
    2019-08-02
    咨询老师一个问题:
    我们有业务场景:按月创建索引,文档数量1000W左右,大小10G(3个data节点,每个节点18G内存),平均每天写入30W左右,自定义id,一次写入一条,ssd磁盘。现在就是有个怪问题,就是一到当月最后一周(数据多了)会出现很多大于500ms慢查询(filter过滤,然后聚合统计),抓出其中一个慢查询,分阶段执行:只进行filter过滤查询,30ms以内,查询结果10条以内,但是一旦加上 agg terms, 瞬间就到 500ms以上(10条数据)。晚上11点(基本没有写入的情况下),执行每次都在50ms以内(refresh 间隔是5s)。
    观察过threadpool,没有出现queue满和reject的情况。
        这个是不是segment有关系呢?我需要强制merge吗?或者有其他排查方向。
    展开

    作者回复: 按照你的描述,我的理解,数据量增加以后。当数据没有写入,terms 聚合速度很快,一旦有写入,再去查,aggs就比较慢。

    你觉得你可以考虑在做terms aggs时,为keyword字段加上eager_global_oridinals =true试试。因为这样有数据写入refresh时,就会创建缓存,使得你的terms aggs性能得到提升。

    
     1
  • 随心而至
    2019-11-07
    各个数据库底层实现机制都非常像,对内存和磁盘的利用。
    
    
  • 浅qian的痕迹
    2019-10-13
    elastic数据刷新默认是1s,如果业务端对数据的及时性要求比较高,需要怎么优化,原尝试过只要数据有更改就刷新,但是性能比较差

    作者回复: 没有一个标准的答案。
    刷新时间小于一秒,必然对硬件的要求会更加好。硬件如果不够,那就只能增加硬件投入。

    同时,可以考虑对数据的模型进行优化,做更加合理的数据建模和mapping设定

    
    
  • 慎终如始
    2019-09-19
    老师您好,在ES生产环境中碰到一个问题,可以的话麻烦老师给予指点,
    问题:
    两个节点的es集群 中文文本模糊搜索正常耗时10ms以内 会有10%的请求耗时达到几百ms 甚至还有1000ms的。。机器的负载,磁盘的io这些比较正常,同时也没有非常高的并发 并发最多10-20并且很少出现。开启了慢查询日志,阈值设置的很低,日志中没有找到这些异常的耗时记录。同时搜索的时候加入profile=True,一些took字段显示几百毫秒的查询,返回的profile中的耗时都是几毫秒。另外index的文档数量在1w左右,字段也没有很长。
    想请问一下老师,还有哪方面的原因,或者说还可以怎么样去定位这个问题?不胜感谢!
    展开
    
    
  • zj
    2019-08-14
    老师,elasticsarch update api当执行更新已存在字段后,之前的segment倒排索引段要重建吗

    作者回复: segement采用的是不可变设计。所以是先标记删除,然后创建新的。flush的时候在哪标记删除的从.del中删掉

    
    
  • zj
    2019-08-13
    倒排索引不可变性,新加文档都要重建整个索引,这个重建索引就是reindex操作?

    作者回复: 倒排索引不可变,指的是你无法对原有的进行更新,而是创建新的,把老的暂时标记成删除。

    reindex是说mapping发生变化,或者分词器发生变化,对倒排索引进行重建。应该是不同的概念

     1
    
  • 杰锅不是锅
    2019-08-08
    老师,我想问下,一个分片上是不是包含了多个索引下的文档,然后这个分片上的倒排表是不是倒排了这个分片里面所有索引的文档内容分词器切分的分词数据?

    作者回复: 没错,一个分片包含了一个索引的多个文档。文档是通过hash算法,对文档id做hash后,对主分片数取模后,再路由到具体的分片的(当然你也可以指定特定的routing参数)

    shard是一个lucene的index,里面包含了segements,包含了倒排索引相关的信息

    
    
  • fgdgtz
    2019-08-07
    老师,我刚入门,我想请问一下作为创业公司,怎么更有效的建立自己的词库呢?现在我是是网上下载的词库,但质量不好,自己再编辑

    作者回复: 你可以监控用户的搜索条件和实际结果,同时监控用户实际的点击,然后针对这些去做具体的优化,同时在这个过程不断的完善自己的词库

    
    
  • 小鱼
    2019-08-03
    老师,您好,请问下ES和lucene在什么情况下会进行merge操作,另外有了ES和lucene自动merge操作,还需要手工执行吗,以及什么场景下需要手工执行?

    作者回复: merge一般不需要人为参与,es自动会做。索引从hot迁移到warm,可以人为对索引做一次force merge

     1
    
  • 霍云Obsidian
    2019-08-03
    [2019-07-28T19:32:00,477][INFO ][o.e.i.e.I.EngineMergeScheduler] [data-4] [caslog-2019-07-28][3] now throttling indexing: numMergesInFlight=10, maxNumMerges=9


    [2019-07-28T19:32:00,680][INFO ][o.e.i.e.I.EngineMergeScheduler] [data-4] [caslog-2019-07-28][3] stop throttling indexing: numMergesInFlight=8, maxNumMerges=9

    老师我们生产上报这个,是segments合并导致的吗 这个有啥处理办法不。
    展开
    
    
我们在线,来聊聊吧