阿里云HBase增强版全文索引功能技术解析

新用户9.9元即可使用6个月云数据库HBase,更有低至1元包年的入门规格供广大HBase爱好者学习研究,更多内容请参考链接

阿里云HBase增强版(Lindorm)简介

阿里云数据库HBase增强版,是基于阿里集团内部使用的Lindorm产品研发的、完全兼容HBase的云上托管数据库,从2011年开始正式承载阿里内部业务的海量数据实时存储需求,支撑服务了淘宝、支付宝、菜鸟、优酷、高德等业务中的大量核心应用,历经双十一、春晚、十一出行节等场景的大规模考验,在成本、性能、稳定性、功能、安全、易用性等方面相比社区版拥有诸多优势和企业级能力,更多介绍可以参考Lindorm帮助文档(https://help.aliyun.com/document_detail/119548.html)

当大数据存储遇上复杂查询

HBase是目前广泛使用的NoSQL数据库,其具有Schemeless特性,高吞吐,海量存储和无限水平扩展的特性,因此被很好地应用在了推荐、风控、物联网、画像、表单等所有大数据场景。但是原生的HBase只支持Rowkey索引,即按rowkey的二进制排序的索引。HBase的Scan请求可基于此rowkey索引高效的执行整行匹配、前缀匹配、范围查询等操作。但若需要使用rowkey之外的列进行查询,则只能使用filter在指定的rowkey范围内进行逐行过滤。若无法指定rowkey范围,则需进行全表扫描,不仅浪费大量资源,查询RT也无法保证。

为了解决用户基于非主键列的查询问题,阿里云HBase增强版(Lindorm)内置原生的全局二级索引功能,对于列较少且有固定查询模式的场景来说,阿里云的高性能二级索引方案能够完美解决此类问题,同时仍保持强大的吞吐与性能。这个索引方案在阿里内部使用多年,经历了多次双11考验,尤其适合解决海量数据的全局索引场景。关于高性能二级索引,用户可以参考《数据查询的玄铁剑:Lindorm二级索引功能解析》一文(https://developer.aliyun.com/article/740009 ), 同时,社区也有Phoenix,在HBase之上提供了插件式的二级索引以及SQL能力,使用SQL可以比较简单地表达一些复杂查询。

但是,当面对更加复杂的查询,比如表单、日志查询里面的模糊查找,用户画像里面的随机条件组合查询等等,二级索引方案会显得力不从心。而这些查询,正是搜索引擎的优势。
image.png
Solr是分布式全文检索的最佳实践之一。Solr支持各种复杂的条件查询和全文索引。通过智能集成Solr,Lindorm可以充分发挥海量数据的实时存储和检索能力,使得其可以高效支撑于:需要保存大数据量数据,而查询条件的字段数据仅占原数据的一小部分,并且需要各种条件组合查询的业务。例如:

  • • 常见物流业务场景,需要存储大量轨迹物流信息,并需根据多个字段任意组合查询条件
  • • 交通监控业务场景,保存大量过车记录,同时会根据车辆信息任意条件组合检索出感兴趣的记录
  • • 各种网站会员、商品信息检索场景,一般保存大量的商品/会员信息,并需要根据少量条件进行复杂且任意的查询,以满足网站用户任意搜索需求等。

数据同步的难题

要想在Lindorm中集成Solr,必须想办法将业务写入Lindorm的主表数据实时索引到Solr中,然而存储主表数据的宽表引擎和存储索引数据的Solr检索引擎有很大的差异性,比如数据模型上,两者差别较大,写入能力上,也有巨大的差异。针对宽表与检索两种异构引擎间的数据同步,目前市面上主要有两种类似的方案:

应用双写

双写是最容易想到,也是最容易实现的方案。以用户自己维护的双写HBase+Solr为例:
业务将数据写入HBase的同时,也将同样的数据写入Solr即可。有些用户使用了HBase的Coprocessor功能,hook了HBase的写入逻辑,在HBase完成写入时,在Coprocessor中写入solr,本质上也是双写HBase和Solr
image.png
但双写HBase和Solr存在非常多的问题,需要用户自己去解决:
一致性难以保证

  • 当HBase写入成功,Solr写入失败,或者HBase写入失败,Solr写入成功都会造成数据不一致,用户需要自己处理此类情况。
  • HBase支持更新部分列,而Solr只能整行更新,因此当更新HBase后,还需要在HBase中读取整行数据,才能写入Solr,当有多个线程同时修改一行时,会导致HBase和Solr中的数据不一致。
  • 就算用户写入HBase时是整行全量更新,无需回读,写入HBase和写入Solr并不是原子更新,很难保证HBase的写入顺序跟Solr中的修改顺序一致从而导致数据不一致问题

稳定性降低
双写HBase和Solr等于把HBase和Solr的可用性捆绑在了一起。Solr的可用性会反过来影响HBase的可用性。一旦Solr出现问题,用户要么选择放弃写Solr,放弃数据一致性来确保可用性,要么只能无限重试等待Solr恢复来确保数据一致性,但降低了可用性。在HBase的Coprocessor中写Solr的用户的稳定性问题尤为突出,如果用户没有处理好Solr的抛错和重试时的内存管理,很容易直接造成HBase RegionServer的宕机。
读写能力下降
很多用户选择HBase的主要原因是HBase具有海量吞吐能力,而现在双写Solr等于将HBase的写入能力拉低到了Solr的水平,大部分业务都无法接受。同时双写时需要回读HBase获取整行数据,回读会造成HBase额外的压力,从而进一步降低了HBase的读写能力

开源Lily HBase Indexer

Lily HBase Indexer(下文简称Indexer)是Cloudera推出的HBase和Solr之间的数据同步组件。他利用了HBase的Replication功能,将自己"伪装"成一个HBase的Replication sink集群,当HBase有数据写入时,Replication会通过读取WAL文件获取最新更新传输到Indexer里,然后再由Indexer写入Solr。
image.png
同样,这套方案也存在大量问题:
同步效率低

  • Indexer使用的是Replication框架。在Replication框架下,一行数据的更新需要先要序列化写入WAL,然后通过Replication从WAL中读出反序列化,然后序列化成二进制数据发送到Indexer,Indexer再反序列化成数据才能写入Solr。整个过程非常低效,同步的速率受限于HBase的Replication能力,往往Solr的写入瓶颈还没达到,就已经达到了HBase的Replication瓶颈。
  • Indexer的同步模型是每一个HBase表,都开启一条Replication通道(一个Replication Peer)。有10张HBase表需要同步到Solr,就必须有10个Replication Peer,这意味着同一个WAL,会被读取10次(每个peer都读取一次)随着同步表的增多,对HDFS的压力也就越大。
  • 由于HBase是SchemaLess的,Indexer收到Replication发过来的WAL后,无法知道是否在WAL中有整行数据,因此它必须在写Solr之前回读HBase获取整行数据。因此实际上,WAL中的entry发送过来后,有用的只有rowkey,其他的数据还是要依靠回读,这些WAL entry经历了这么长的发送链路,但大部分信息却是无用的。同时,回读会占用HBase资源,影响HBase稳定性。

数据一致性无法保证
使用Indexer同步HBase到Solr会经常遇到两者之间数据不一致的问题,这也是Indexer的用户吐槽最多的地方。

这些不一致往往发生的非常随机,一般用户也很难查到原因,让人摸不到头脑。我们深入研究Indexer后发现了他的问题所在。由于Indexer依赖了HBase的Replication做同步,而HBase Replication有一个重要的特点就是乱序发送,这对于HBase集群之间的Replication无影响,因为HBase可以用KV的时间戳来保证最终一致。但是Solr是不支持列时间戳的,HBase的写入乱序到达Indexer会导致写入Solr中的数据与HBase不一致。

比如用户有两次更新同一行,。但是在replication过程中, ts2的更新先到Indexer,而ts1的更新后到,这会导致Indexer将Solr中的这行的数据更新成value1,导致HBase和Solr的数据不一致。另外,由于HBase是先写WAL再内存可见,在回读HBase过程中,Indexer也可能没有获取到最新数据导致Solr数据不一致。

同时HBase支持多family,多版本,自定义时间戳,各种类型的删除,Solr模型的支持比较有限,Indexer没有处理好这些问题,我们发现有多个case都会导致HBase和Solr的数据不一致,这里就不一一列举了。
Indexer官方已经不再维护
Indexer社区代码已经4年没有更新,所有的这些问题都不会再修复,这也是使用Indexer的最大风险,面对这些问题和bug,用户只能自行解决。

云HBase增强版(Lindorm)全文索引

通过分析应用双写和开源的Lily HBase Indexer存在的种种问题,Lindorm在研发全文索引功能时,从中吸取相关经验,进行创新的设计,使得宽表和检索两类引擎正确而自然的结合在一起,方便用户即开即用。
image.png

在此方案中,我们选用了自研的BDS组件做Lindorm的宽表引擎到Solr检索引擎间的数据同步。BDS是一个cloud native的HBase生态数据同步服务,可以提供高效的数据实时同步和全量迁移能力,关于BDS的介绍,用户可以参照《BDS - HBase数据迁移同步方案的设计与实践》一文(https://yq.aliyun.com/articles/704977 )。
image.png
在此方案中,我们使用BDS完美解决了Lindorm的宽表引擎和检索引擎Solr因为模型不一致,WAL乱序等等问题带来的数据不一致问题。不管用户是部分更新,多版本,自定义时间戳,多family写入,还是删除行、列,两个引擎之间的数据都不会产生不一致问题(具体的做法在申请专利中,专利申请完成后再专文对外分享)。
同时整个系统采用分布式分层架构,各个组件之间可以独立自由伸缩,BDS服务、Lindorm的宽表引擎服务和检索引擎服务都具备无限的横向扩展能力,从而提供海量数据的无限存储和实时检索。
在使用上, Lindorm全文索引功能非常简单易用,用户可以通过HBase Shell(Lindorm原生API暂未开放)就可以管理同步映射的Schema,BDS对于用户来说是完全透明的。不像在Lily HBase Indexer方案中,用户还需要和Indexer交互,管理schema。具体的操作大家可以参考全文索引使用快速入门的帮助(https://help.aliyun.com/document_detail/161121.html ),简单来说,用户只需要在HBase Shell中执行一条命令,就可以为数据列创建Solr索引

 hbase shell> add_external_index_field 'testTable', {FAMILY => 'f', QUALIFIER => 'money', TARGETFIELD => 'money_f', TYPE => 'FLOAT' }

同时BDS还具有丰富的WebUI界面和监控和报警信息,用户可以非常方便地获取同步状态和报错信息。比如在云监控中,我们可以清晰地看到同步的延迟,同时可以通过订阅报警,随时发现异常。
image.png
最后是 阿里云HBase增强版(Lindorm)全文索引与其他方案的一个对比

方案双写Lily HBase IndexerLindorm全文索引
同步效率受限于Solr受限于HBase Replication,扩展性差受限于Solr
稳定性会影响HBase稳定性会影响HBase稳定性无影响
数据一致性无法保证无法保证可以保证一致性
Cloud NativeN/AN/A云原生,支持扩容,升级配置,同步通道可独立扩展,报警监控一应俱全

案例介绍

目前已经有非常多的公司和业务已经在线上使用Lindorm的全文索引。这里给大家介绍几个使用案例。

某快递公司包裹平台

该快递公司的包裹系统原来使用了Oracle,由于业务的增长Oracle的单表数据过大已经造成瓶颈,并且只能存储1个月的数据。在这么大规模的数据下,上万网点的分析查询已经慢到无法接受的程度。该公司采用了Lindorm全文索引的方案改造之后,不仅可以将可查数据扩展到6个月,在引入Solr做多维查询后,查询能力也比之前好了五倍。

image.png

某O2O公司订单系统

该公司原来的订单查询系统使用了DRDS分库分表,由于订单量巨大,DRDS分32个库都已经只能放下6个月的订单数据。而该公司希望查询系统能够查询所有订单数据。同时由于查询时有多达15个维度条件的随机组合查询,传统的二级索引方案已经无法满足要求。在选用了Lindorm全文索引方案后,得益于Lindorm的海量存储能力,一个表就能放下所有历史数据。由于单个Solr的表索引数据不宜过大,因此该业务使用了我们推荐的Solr分库分表功能(Alias功能),Lindorm宽表存储中的数据自动增量同步到不同的Solr Collection中(按时间分割),在查询时,无需查询全量Solr数据,只需要根据时间维度查询少量Solr Collection。在新方案下,该公司不仅实现了能够在线查询所有历史数据,还能秒级返回查询结果。

image.png

某在线教育公司营销平台

该公司原来的营销平台直接基于MySQL,由于MySQL列不能太多,只能把各个系统的数据分布在多张表内,然后再采用DTS同步的方式,订阅Binlog,再写入到自建HBase的大宽表中。然后把写入事件记在Kafka上,再消费Kafka的消息,回读HBase数据同步到Solr中,最后提供给营销系统使用。整个链路非常长,组件非常多,难以维护,容易出稳定性问题。在使用了Lindorm的全文索引方案后,仅仅使用了一个Lindorm就解决了所有的问题,简单易运维,同时获得了 Cloud native的能力,各个组件都可以无限水平扩展和扩容。

image.png
总结
阿里云Lindorm全文索引方案给广大用户提供了存储与检索的一站式解决能力,相比之前的方案,不仅简单易用,容易维护,同时能够利用Cloud Native的特性解决一系列运维上的难题。在技术上,阿里云Lindorm使用了一种高性能,低延迟的异构存储同步方案,避免了之前一些方案的性能问题,并完美地解决了宽表引擎和检索引擎的模型差异所带来的数据不一致的问题,在后续的计划中,Lindorm还将提供统一的多维查询能力,系统会自动利用Solr索引对多条件查询加速,而无需应用显示地访问Solr,进一步优化使用体验。目前,有大量的公司和用户已经基于此功能打造了他们的在线查询和离线分析系统,欢迎更多的用户前来试用。产品主页:https://www.aliyun.com/product/hbase ,产品使用帮助:https://help.aliyun.com/document_detail/146604.html

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECMAScript 2015~2020 语法全解析

ECMAScript 2015~2020 语法全解析 ( ES6 ~ ES11 ).快速上手 > es.xiecheng.live

架构师技术文档:Redis+Nginx+Dubbo+Spring+架构师精选视频

最近花了很长的时间去搜罗整理Java核心技术好文,我把每个Java核心技术的优选文章都整理成了一个又一个的文档。今天就把这些东西分享给老铁们,也能为老铁们省去不少麻烦,想学什么技能了,遇到哪方面的问题了 直接打开文档学一学就好…

大分区表高并发性能提升100倍?阿里云 RDS PostgreSQL 12 解读

1. 问题 阿里云某客户发现自己使用读写分离实例,master的cpu特别高,而读写分离中承担读流量的slave节点却相对空闲。用户CPU打满后,访问到主节点的的线上服务受到了较大影响。 1.1 读写分离原理 Redis读写分离实例的原理是:key…

vue vant Area组件使用详解

文章目录1. 下载areaList.js2. 组件注册3. 封装组件4. 使用组件5. 效果图6. 项目源码1. 下载areaList.js 见文章末尾 2. 组件注册 main.js引入并注册(一般与Popup一起使用) 全局注册 //全局导入所有组件 import Vant from vant; import vant/lib/index.css;Vue.use(Vant)局…

微软KV Store Faster如何巧妙实现1.6亿ops

作者:叶提 Faster实现主要分为三部分: Epoch Protection框架,实现并发系统下全局修改,延迟同步到所有线程,简化并发设计。faster线程在大多时候不需要同步,完全独立执行。 支持高并发的无锁hash 索引&…

当飞猪遇上 Serverless | 云原生 Talk

来源 | 阿里巴巴中间件责编 | 晋兆雨头图 | CSDN付费下载于视觉中国前言2019 年 3 月,我们跟随着集团的步伐,将 Serverless FaaS 引入到飞猪,并取得了一定的阶段性成果:这一年,我们参与共建了 Node FaaS 研发平台和稳定…

vue ui 面板创建项目安装 axios 时,浏览器卡死的解决办法

目录 踩坑记1. 问题场景2. 解决办法踩坑记 Vue UI 可视化面板创建新项目,当安装完插件,再安装 axios 依赖时,点击 “ 安装 axios ” 按钮居然毫无响应,此时浏览器卡死、cmd 终端无法关闭,更杯具的是,CPU 占用率 100%,也无法关机或重启电脑 😂 。 1. 问题场景 2. 解决…

EdgeRoutine技术专家教你把JS代码跑到CDN边缘

4月27日CDN云课堂中,阿里云智能技术专家洪晓龙在线分享《阿里云CDN轻量编程环境》,对EdgeRoutine的背景、功能、案例实践介绍并在线进行上手操作演示,希望更多用户能够使用CDN轻量编程环境服务自主编程、快速落地实际线上业务。本文为直播分享…

使用手机企业微信创建自己的企业(公司)

文章目录1. 登录企业微信2. 管理企业3. 全新创建企业4. 补充信息5. 效果图1. 登录企业微信 登录手机企业微信,选择设置 2. 管理企业 3. 全新创建企业 4. 补充信息 补充信息全新创建 所在企业:自己给公司起一个名称 行业类型:随机一个或者…

淘宝万亿级海量交易订单存储在哪?

01淘宝交易订单系统介绍 天猫和淘宝每天发生的实物和虚拟商品的交易达到亿级别。考虑到一次成功交易的整个链路,会涉及到会员信息验证,商品库信息查询,订单创建,库存扣减,优惠扣减,订单支付,物…

vue 单文件组件中,输入template 按 tab 键不能自动补全标签的解决办法

1. 操作步骤 选择: 文件 ⇒ \Rightarrow ⇒ 首选项 ⇒ \Rightarrow

企业微信_新建自建H5小程序应用及主页与菜单设置

文章目录一、新建自建H5小程序应用1. 登录企微管控台2. 登录登录手机企微3. 应用管理4. 创建应用5. 效果图二、主页与菜单设置2.1. 应用主页2.2. 菜单设置2.3. 主页与菜单设置的区别一、新建自建H5小程序应用 1. 登录企微管控台 登录企业微信管理后台 2. 登录登录手机企微 …

阿里云助力1药网开辟疫情防控“第二战场”

这一切都要从那天清晨说起 ”人民日报的带货能力太强大了,昨晚一大波流量进来抢药,我们的服务器快撑不住了,谁能帮忙看看这个线上问题?”在大年初七的清晨,1药网的IT总监在阿里云至尊服务群上紧急地寻求着帮助。此时的…

阿里云资深技术专家易立:我对云原生软件架构的观察与思考

来源 | 阿里巴巴中间件作者 | 易立,阿里云资深技术专家,容器技术负责人头图 | CSDN付费下载于视觉中国前言云原生计算包含三个维度的内容,云原生基础设施,软件架构和交付与运维体系,本文将聚焦于软件架构层面。

【MySQL】 如何在“海啸”下保命

作者:田杰 在数据库的日常使用中,来自应用的高并发场景并不罕见,其标志性的表现为 高新连接创建速率(CPS,比如 PHP 短连接)、发送大量请求到 DB 数据库层。 如同 海啸,大量的新建连接和请求猛烈…

企业微信H5_自建应用连接H5

文章目录1. 进入自建应用2. 自定义菜单3. 添加主菜单4. 补充信息5. 点击发布6. 登录手机企微7. 点击菜单8. 第2种效果1. 进入自建应用 找到自建的应用 2. 自定义菜单 点击-自定义菜单-已启用 3. 添加主菜单 点击-添加主菜单 4. 补充信息 补充信息-点击保存 主菜单&a…

【MySQL】时区设置引发的卡顿

作者:田杰 查询执行时间长引发应用感知 “卡顿” 的场景在数据库的日常支持和使用中并不少见,但由于时区设置引发的 SQL 执行“卡顿”仍然是一个有趣的现象,之前没有具体关注过。 这次客户的细致与坚持让我们找到了问题的源头。 1. 名词解释…

老码农90%的程序猿都是瞎努力,这份路线教你成为高手!

数据正在变得越来越常见,小到我们每个人的社交网络、消费信息、运动轨迹……,大到企业的销售、运营数据,产品的生产数据,交通网络数据……如何从海量数据中获得别人看不见的知识,如何利用数据来武装营销工作、优化产品…

企业微信_H5应用如何本地及真机调试_host配置及代理相关

文章目录一、准备工作1. 下载SwitchHosts2. 创建vue项目3. 启动项目3. 请求验证4. 域名访问5. Invalid Host header二、电脑调试2.1. 设置应用主页2.2. PC企微登录2.3. PC企微应用2.4. 更新验证2.5. 跳转页面三、手机调试3.1. 代理软件3.2. 安装,启动3.3. 连接无线网…

揭秘MySQL生态重要功能,X-Engine引擎核心能力——OnlineDDL

概述 X-Engine是阿里自研的数据库存储引擎,以插件的方式接入到MySQL生态,支持行锁,事务,MVCC等OLTP场景的核心功能。 X-Engine的核心优势是低成本,高性价比,尤其适用于历史库场景,目前阿里巴巴…