不啰嗦,我们直接开始!

引言

如果你的项目里有超过千万上亿级别的数据,且数据日增量较大需要高性能检索时,如订单数据,你该怎么办?

作为面试官,你需要找一个能解决这个问题的人!为应聘者,你该如何回答面试官这个问题?

你可以了解下使用搜索引擎框架,Elasticsearch (ES)是一个不错的开源搜索引擎框架。我们可以把 ES 当做“数据库”来使用,全球很多知名社区的全文检索都采用ES,如维基百科、Stack Overflow、Github等。

ElasticSearch是开源的,它基于lucene,是伸缩性强、分布式、高可用的全⽂搜索引擎,可以简单地通过RESTful 使用JSON格式索引数据。

尝试想一下,如果你做的是一个知识库系统,系统里有大量文章,如果你想通过某一个或关键字检索文章的内容,如果用MySQL来做这件事,光靠 like 查询根本无法满足,全文检索就是对一篇文章进行索引,ES可以把内容根据词的意义进行分词,然后分别创建索引,例如”我要励志做一个有追求的程序员” ,经过ES分词后是:“我“,“我要”,”励志“,“一个“,”有追求“,“程序员”,无论你根据哪个关键词去检索,都会检索到这句话。

让你不需要了解背后复杂的逻辑,即可完成搜索,Elasticsearch致力于隐藏分布式系统的复杂性。以下这些操作都是在底层自动完成的:

  1. 将你的文档分区到不同的容器或者分片(shards)中,它们可以存在于一个或多个节点中。
  2. 将分片均匀的分配到各个节点,对索引和搜索做负载均衡。

根据ES支持全文索引这个特性,我们还可以通过它做很多所有关于模糊搜索的功能,大数据量多维度聚合也是ES的强项,如天猫商城,通过关键字搜索商品,输入iph后就会自动加载iphone相关的所有商品,这是典型的搜索引擎使用场景。

1、面试官:我看你简历有写项目里有使用了ES,哪些场景用到了ES?

问题分析: 凡事大数据量且需要检索的,这个时候你都可以想到ES,传统关系型数据库查询速度变慢,数据库分表联合查询速度慢。

答:有这样一个需求场景,运营系统需要一个订单分析工具,当时我们的订单库总数已经远远超过亿级别数据量,每天增量在百万级。

系统初期订单查询主要采用MySQL查询,并没有使用其他数据库,随着业务的发展,系统主要面临两个挑战:

  1. 随着数据增多,MySQL 分库分表后单张表数据依然增加到了几千万数据量级,查询越来越慢。
  2. 查询中带有大量聚合运算,如过滤计算异常订单总数,完成订单总数,计算订单金额等,MySQL并不擅长使用sql做大规模运算。

针对上述两个问题,我使用了 Elasticsearch 完美地应对慢查询这个问题,我使用ES作为主查询数据源,MySQL作为降级备案,如果 ES 集群因为各种原因不可用了,系统会把订单查询数据源自动切换到 MySQL 数据源,对于运营系统,虽然查询会变慢,但是不会耽误正常使用,而且这种降级的概率也极少发生。

系统架构图这样的:(尽量给面试官展示明白这个图)

重点关注红色框,我使用了 ES 作为首选订单查询源,MySQL作为备份数据源,中间加入自动降级开关。

面试官:那使用了ES后结果如何?

答:使用 ES 后,查询速度当然是大大的提高。

使用MySQL的时候99%的查询时间在10s+,架构引入ES后上线后,查询时间迅速降低到毫秒级别。

我还保留了性能监控的图放在我述职报告里,为升级加薪打下扎实的基础。

面试官一直点头,对我这一波操作非常认可。

2、面试官:关于ES的一些概念名字你了解多少?如索引,文档,倒排索引这些东西你是怎么理解的?

问题分析:有些人刚刚接触 Elasticsearch 的时候,只顾用,只知道ES快,能装很多数据,但是面试官稍微问了一个倒排索引就懵逼了,还好意思说你会用搜索引擎?

答:先说说ES中的 Index,Document,Type,以及对应MySQL数据库

索引(Index):

索引的概念相当于MySQL里数据库的概念,用ES创建一个索引就是创建一个库,比如电商系统里给订单创建一个订单的索引,那客服系统就可以通过订单索引快速查询订单所有信息快速处理客诉。

文档(Document):

ES属于文档型数据库,文档的概念就相当于MySQL里一条数据的概念,很多个文档(很多条数据)构成了一个索引。

类型(Type)

上面说文档的概念就相当于MySQL里一条数据的概念,MySQL里一条数据有很多个字段,比如订单号,用户手机号,订单金额等,Type 的概念相当于根据每个字段聚合所一张表,如根据订单号分组,按照手机号分组,这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤文档,无论根据哪个字段搜索都有对应的Type(表)。

如果还不明白,直接给你整理成表:ES VS Mysql

ElasticSearch 关系型数据库:MySQL
对应关系: 索引
对应关系: 类型type 数据表
对应关系: 文档
对应关系: 字段Field

最重要的倒排索引

Tip: 如果你使用过 Elasticsearch 不知道倒排索引的概念那恐怕有点说不过去,倒排索引也叫反向索引(Inverted Index)

(开始给面试官举例分析倒排索引,我可是货真价实做过功课的)

有这样三段话:

  1. hello everyone
  2. this article is based on inverted index
  3. which is hashmap like data structure

使用ES保存后结构如下:

 hello                (1, 1) everyone             (1, 2)this                 (2, 1)article              (2, 2)is                   (2, 3); (3, 2)based                (2, 4)on                   (2, 5)inverted             (2, 6)index                (2, 7)which                (3, 1)hashmap              (3, 3)like                 (3, 4)data                 (3, 5)structure            (3, 6)

hello 出现在第1句话第1个单词,所以是(1, 1) ,is (2, 3); (3, 2) 表示is出现在第2句第3个单词和第3句第2个单词,这样经过拆分后,每个关键词出现在哪句话哪个位置都一目了然,非常方便检索,这便是倒排索引的概念。试想一下,我们使用的百度或是谷歌检索,是不是这种数据结构更容易让我们找到你想要的所有内容,这便是倒排索引带给我们的便利之处,倒排索引允许快速全文搜索,但是在将文档添加到数据库时会增加处理成本

面试官: 行了行了,我知道你理解了,时间有限咱先不聊这个了。

这才是面试理想效果,让面试官无话可说,?。

总结

  • 如果你要做分布式的实时文件存储,每个字段都被索引并可被搜索;
  • 如果你要做实时分析搜索;
  • 如果你要处理PB级结构化或非结构化数据;

这个时候请先想到使用搜索引擎。

关于 ES 的特性是使用场景概括:

  1. 大数据量聚合检索和排序,如计算用户订单总金额,订单数据等。
  2. 自动补全,如搜索框通过关键字自动补全。
  3. 高亮查询。
  4. 关键字检索,模糊检索,拼音查询。
  5. 记录系统后台日志,日志检索。

不啰嗦,文章结束,期待三连!

分布式 - ElasticSearch解决大数据量检索难题相关推荐

  1. 面试精讲之面试考点及大厂真题 - 分布式专栏 17 ElasticSearch解决大数据量检索难题

    17 ElasticSearch解决大数据量检索难题 理想的书籍是智慧的钥匙. --列夫·托尔斯泰 引言 如果你的项目里有超过千万上亿级别的数据,且数据日增量较大需要高性能检索时,如订单数据,你该怎么 ...

  2. MERGE INTO 解决大数据量 10w 更新缓慢的问题

    MERGE INTO 解决大数据量 10w 更新缓慢的问题 参考文章: (1)MERGE INTO 解决大数据量 10w 更新缓慢的问题 (2)https://www.cnblogs.com/yun9 ...

  3. MySQL数据库如何解决大数据量存储问题

    FROM http://blog.csdn.net/likika2012/article/details/38816037 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存 ...

  4. 一招教你解决大数据量下的各种报表使用问题

    在我们日常制作报表分析过程中,总会遇到各种问题.比如,报表底层数据日益增多.报表加载超慢,这些情况该怎么解决? 数据库是最常见的能处理大数据的计算方案,而永洪能利用数据库来完成数据计算.但是,有些报表 ...

  5. TensorFlow和Keras解决大数据量内存溢出问题

    NVIDIA DLI 深度学习入门培训 | 特设三场! 4月28日/5月19日/5月26日一天密集式学习  快速带你入门阅读全文> 正文共5771个字,1张图,预计阅读时间10分钟. 内存溢出问 ...

  6. MyBatis Plus 解决大数据量查询慢问题

    分享知识 传递快乐 大数据量操作的场景大致如下: 数据迁移 数据导出 批量处理数据 在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理.但有些情况不需要分页的方式 ...

  7. 【Oracle EBS】解决大数据量Excel报表打开缓慢问题

    1.问题描述: Oracle EBS 使用XML/EXCEL模板进行报表开发,遇到大数据量时,生成的EXCEL文件通常有几百M,打开十分缓慢. 2.解决方案: 通过ORACLE标准excel文件生成工 ...

  8. 在.Net环境下使用elasticsearch实现大数据量的搜索

    Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. Elastic ...

  9. Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?

    Elasticsearch 提供的首个近似聚合是 cardinality 度量.它提供一个字段的基数,即该字段的 distinct 或者unique 值的数目.它是基于 HLL 算法的.HLL 会先对 ...

最新文章

  1. MyBatis -- 结果集映射
  2. CobarClient源码分析
  3. 《程序是怎样跑起来的》第一章
  4. LLLYYY的数字思维
  5. html中css信封怎么表示,CSS3信封形状
  6. ruby hash添加数据_如何在Ruby中向Hash添加元素?
  7. 网站统计功能的设计与实现
  8. HCIE-RS面试--STP选举原理,状态机和接口角色
  9. 计算电磁学(三)有限差分方法
  10. raft算法 java_raft-java首页、文档和下载 - 分布式一致性算法 Raft 的 Java 实现 - OSCHINA - 中文开源技术交流社区...
  11. 卢松松博客专访胡茬:解密程序员互联网创业历程
  12. python爬取高校课程信息进行选课实战
  13. oracle Net manger配置网络服务
  14. Flutter 开屏方案
  15. python串口控制8通道继电器方法笔记
  16. 洛谷P1603 斯诺登的密码 题解
  17. Composite(组合模式)
  18. DXP出现Un-Routed Net Constraint报错的一种情况和解决方法
  19. 超声波测距仪编程_简易超声波测距仪的制作
  20. 什么场景下比较适合使用BGP服务器?

热门文章

  1. #pragma DATA_SECTION的使用
  2. 你绝对没用过的三电源切换电路
  3. 【python教程入门学习】ASCII码一览表,ASCII码对照表
  4. 怎样在表格中选出同一类_如何让excel表格中的几列数据相同的名称数据排列
  5. Win10安装Selenium+Chrome+ChromeDriver(应用代码无需设置路径)
  6. selenium Element is not clickable because another element obscures it — 点击被页面上其他元素遮住的控件,亲试有效!!!
  7. CVPR2017 | G-RMI_Google大佬构建的姿态估计baseline
  8. 让人无语的交通拥挤费
  9. 拼多多买菜入驻永善县了,支持自提!
  10. 浏览器flash过期无法使用完美解决