作在线业务的开发者常常会碰到这样的难题:在线数据库上面运行稍微复杂点的查询,在线业务就挂了!不论是单机数据库如MySQL、PG,仍是分布式数据库,HBase、MongoDB、Cassandra都有这个问题。下面,本文就以HBase为例对该问题进行说明,其余库原理相似。html
HBase做为海量在线存储引擎,被普遍应用于推荐、风控、物联网、画像、表单等大数据场景。Phoenix做为HBase的SQL层,极大下降了用户使用门槛,而且实现了二级索引、加盐表、动态列等大量实用功能。HBase底层存储基于LSM,LSM能将业务的随机写转为顺序写,能有效提高写吞吐,可是其查询只适合于Rowkey的前缀匹配,查询模式单一;Phoenix二级索引,底层是跟原表关联的索引表,一样也是前缀匹配,一个表能够有多个索引,这样能够增长查询模式,可是索引数目不能太多,不然写放大的问题会比较严重。数据库
对于更加复杂的查询场景,好比表单、日志查询里面的模糊查找,用户画像里面的随机条件组合等等,HBase + Phoenix的组合就不能支持。该问题是基于LSM的NoSQL在线数据库的通用问题,除了HBase,Cassandra、LevelDB、RocksDB、MongoDB引擎等都有相同的问题。架构
有开发者选择在备库上作复杂查询,不过前面提到在线库自己的查询能力每每有限,要么很慢,要么就查不出来,知足不了在线复杂查询的实时性要求。并发
为了解决问题1,用户天然会想到借助检索引擎,好比ES、Solr、Lucene等来解决该问题。很多用户选择的是双写的方式,也就是每一条记录同时写在线库和检索引擎,该方式看起来简单,但实际使用过程当中问题不少。咱们了解到的case,把这套方案解决较好的客户每每都是要投入月级别的时间和大量人力。下面以双写HBase和Solr为例,举几个用户遇到比较多的问题。less
阿里云HBase Solr全文检索引擎,采用在系统层作数据转换和同步的方式一站式解决了用户使用双引擎遇到的大部分问题。可是,试用过的用户会有一个体会,就是使用太灵活了,步骤也比较繁琐,容易出问题,若是不是资深玩家难以驾驭。下面举几个用户痛点:分布式
SearchIndex是阿里云HBase SQL(Phoenix)基于HBase + Solr双引擎的新的索引实现,其架构如上图所示。Phoenix层将SQL(DDL、DML)语句转化为对HBase和Solr的具体操做,SearchService负责索引同步,一致性,元数据管理等。SearchService内部会统一管理HBase中TimeStamp和Solr中DocVersion的对应关系,来实现最终一致性。简单来讲,Solr一行数据的DocVersion等于当前已被同步的HBase对应行各个column的TimeStamp最大值,在解决乱序时,若是前面新的cell已经被同步了,老的cell则被直接丢掉便可。而对于TTL问题,咱们实现了基于行的HBase Compaction机制,来保证一致性。性能
SearchIndex解决了前面提到的全部问题,用户只须要几分钟,几条SQL语句就能够跑通整个流程,可参考快速开始文档;Phoenix强类型直接映射Solr类型,并支持分词、Array等复杂类型;自适应回查的优化策略更好解决了数据冗余存储问题。相比于HBase Solr全文检索引擎,大大提升了易用性,而且覆盖绝大部分的场景和需求。但目前SearchIndex还不能彻底取代HBase + Solr,对于资深玩家,比较喜欢直接写HBase API和Solr API带来的灵活性,仍然能够选择使用HBase Solr全文检索引擎的方式。大数据
SearchIndex是针对阿里云公共云客户定制开发的一体化云原生在线NoSQL数据库引擎,具备低成本、灵活、易用、稳定等特色,已经被用于物流巴枪、线下支付表单、电商表单、医药实验日志等行业和场景,用户数据量已达数百亿规模,经历过双十一的考验。用户第一步能够只购买HBase实例,全文服务和SQL服务能够后续单独开通,单独升级管理。欢迎感兴趣的开发者共同交流。优化
本文做者:明朔ui
本文为云栖社区原创内容,未经容许不得转载。