HBase 实践 | 如何破解 HBase+ElasticSearch 组合使用遇到的难题
共 4224字,需浏览 9分钟
·
2021-05-19 01:37
一.背景介绍
HBase与ElasticSearch是现代应用在处理海量数据的技术架构会经常被使用的两款产品,其中HBase是一个分布式KV系统,具有灵活Schema、水平扩展、低成本、高并发的优势,但在复杂查询、分析能力方面相对比较弱,特别适合海量半结构化、结构化数据的低成本存储和在线高并发查询。而ElasticSearch是一个分布式搜索引擎,具有灵活Schema、水平扩展、检索快的优势,但在成本、查询并发、一致性方面相对不足,特别适合海量半结构化、结构化数据的复杂查询和全文检索。
HBase与ElasticSearch两者有类似的灵活数据结构和分布式扩展性,又有各自鲜明的特点,一个擅长存,一个擅长取,为了取长补短,所以业界会经常将两者结合使用,把Elasticsearch作为HBase中部分字段的索引存储,从而同时实现低成本存储+高并发吞吐+高效检索的效果,典型场景如日志、监控、账单、用户画像等。
二.HBase与ES的组合使用
当应用决定组合使用HBase+ES的时候,核心要解决数据写入、数据查询这两个问题,即数据如何准确写入到两个系统,数据又如何从两个系统查询合并,目前常见的方案有三种:
1)应用双写双读:应用需要同时与HBase、ElasticSearch独立交互,其优点是不需要引入额外依赖,应用可以根据自身需求,定制或简化写入分发和查询合并的逻辑,但缺点也比较多,包括开发成本高、维护复杂、写入Latency增大、可用性下降、一致性解决困难等。
2)数据自动复制,应用双读:应用在写入链路只与HBase交互,在查询链路仍与两个系统交互,其优点是写入过程对应用保持透明,较容易保证最终一致性,ES系统异常后也不会影响写入,但缺点是需要额外开发维护一套数据同步服务,应用查询数据的复杂性仍然较高
3)利用触发器,应用只读写HBase:应用在读写链路只与HBase交互,利用HBase Coprocessor功能,在HBase表上挂载读写触发器,其中写触发器负责数据写入HBase的同时自动往ElasticSearch写入,读触发器负责解析Scan语句中的查询表达,自动根据存储在ElasticSearch的索引字段进行加速,并与HBase中查询到的整行数据进行合并后,返回给客户端。所以,总的来说,这套方案的优点是应用的读写逻辑比较简单,只需要和HBase交互,但其缺点是其开发非常复杂,需要对HBase及其Coprocessor功能有深入理解,开发足够健壮的读写触发器,并将复杂多条件查询和数据检索的需求嵌入到HBase的查询框架中。同时,一致性、可用性、写入Latency这几个问题也依然存在。
通过上述三个方案的介绍,我们可以发现HBase+Elasticsearch的组合使用过程中会碰到以下几个痛点:
1) 开发维护成本巨大,需要开发和维护数据实时同步、数据查询合并、索引字段增删管理、历史数据索引构建等多个能力,这依赖于开发者对HBase和ES系统的深入掌握,否则很容易造成数据错误。
2) 数据一致性弱,由于数据写入ES后无法立即可见,并且HBase到ES之间的异步数据复制,所以会造成应用侧的数据不一致性,导致出现数据从HBase可以查到,但从ES查不到的现象。
3) 部署成本高昂,HBase与Elasticsearch都是分布式架构,但前者使用存储计算分离架构,后者使用存储计算耦合架构,使得两个系统间的资源无法共享复用,碎片化浪费加大。
4) 可用性和吞吐下降,由于HBase的并发吞吐能力远大于Elasticsearch,对于数据串行写HBase、Elasticsearch两个系统的方案,会导致写入延迟上升,吞吐下降到ES水平,并且可用性也随之下降。
5) 部分功能失效或衰退,数据生命管理周期(TTL)是一个HBase与ES都具备的常用功能,但两者对其执行有一定的差异化,会导致部分数据在一个系统中已经过期淘汰,但在另一个系统还保留着的间歇性现象。多版本是HBase中的常用功能,可以还原乱序写入数据的顺序性,但Elasticsearch并不支持,所以两者组合后就无法继续使用该功能,否则会出现不可预测的奇怪现象。
6) 非Java开发者使用困难,两个系统的服务端都是使用Java开发,上述方案二和方案三中的数据同步组件和触发器,都需要Java开发,对非Java开发者并不友好。
三.Lindorm Searchindex介绍
除了HBase+Elasticsearch的组合,Elasticsearch与MySQL、MongoDB、Cassandra等系统的组合也经常被用在各个业务场景中,这种数据库+搜索引擎的多套系统组合方案普遍具有类似的开发维护复杂、成本高昂、一致性弱等痛点。基于此情况,阿里云数据库Lindorm着力打造了企业级特性Searchindex,帮助用户更加简单、高效、低成本地应对海量数据的存储检索需求。
云原生多模数据库 Lindorm 是一个适用于任何规模、多种模型的数据库服务平台,支持海量多样化数据的低成本、实时在线的存储检索分析,提供宽表、时序、搜索、文件等多种数据模型,兼容HBase/Cassandra、OpenTSDB、Solr、SQL、HDFS等多种开源接口,是互联网、IoT、车联网、广告、社交、监控、游戏、风控等场景首选数据库,也是为阿里巴巴核心业务提供支撑的数据库之一。
Searchindex是Lindorm宽表提供的一种新型索引,用户只需简单的SQL语句即可管理索引的增删和构建,数据读写也可以使用统一的SQL访问,在使用体验上与传统数据库的二级索引一致,但其具备强大的全文索引和复杂条件查询能力,这背后是因为相关索引数据由基于Lucene的分布式搜索引擎LindormSearch管理,通过倒排索引、BKD-Tree、Bitmap等数据结构大幅提升海量数据的筛选速度。
让我们看一个具体的使用例子:
原始表
CREATE TABLE myTable (
id bigint,
name text,
age int,
sex text,
city text,
address text,
PRIMARY KEY (id)
) ;
需求对 姓名(name)、年龄(age)、性别(sex)、城市(city)、地址(address) 建立全文索引
CREATE SEARCH INDEX myIndex ON myTable WITH COLUMNS (name, age, sex, city, address);
注意:索引列的先后顺序不影响,即索引列(c3, c2, c1)与索引列(c1, c2, c3)最终的效果是一致的。
查询
1)标准查询语句
模糊查询:SELECT * FROM myTable WHERE name LIKE '小%'
多维查询排序:SELECT * FROM myTable WHERE city='杭州' AND age>=18 ORDER BY age ASC
多维查询翻页:SELECT * FROM myTable WHERE name='小刘' AND sex=false OFFSET 100 LIMIT 10 ORDER BY age DESC
2)高级查询语句
多维查询排序:SELECT * FROM myTable WHERE search_query='+city:杭州 +age:[18 TO *] ORDER BY age ASC'
文本检索:SELECT * FROM myTable WHERE search_query='address:西湖区'
从上面的例子可以看到,用户只要了解基本SQL,无需开发,即可使用Lindorm Searchindex。通过该特性,可以完全解决HBase+Elasticsearch组合使用遇到的难题,具体来说,有如下优势:
1) 简单易用,作为一个数据库特性,开箱即用,索引增删、索引构建、存储优化等全部通过SQL命令控制,无需额外的开发和维护。
2) 统一SQL访问,数据的读写都通过SQL进行,并且服务端会自动选择最合适的索引,加速查询。
3) 数据多一致,相比于Elasticsearch的数据写入后无法实时可见的缺点,LindormSearch支持数据写入后立即可见,所以Lindorm Searchindex提供强一致和最终一致两种模式
4) 低成本,表的原始数据和索引数据共享存储,大幅减少资源碎片
5) 功能完整,TTL、多版本等核心功能可以在Searchindex中继续正常使用
6) 支持多种开发语言,应用可以通过Java、C++、Python、Go等主流开发语言,使用该特性
关于Lindorm Searchindex的更多技术实现,可以参考文章《深度解析Lindorm全文索引(SearchIndex)技术》
四.总结
面对海量数据的低成本存储+高效检索的需求,业界通常使用HBase+ElasticSearch的组合方案,但该方案存在开发维护复杂、数据一致性弱、部署成本高、原功能失效等难题,其他常见的MySQL/MongoDB/Cassandra的组合使用也有类似的痛点。基于此情况,阿里云数据库Lindorm着力打造了企业级特性Searchindex,可以完美解决HBase+ElasticSearch组合使用遇到的难题,帮助用户更加简单、高效、低成本地应对海量数据的存储检索需求。
感谢您的阅读,也欢迎试用体验SearchIndex,可参考使用手册,技术交流欢迎加入钉群:35977898