【玩转ElasticSearch】降维打击!使用ElasticSearch作为时序数据库

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 本篇分享最近把ElasticSearch当作时序数据库来用的心得。• 需求需求是这样的:提供一个后台,选用户画像标签(多选),点确认后弹出“选出了xxx个用户”,再继续点就把用户dump出来、推送消息。现在要做这个后台的数据仓库层。详细分析一下需求:1. 我们的用户画像走流式计算,每秒大量更新,所以对插入/更新性能要求很高。2. 查询条件翻译成SQL就是类似 se
本篇分享最近把ElasticSearch当作时序数据库来用的心得。


• 需求

需求是这样的:提供一个后台,选用户画像标签(多选),点确认后弹出“选出了xxx个用户”,再继续点就把用户dump出来、推送消息。现在要做这个后台的数据仓库层。

详细分析一下需求:

1. 我们的用户画像走流式计算,每秒大量更新,所以 对插入/更新性能要求很高

2. 查询条件翻译成SQL就是类似 select count(*) from `table` where (`tags` like '%tag1%') and (`tags` like '%tag2%') and (`tags` like '%tag3%') and ..., 常规数据库算起来比较慢

需要一个数据仓库,支持大量插入/更新、大量导出、快速多字符串匹配查询。

于是一开始的选型是用 时序数据库InfluxDB。这里贴一张截至当前的时序数据库排名(2017-03 popularity ranking of time Series DBMS )。



很不幸的是,单机版InfluxDB在压测环节爆了,顶不住插入/更新的量。而分布式InfluxDB又闭源了。接下来尝试了一下ElasticSearch,于是就有了这篇文章了。


• ES能干这个事么?

还真能。

1. 插入/更新性能高

ES通过 bulk接口,可以做到批处理,拥有相当高的插入/更新性能。

2. 查询效率高

ES的 text类型的数据在插入/更新时,会被默认分词器把空格隔开的字符串做 分词。在处理如 where (`tags` like '%tag1%') and (`tags` like '%tag2%') and (`tags` like '%tag3%') and ... 这样的查询条件时,用的是 倒排索引算法Inverted index - Wikipedia)而不是字符串匹配,效率极高。

3. 导出效率高

用ES的 scroll接口可以做到这么一件事: 1)进行一个查询,指定翻页大小、本次查询的索引保存时间,获取一个scroll_id; 2)通过scroll_id不断地翻页。可以实现大批量导出一个查询的所有数据,不需要重复计算。

4. 高可用与横向扩展能力

就不赘述了。


• 实现与优化

1. 用了3个Node组成的集群,全SSD。3个刚好是满足高可用的最小Master Node数量。每个Node的内存开到31G。

2. ES前面顶一层Logstash,Logstash开一个http-input和elasticsearch-output,用HTTP Keep-Alive来接流量。关键配置有:

1)input.http.threads默认是4,要开大;

2)output.elasticsearch.action => "update",output.elasticsearch.doc_as_upsert => true,这样可实现upsert操作;

3)pipeline.workers跟pipeline.output.workers开到跟核数一致;

4)pipeline.batch.size跟output.elasticsearch.flush_size适度开大。

3. 整个流程是数据怼Logstash、Logstash怼ES,所以会有ES的数据延后几秒才更新的情况,这样可能会引起一些问题,需要务必留意。

4. ES5.0取消了ttl,所以数据的过期要另外处理。

5. ES的scroll查询中,通过配置_source来提取部分字段,可以大幅降低网络I/O。


• 一些惊喜

我们往ES里存的标签是没去重的原始数据,就是说一个用户的标签可能长这样:

A B A A A C D A

而ES本质上是个搜索引擎, 使用默认的BM25算法搜索用户,排在前面的就自然是重度用户

非常不错。


• 总结

ElasticSearch除了用来干搜索、运维监控之外,还能用来当时序数据库。在这个Case里,算是 对InfluxDB等时序数据库产品做降维打击了,真乃居家旅行、杀人越货的神器。
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
9月前
|
JSON 自然语言处理 数据库
数据库-ElasticSearch入门(索引、文档、查询)
数据库-ElasticSearch入门(索引、文档、查询)
407 0
|
5月前
|
存储 SQL 缓存
数据库测试|Elasticsearch和ClickHouse的对决
由于目前市场上主流的数据库有许多,这次我们选择其中一个比较典型的Elasticsearch来和ClickHouse做一次实战测试,让大家更直观地看到真实的比对数据,从而对这两个数据库有更深入的了解,也就能理解为什么我们会选择ClickHouse。
数据库测试|Elasticsearch和ClickHouse的对决
|
9月前
|
缓存 关系型数据库 Java
不要将数据库中的“分库分表”理论盲目应用到 Elasticsearch
不要将数据库中的“分库分表”理论盲目应用到 Elasticsearch
68 0
|
9月前
|
存储 JSON 关系型数据库
Percona XtraBackup是否支持Elasticsearch数据库备份?
【5月更文挑战第13天】Percona XtraBackup是否支持Elasticsearch数据库备份?
55 1
|
9月前
|
NoSQL 关系型数据库 数据库
数据库同步 Elasticsearch 后数据不一致,怎么办?
数据库同步 Elasticsearch 后数据不一致,怎么办?
296 0
|
9月前
|
JSON 自然语言处理 负载均衡
数据库-Elasticsearch进阶学习笔记(集群、故障、扩容、简繁体、拼音等)
数据库-Elasticsearch进阶学习笔记(集群、故障、扩容、简繁体、拼音等)
104 0
|
9月前
|
运维 监控 搜索推荐
数据库-ElasticSearch学习笔记
数据库-ElasticSearch学习笔记
93 0
|
存储 SQL JSON
【数据库】Elasticsearch PostgreSQL 比较:6 个关键差异
【数据库】Elasticsearch PostgreSQL 比较:6 个关键差异
|
自然语言处理 运维 监控
不能不学!从零到一搭建ELK日志,在Docker环境下部署 Elasticsearch 数据库
最近在玩 ELK 日志平台,它是 Elastic 公司推出的一整套日志收集、分析和展示的解决方案。
|
存储 消息中间件 NoSQL
博客数据库要连接Elasticsearch,使用MySQL还是MongoDB更合理
博客数据库要连接Elasticsearch,使用MySQL还是MongoDB更合理
博客数据库要连接Elasticsearch,使用MySQL还是MongoDB更合理

热门文章

最新文章