范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Elasticsearch慢查询自动化巡检实践

  Elasticsearch 作为一个检索查询的文档数据库,在查询统计方面有着较为自由且丰富的方式方法。在满足各类查询聚合功能的同时,也会有着资源性能使用的浪费或者误区。在功能和性能使用中寻求最优解,诞生了 ES 慢查询治理这个场景问题。本文主要介绍了 ES 慢查询自动化巡检治理的具体内容和基础逻辑,并对巡检中的判断规则进行解读和相应的解决建议。 一、慢查询巡检逻辑
  1. 慢查询 DSL 获取
  慢查询 DSL 的获取主要依赖于慢查询日志的清洗聚合。主要有下面几个操作:1.1 日志信息要素清洗
  这里通过程序脚本从腾讯云同步日志信息到本地的 ES 集群,并根据日志类型进行拆分要素。拆分主要利用 ES 的 ingest pipeline。grok表达式:  "[%{DATA:classname}] [%{DATA:node}] [%{DATA:indexname}][%{NUMBER:shard_no}] took[%{DATA:took}], took_millis[%{NUMBER:took_millis}], total_hits[%{DATA:hits}], types[%{DATA:types}], stats[%{DATA:stats}], search_type[%{DATA:search_type}], total_shards[%{NUMBER:total_shards}], source[%{DATA:Message}], id[%{DATA:id}], "
  可以获得的日志结构如下:{     "logType": "SearchSlow",     "took": "271.7ms",     "total_shards": "12",     "types": "_doc",     "took_millis": "271",     "Message": "{"size":1000,"query":{"bool":{"must":[{"term":{"type1":{"value":"type1","boost":1.0}}},{"term":{"id":{"value":123,"boost":1.0}}}],"must_not":[{"terms":{"tag1":["tag1","tag2","tag2"],"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"_source":false}",     "Ip": "9.20.83.243",     "shard_no": "4",     "Cluster": "test-online",     "Time": "2022-06-27T22:34:59.428+08:00",     "search_type": "QUERY_THEN_FETCH",     "hits": "-1",     "node": "node1",     "classname": "i.s.s.fetch              ",     "indexname": "test_fetch",     "stats": "",     "Level": "WARN",     "id": "" }
  主要字段:took/took_millis:dsl耗时 Message:dsl内容 total_shards:总共分片数 shard_no:查询命中的分片号 Cluster:集群名 search_type:查询类型 hits:dsl命中数量 node:节点名称 classname:日志记录的查询方法 indexname:索引名称 Level:慢日志级别
  其中对后面巡检判断比较有用的是,took耗时、message dsl信息、classname 查询类型、集群名/索引名。清洗后的结果如图:
  此时的结果还只是明细数据,微盟一百多个集群每天产生的慢日志数量非常庞大,只是通过 kibana 进行检索信息并不能有效的治理慢查询。这时就需要对慢日志数据进行进一步聚合。 1.2 DSL 聚合
  DSL 聚合的目的是为了将慢日志中的 DSL 去重,保留有效且单一的 DSL。慢日志中每条 DSL 都保留了传入参数,这就造成了简单的聚合并不能获取唯一的 DSL 内容,即实际的 DSL 查询条件。比如下面的查询我们可以认为是一个 DSL 内容,只是传入的参数不一样: {"query":{"term":{"_id":{"value":"1"}}}}  {"query":{"term":{"_id":{"value":"max"}}}}
  因此我们使用脚本进行正则匹配把传入参数消除,并通过生成 MD5 进行唯一性校验。 # 正则匹配去除 dsl 中的传入参数 pattern = r"("max_expansions":)"[0-9]+"" replacement = r"1""" query_dsl = re.sub(pattern, replacement, query_dsl) # 生成 md5 作为 dsl 的唯一性 id  str_md5 = hashlib.md5(cluster_index_query.encode(encoding="UTF-8")).hexdigest()
  最终效果如下: ``` {"size":"","query":{"bool":{"must":[{"term":{"id1":{"value":"",}}},{"terms":{"tag_id":[""],}}],"adjust_pure_negative":true,}},"aggregations":{"by_tag_id":{"terms":{"field":"tag_id","size":"",,,"show_term_doc_count_error":false,"order":[{"order1":"desc"},{"_key":"asc"}]},"aggregations":{"count_id":{"value_count":{"field":"id"}}}}}} ```
  在获取实际 DSL 查询条件的同时,我们也保留了DSL 明细与耗时,通过 取耗时中位数来保留带入参数的 DSL 。接下来,我们利用 ES/lucene 提供的 profile 工具进行解析判断。 2. profile 解析要点2.1 profile 基础知识
  Profile API 让用户深入了解搜索请求是如何在低级别执行的,以便用户可以理解为什么某些请求很慢,并采取措施来改进它们。请注意, 除其他外,配置文件 API 不会测量网络延迟、搜索获取阶段花费的时间、请求在队列中花费的时间或在协调节点上合并分片响应时花费的时间。主要的结构如下: {     "profile": {         "shards": [             {                 "id": "[2aE02wS1R8q_QFnYu6vDVQ][my-index-000001][0]",                 "searches": [                     {                         "query": [...],    # query 阶段的耗时分析                         "rewrite_time": 51443, # 对 dsl 解析重写的耗时                         "collector": [...] # collector 阶段的耗时                     }             ],              "aggregations": [...] # 聚合阶段的耗时             }         ]     } }
  在 profile 反馈的结果中,包含整个 search 阶段和各个子阶段。
  对于不同版本的 ES, profile API 提供的信息内容也略有不同。这里基于当前主要使用的 7.10 版本,有以下内容是 profile 没有提供的:
  profile 分析目前不测量 fetch 阶段和网络开销。 分析也不考虑队列中花费的时间、合并协调节点上的分片响应或其他耗时,如构建全局序号。 目前无法用于 suggestions、高亮 highlighting、dfs_query_then_fetch。 aggregation 的 reduce 阶段的分析目前不可用。
  具体的 profile 使用细则可以参考官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.10/search-profile.html 总体来说,profile 提供了尽可能详细的 ES 查询逻辑解析, ES 使用者可以通过其中的内容进行可靠的查询优化。我们可以通过下面两则逻辑进行对 DSL profile 内容进行自动化的分析: 根据子查询类型判断 ,对某些比较耗费性能的查询类型进行记录统计,比如:pointrange/MultiTermQueryConstantScoreWrapper 根据各个查询阶段的耗时占比判断 ,对耗时占比超过一定比例的大查询阶段或者子查询阶段进行记录统计,并提供相关的排查建议和方向。 2.2 profile 与慢日志内容的结合
  慢日志记录了 DSL 查询的明细,profile 提供了 DSL 的执行详情,仿佛两者相结合就能方便的判断出 DSL 的不合理之处。
  但其实没那么简单, profile的本质是一个lucene collector,所以仅仅统计lucene 耗时,不包含任何网络交互式,队列等待。慢日志实际上是某个分片查询达到数据节点开始计时的。因此两者并不能完整的契合到一起。
  所以也带来了下面的一些特殊处理:
  fetch 阶段的慢查询并不能从 profile 中获取相关信息,但由于 fetch 阶段处理逻辑相对简单,可以直接从慢日志中做类型判断。 由于 profile 的耗时是一个参考数据,profile 结果中较大的子查询耗时只能作为优化方向的依据,并不能直 接生成
  需要优化的规则。 DSL 的 took 耗时理论上 会大于 profile 各个子阶段的耗时总和,需要对两个数据进行计算,为 profile 未统计的因素提供优化依据。
  其中 profile 与实际 took 耗时也会产生一些差异,比如:took 小于 profile 总和的情况,由此产生了耗时占比会变成负数。
  具体官方解释参考这里:https://github.com/elastic/elasticsearch/issues/33489 3. DSL 巡检规则结果
  每日慢查询巡检结果会根据集群写入同个 excel 文件, 每个去除参数后的 DSL 作为一个单独的 sheet。
  然后根据每个集群登记的联系人员 ldap,把 excel 邮件发送。
  3.1 DSL 详情
  这段主要展示了该 DSL 详情。
  3.2 规则结果
  巡检规则主要分以下三类: 需优化:慢查询巡检程序判断 DSL 中存在浪费性能的查询方式,需要改进该阶段。 待分析:慢查询巡检中发现 DSL 中某些阶段(包括大阶段和子阶段)的耗时不太合理,占比超过阈值,需对该阶段进行排查分析。 不需优化:展示了巡检统计的相关结果信息,但耗时占比未超过阈值。 3.3 profile 信息展示
  profile 阶段的内容主要有下面几部分组成: 表格第一行为耗时最大的分片以及其耗时,这也是下面各个查询阶段数据的来源。 主阶段均大写,粉色底,无阶段描述。主阶段包括:rewrite_phase/query_phrase/collector_phase/aggs_phas,以及根据took与profile耗时总和相减得到的 other_phase。 子阶段名称均小写,黄色底,前面的星号为子阶段的层级,层级越深星号越多。比如图中"**PointRangeQuery"为"*BooleanQuery"的子阶段。
  命中规则的阶段名称为红色,超过阈值的耗时占比为深红色。最终的统计数据则汇总进了运维使用的ES,进行分条件展示。
  4. 需优化规则以及相关建议
  ES/lucene 在底层的算法结构上,分别使用了 fst 去实现精确匹配和bkd tree 去实现范围查询。两者在dsl中的查询方式就是 term keyword 和 range long。
  相对而已错误的查询方式就是 term long 和 range keyword。 4.1 规则 :存在 term long 查询规则说明:
  ES 中数值类型(代表为 long 类型)存储时并没有采用倒排表索引,而是以value为序,将docid切分到不同的block里面,这样处理可以利用Block k-d tree进行范围查找,速度非常快。但是满足查询条件的 docid 集合在磁盘上并非向 Postlings list 那样按照 docid 顺序存放,也就无法利用 BKD tree 的算法优势了。而此时要实现对 docid 集合的快速 advance 操作,只能将 docid 集合拿出来,然后构造成一个代表 docid 集合的 bitset ,在这个 bitset 上进行 advance 操作。如果命中结果集很大,这个代价会非常大,有可能会造成 cpu 跑满的现象。这里的 term long 查询则被转换为了 PointRangeQuery。 判断依据:
  查询子阶段类型为 PointInSetQuery 或者 PointRangeQuery 处理建议:修改类型,将数值型改成 keyword; 使用 range 方法进行查询; 4.2 规则:存在 range keyword/wildcard 查询规则说明:
  在 ES 中 keyword 类型是倒排结构的,在精确查询的场景下,fst 的查询算法能达到存储和性能的最优解。但是在范围查询的场景下,ES 的处理方式可以理解为简单的遍历,和 wildcard 查询一样,是极其耗费性能的。 判断依据:
  查询子阶段类型为 MultiTermQueryConstantScoreWrapper 处理建议:修改字段类型为数值型,比如 long。 wildcard 查询的实现场景尝试 ngram 分词器或者 wildcard 类型 5. 总结
  本文主要阐述了在大批量 ES 集群下进行慢查询治理的一个方案。在自动化巡检下,发现集群查询中可以优化的内容和方向,降低排查成本。其中慢查询的判断规则和优化手段也随着慢查询治理的深入而进一步完善。
  在生产环境下慢查询的产生因素是复杂多样的。除了基本的 profile 分析,火焰图 /heap dump 等方式也是有效手段,在实际排查过程中也避免不了这类操作的介入。
  面对不同的慢查询原因,优化手段也是因地制宜,往往也是需要研发运维甚至产品等各方面同学的支持。
  作者:金端
  来源:微信公众号:微盟技术中心
  出处:https://mp.weixin.qq.com/s/SfT6EUOigpqsP0bjKCajEw

延迟退休即将到来,70后幸免于难两类人发愁,三类人偷着乐在阅读此文前,诚邀您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持。受养老金政策的调整,之前在网上一度引起众人讨论的延迟退休话题,再次被推到风口浪尖上云南一女孩将小男孩扔井中最新后续来了双方家长和解近日,云南昆明女孩将小男孩扔井中的视频引发关注。目前,双方家长和解,小孩已痊愈。云南一女孩将小男孩扔井中近日,昆明嵩明一7岁女孩将4岁小男孩扔井中引热议。救援画面显示,听见孩子呼救全年销量预增200!一位新能源二手车出口商经历的开门红中新经纬3月22日电(常涛)2月份我们出口汽车260台左右,160多台已经发出,还有90台待发出。这个数字远超去年同期。谈及今年的出口目标,成都正业佶祥平行汽车销售有限公司总经理陈船到巴基斯坦,实测当地人见中国人买东西真不要钱,真实体验感动每到一个国家,总是能够遇到一些意料不到的事情,而在我第一次来巴基斯坦的那一天,那里的环境让我难以意料,那里的百姓让我难以想象。我一直认为巴基斯坦只是一个非常热的国家,毕竟地理位置摆0。5秒完成批量配网,中山照明产业带发布全新智能化方案3月22日,中国灯饰之都中山市古镇镇举办了一场面向全球的全屋智能灯光方案发布会,方案集成了中控屏Mesh芯片无主灯等自主研发产品,中山古镇镇党委副书记镇长阮志力表示这是当地产业企业创新研发提速商业化在即,市场聚焦中国抗体B(03681)远期价值在集采常态化的背景下,中国医药产业发展速度和格局正在发生深刻的变化,国际化创新俨然已成为当下医药企业的发展共识。2022年是一个充满挑战的年份,中国创新药企中国抗体B(03681)莒县县委党史研究中心马耀崙缸藏革命史料存遗出版发行莒县县委党史研究中心(莒县地方史志研究中心)整理编纂的鲁东南滨海抗日根据地革命文献资料马耀崙缸藏革命史料存遗一书,近期由北京燕山出版社出版发行。马耀崙日记马耀崙同志在任八路军莒县独民营企业须坚守主业做强实业练好内功民营经济是社会主义市场经济发展的重要成果,是推动社会主义市场经济发展的重要力量,是推进供给侧结构性改革推动高质量发展建设现代化经济体系的重要主体。习近平总书记3月6日看望参加全国政推动乡村振兴样板区建设取得新突破习近平总书记在中央农村工作会议上的重要讲话,是我们做好新时代三农工作推进农业农村现代化建设农业强国的根本遵循和行动指南。自治区党委农村工作会议系统部署了全面贯彻落实习近平总书记在中林州市人民医院党委委员副院长杨瑞峰涉嫌严重违纪违法接受审查调查据清风安阳22日消息林州市人民医院党委委员副院长杨瑞峰涉嫌严重违纪违法,目前正在接受林州市纪委监委纪律审查和监察调查。据林州市纪委监委消息林州市人民医院党委委员副院长杨瑞峰涉嫌严重鲁滨逊漂流记人生是一场冒险,活着就是成功作者洞见心然1718年,英国作家丹尼尔笛福听闻一件令人震惊的奇事。一名水手被遗弃在大西洋荒岛,那里缺衣少食,杳无人烟,还有野兽和食人族出没,所有人都以为他会化作枯骨。不料,4年零4
孙莉18岁就跟了黄磊,三胎生了儿子后,她为何又选择复出?早年间,被问到害不害怕黄磊和女大学生产生感情的时候,孙莉自信地回答不会啊,因为她们都不如我。那时的孙莉清丽无双才华横溢,黄磊对她一见钟情而体贴备至,所以她笃信自己对伴侣的吸引力。如埃及法老著名实验把婴儿聚一起,不教说话,会产生新的语言吗?自古以来,都有一个非常深奥的问题困扰着人类语言,究竟是如何产生的?早在6世纪,就有一位埃及法老做了一个极为著名的实验将婴儿聚集在一起,不教说话,来看看语言究竟是否能够产生。语言的奥倪萍儿子虎子病痛时被父亲抛弃留阴影,母亲再婚继父治愈他一生2017年,倪萍手捧鲜花登上了朗读者节目,为大家讲述了自己这十几年的心酸历程。倪萍与1999年生下了儿子虎子,可被检查出患有先天性眼疾,倪萍便一个人带着虎子走上了10年的漫长求医之姑娘大意了,镜片里的反射早就被大家看得一清二楚,不觉得尴尬吗看不见我看不见我看不见我女朋友给做的大家看应该注意点什么??你属于哪一种呢?有这样的男朋友大家看还有必要继续吗?有车他不开非要自己扛着这个狗吹一辈子了不提雪怎么写雪很大??心情瞬间2019年,宁夏男子瘫痪6年后,妻子不堪重负离婚,7岁女儿含泪照顾前言2019年,记者来到宁夏银川解放军第五医院某科室病房外,看到一个头发凌乱面黄肌瘦,身材瘦弱的小女孩,正端着一盆刚打来的热水,准备给病床上的父亲擦拭身体,在医护人员的介绍下,记者2019年缅甸姑娘嫁湖北农村小伙,生双胞胎后,整日流泪念叨一句话在我国境内,有着为数不少来工作的外国人。有些是对中国的历史文化感到好奇,希望在工作和生活中了解到更多知识有些则是周边国家的人民,他们来到中国,希望能够找到比家乡更好的工作,甚至希望没钱还是没技术?琼州海峡仅19公里宽,为何不建座跨海大桥?作为我国的第二大海岛,海南省一直与我国大陆隔着一道琼州海峡,也正是因为这道海峡的存在,使得海南省与大陆地区的经济文化交流长期存在阻碍。但是奇怪的是,作为基建狂魔的我国,这么多年都没将于6月1日首发全新雷克萨斯RX尾部预告图太平洋汽车网新车频道近日,我们从社交媒体获得了雷克萨斯RX(询底价查参配)的尾部预告图,并表示其将于6月1日全球首发。结合此前的信息来看,新车在外观及内饰方面采用全新的设计理念,仍大连82岁老人在孙子结婚当天留千字遗书后又身系红腰带从12楼跳下一对新人结婚当天,82岁的奶奶系上红腰带从12楼一跃而下,留下一封千字遗书张贴在居民楼门口整整六页,依稀可以看出遗书中写道王涛狼心狗肺,不得好死,天打雷劈,能宗莲胡说八道,烂舌头,形势确定,广东将从水煮转为桑拿!分析大范围中暑天气真要来了在过去的一段时间里,华南沿海暴雨频频,已然成为我国的暴雨中心像是5月1日5月28日的全国降水量分布图上看,5月1日以来,我国南方地区江南华南多地降雨量达到200300毫米,尤其是湖神舟十四号载人飞船,就位据中国载人航天工程办公室消息,北京时间2022年5月29日,神舟十四号载人飞船与长征二号F遥十四运载火箭组合体已转运至发射区。目前,发射场设施设备状态良好,后续将按计划开展发射前的