热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

db2怎么限定查询条数_ES的跨索引查询有多便利?对比下分库分表、分片更直观...

作者介绍李猛(ynuosoft),Elastic-stack产品深度用户,ES认证工程师,2012年接触Elasticsearch

70e8c319315a9cd81a1fcbcdedeb2e67.png

作者介绍

李猛(ynuosoft),Elastic-stack产品深度用户,ES认证工程师,2012年接触Elasticsearch,对Elastic-Stack开发、架构、运维等方面有深入体验,实践过多种Elasticsearch项目,最暴力的大数据分析应用,最复杂的业务系统应用;业余为企业提供Elastic-stack咨询培训以及调优实施。

序言

Elasticsearch,中文名直译弹性搜索,不仅仅在单索引内部分片层面弹性搜索,更强的是在跨索引外围支持分片弹性搜索,同比其它分布式数据产品,此特性更鲜明,代表了Elastic集群架构设计的优越性。

本文将从以下几个方面展开探讨:

  • 为什么需要跨索引查询?

  • 跨索查询有哪些经典应用场景?

  • 跨索引查询技术原理是怎样的?

  • 跨索引查询有哪些注意事项?

70dedf33343bc2231d268906a2ac7343.png

图示:跨索引示意图+多个索引查询效果图

为什么需要跨索引查询技术限制

Elasticsearch索引本身有一些指标限制,对于很多新手来说最容易忽视或者乱用。

  • Elastic索引数据量有大小限制;

  • 单个分片数据容量官方建议不超过50GB,合理范围是20GB~40GB之间;

  • 单个分片数据条数不超过约21亿条(2的32次方),此值一般很难达到,基本可以忽略,背后原理可以参考源码或者其它;

  • 索引分片过多,分布式资源消耗越大,查询响应越慢。

基于以上限制,索引在创建之前就需要依据业务场景估算,设置合理的分片数,不能过多也不能过少。

技术便利

在基于关系型数据库的应用场景中,数据量过大,一般会采用分库分表策略,查询数据时基于第三方中间件,限制多多;在基于NoSQL的应用场景中,如MongoDB,数据量过大,会采用数据产品本身提供的分片特性,查询数据时基于自身的路由机制。

无论是分库分表还是分片,它们只解决了一维数据的存储与查询,二维的不能,如电商订单系统场景,数据库采用多库多表拆分,一旦容量超过预期设计,需要二次拆分继续分库分表;MongoDB采用多分片拆分,一旦容量超过预计设计,需要继续扩展分片节点。

以上对于Elasticsearch可以不用这样,它提供了两个维度的拆分方式,第一维度采用多个索引命名拆分,第二维度采用索引多分片,对于查询来说,可以灵活匹配索引,一次指定一个索引,也可以一次指定多个索引。

e406555df13818b30a7b48a7cd7003b3.png

图示:ES查询示意图+多索引+多分片示意图

跨索引查询应用场景

IT应用中,除去技术本身局限问题,多数的问题都是由于耦合造成的,“高内聚,低耦合”一直是我们IT从业者的座右铭。应用系统耦合,就成了单体应用,然后就延伸出微服务架构理念。同样数据耦合,我们也要基于一定维度的微服务化,或垂直或水平或混合垂直水平。

业务系统

举例某些业务场景,实时数据与历史数据存储和查询问题,假设日均数据量超过千万条,那么月度数量超过3亿条,年度也会超过36亿条。

若采用Elasticsearch存储,则可以按月/按季度/按年度 创建索引,这样实时数据的更新只会影响当前的索引,不影响历史的索引;查询时也一样,依据查询条件指定索引名称,按需要扫描查询,无需每次扫描所有的数据。这比基于传统的数据产品灵活很多。

5a7159fb6ef50eeba301afd485b79fab.png

图示:实时数据与历史数据业务场景

大数据

Elasticsearch在大数据应用场景下很受欢迎,已经成为大数据平台对外提供结果查询的标配。大数据平台需要定期计算数据,将结果数据批量写入到Elasticsearch中,供业务系统查询,由于部分业务规则设定,Elasticsearch原来的索引数据要全部删除,并重新写入,这种操作很频繁。对于大数据平台每次全量计算,代价很大,对于Elasticsearch平台,超大索引数据频繁删除重建,代价也很大。

基于以上,采用多索引方式,如按照月份拆解,依据需要删除的月份索引数据。同样的问题,业务系统查询时,非常灵活指定需要的月份索引数据,这样保证了存储与查询的平衡。

4078a499a338ddbe752d8bcefc680c5a.png

图示:大数据平台写数据到Elastic平台示意图

日志

Elasticsearch应对这个日志场景非常擅长,诞生了著名的ELK组合,比如一个大中型的业务系统,每天日志量几十TB/几百TB很正常,可按天或者按小时或者更小粒度创建索引,通常查询日志只会查询最近时间的,过去很久的日志,偶然需要查询几次,甚至会删除。所以对于此场景,Elasticsearch的跨索引查询非常便利,程序编写也很简单。

跨索引查询应用方式

Elasticsearch跨索引查询的方式可依据业务场景灵活选择,下面介绍几种:

直接型

明确指定多个索引名称,这种方式一般应用在非常精确的查询场景下,便于查询索引范围,性能平衡考虑,若索引不存在会出现错误,如下:index_01,index_02

GET /index_01,index_02/_search

{

  "query" : {

    "match": {

      "test": "data"

    }

  }

}

模糊型

不限定死索引名称,这种方式一般采用通配符,无需判断该索引是否存在,支持前匹配、后匹配,前后匹配,如下:index_* 匹配前缀一样的所有索引

GET /index_*/_search

{

  "query" : {

    "match": {

      "test": "data"

    }

  }

}

计算型

索引名称通过计算表达式指定,类似正则表达式,也可以同时指定多个索引,如下:logstash-{now/d}表示当前日期

# 索引名称如:index-2024.03.22

# GET //_search

GET /%3Cindex-%7Bnow%2Fd%7D%3E/_search{

  "query" : {

    "match": {

      "test": "data"

    }

  }

}

跨索引查询技术原理

Elasticsearch能够做到跨索引查询,离不开其架构设计以及相关实现原理。

索引分片

0e98d6db8a8b68675caf3636b6a29c10.png

图示 :索引由分片组成

  • 索引是一个虚拟的数据集合,索引由多个分片组成;

  • 分片存储实际的数据;

  • 索引分片数量不限制。

查询过程

6b762aebe372f0d77c3bae572d44ceba.png

图示:索引查询阶段

245d649a142d6034574ed938f9ac7fe6.png

图示:取回数据阶段

查询过程简单说来就是分发与合并:

  • 查询分发,客户端发送请求到协调节点,协调节点分发查询请求到索引分片节点;

  • 数据合并,索引分片节点将数据发送到协调节点,协调节点合并返回客户端。

所以说,Elasticsearch提供跨索引查询的能力,实际上与原来单索引查询时一样,本质上是跨多个分片查询,然后合并。

跨索引查询注意事项索引与分片等价关系

索引与分片等价的关系,1个索引20分片与4个索引每个索引5个分片理论上是等价的,鉴于索引分片的容量限制与性能平衡,在面对需要跨索引业务场景时,索引的数量与分片的数量尽量的少,既要保障索引热点数据的实时处理能力,也要平衡历史数据的查询性能。

协调节点分离

鉴于Elastic查询过程,在跨多个索引查询时,协调节点承担了所有分片查询返回的数据合并,需要消耗很大资源,在应对高并发场景,建议部署独立的协调节点,将集群的数据节点与协调节点分离,以达到最佳的性能平衡。

路由机制

Elasticsearch写入数据分布默认是基于索引主键_id的Hash值,此机制在数据分布上很均衡,但也没有什么规律,对于跨索引查询场景,若自定义指定路由键,可以在搜索时避开不需要的索引分片,有效减少分片查询的分片数量,达到更高的性能。

总结

Elasticsearch由于其架构设计的弹性能力,小小的一个跨索引查询特性,就能给我们应用系统带来很多架构设计的便利,解决很多实际场景问题,这是其它数据产品目前还做不到的。Elasticsearch还有更厉害的跨多个集群跨多个版本,详情可继续关注笔者下一篇文章的探讨。

还是那句话,Elastic用得好,下班下得早。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

237747b5da429a7647549ff6c1995e35.png

长按订阅更多精彩▼

cf149d0028d312893093a9149d25f427.png

如有收获,点个在看,诚挚感谢




推荐阅读
  • “您可以从三个选项中(快速、便宜或好)选择两个”提出这个问题的人可能不是可观测性工程师。但也可能是,在可观测性方面,决定您 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)【下载本文PDF进行阅读】设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践。在经过多年的软件开发实践之后,回过头 ... [详细]
  • mongoDB高可用集群环境搭建
    2019独角兽企业重金招聘Python工程师标准在生产环境下,部署一台mongodb服务的话,会存在以下问题:单点问题生产环境是一个 ... [详细]
  • Java开发面试问题,2021网易Java高级面试题及答案,实战案例
    前言大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是“HUAWEI”面经!这是一次真实的面试经历,虽然不是我自己亲身经历 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文详细介绍了Python中正则表达式和re模块的使用方法。首先解释了转义符的作用,以及如何在字符串中包含特殊字符。然后介绍了re模块的功能和常用方法。通过学习本文,读者可以掌握正则表达式的基本概念和使用技巧,进一步提高Python编程能力。 ... [详细]
  • 数据库异常智能分析与诊断
    数据库,异常, ... [详细]
  • “自主设计与实施的故障注入微服务Sidecar,欢迎大佬批评指正!”
    “故障注入Sidecar“——为您的微服务注入故障以验证集群性能!由于导师和实验室师兄们的科研需要,本人专门以Sidecar的模式设计了一个用于错误注入的微服务模块。该模块可以与任 ... [详细]
author-avatar
逃跑的骨拉拉gf_761
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有