为了实现在线库的复杂查询,你还在双写吗?

一、在线库不支持在线复杂查询

做在线业务的开发者经常会碰到这样的难题:在线数据库上面运行稍微复杂点的查询,在线业务就挂了!不管是单机数据库如MySQL、PG,还是分布式数据库,HBase、MongoDB、Cassandra都有这个问题。下面,本文就以HBase为例对该问题进行说明,其他库原理类似。

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为例,举几个用户遇到比较多的问题。

  1. 一致性难以保证
    双写很难保证在线库跟检索引擎的一致性。比如,两个链接并发双写,并且有修改的操作,那么很难保证HBase中同一字段的写入顺序跟Solr中同一个doc的修改顺序一致,那HBase和Solr中数据就出现了不一致,而且出现问题很难排查;另外,在线库往往只需要保存最近一段时间的数据,超过TTL的数据会被自动清理掉,而Solr中同样会有这个需求。但是HBase是按照KV做TTL的,Solr是按照doc,那两者在做数据清理的时候同样会出现不一致。不一致的场景有很多,这里就不一一介绍了。
  2. 写入性能下降
    相同配置下,HBase的吞吐要比Solr高很多,这源于软件设计的出发点不同,优化的方向不同等诸多因素。如果双写,那势必会导致Solr的写吞吐限制了HBase的写吞吐。
  3. 历史数据的同步
    双写只是解决了新数据的问题,对于历史数据则不适用,用户需要自己解决历史数据批量同步问题。特别是,对于不能停机的场景,在历史数据rebuild过程中,如何解决跟新数据跟历史数据相互覆盖的问题,也是十分棘手的问题。
  4. 冗余存储空间
    检索引擎专门解决索引问题,其数据存储格式要比在线库要更复杂,一份在线库的数据在检索引擎中可能需要存储多份,比如原始数据存储,倒排索引存储,为提升聚合和排序的列存DocValue的存储。那么,势必有存储冗余的问题,如何降成本也是一大挑战。
  5. 稳定性
    双写要求HBase和Solr同时保证稳定性,如果Solr出现故障,写流程会被block住,对在线业务造成影响。

三、HBase + Solr易用性不足

阿里云HBase Solr全文检索引擎,采用在系统层做数据转换和同步的方式一站式解决了用户使用双引擎遇到的大部分问题。但是,试用过的用户会有一个体会,就是使用太灵活了,步骤也比较繁琐,容易出问题,如果不是资深玩家难以驾驭。下面举几个用户痛点:

  1. 使用门槛高
    用户需要同时理解HBase、Solr、Indexer(数据同步服务),同时操作HBase Shell,Indexer命令行,Solr界面三个途径才能把流程走通。
  2. Schemaless的HBase跟强Schema的Solr数据类型难以保证对齐
    首先,用户要自己定义从HBase column到Solr field的映射;其次,用户要自己保证实际写入到HBase中的类型正确。比如HBase中一个列对应Solr中一个long类型,因为HBase API并不检查用户实际写入的数值是否合法,导致写入HBase成功,但是同步到Solr是通不过的。这就要求用户要自己基于HBase API写一套类型检查系统,费时费力。
  3. HBase + Solr对于数据冗余存储的问题解决不友好
    用户需要自己决定Solr中是否开启stored,docValued选项,对于只开启indexed选项的Field,用户可以通过回读HBase的方式来拿到最终结果数据,而对于开启了stored或者docValued的Field,直接从Solr中返回结果性能会更好。这套优化的逻辑需要用户自己管理和实现。

四、SearchIndex灵活易用一体化在线库引擎

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服务可以后续单独开通,单独升级管理。欢迎感兴趣的开发者共同交流。


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

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

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

相关文章

JUC 中断线程的3种方式

文章目录介绍中断方式一中断方式二中断方式三源码解析总结介绍 三个方法: 1、public boolean isInterrupted()判断线程是否被中断,如果此线程已被中断,则为true ;否则false 。 2、public void interrupt()中断线程 3、public …

RuoYi-Cloud 进阶篇_04( Seata 高可用集群 AT模式 需求实战)

需求背景: 模拟下单场景:首先去在自己的本地创建一条下单记录,同时,还要去调用库存服务,执行减库存操作。 这里演示一个客户下订单的流程服务来为小伙伴们进一步了解一下分布式事务到底如何使用? 首先,我…

基于Tablestore多元索引打造亿量级店铺搜索系统

一、方案背景 对于一套GEO管理系统,其核心点与瓶颈在于数据库的存储性能与查询能力;一方面,存储服务需要应对海量数据的低延迟存、读,另一方面,存储服务也要提供高效的GEO多维度数据检索。表格存储(TableS…

Java中的序列化与反序列化机制

文章目录一、序列化的定义二、为什么需要序列化呢?三、如何序列化四、案列实现4.1、将对象序列化位二进制流4.2 将序列化后的二进制流反序列化为对象五、总结一、序列化的定义 💡 所谓的序列化就是将Java 中的对象转换成一种流的形式(二进制…

今天起,我们喝的百年牛奶要变了!

一天从一杯光明奶开始,是很多小伙伴的日常:牛奶下肚,醇厚、香甜的奶味仍余舌尖。如今,这家百年老字号正在不断焕发新能量。 今天,光明乳业与阿里云达成战略合作。双方将整合优质资源,形成聚合效应&#xf…

Spring 从入门到入土——AOP 就这么简单!| 原力计划

作者| 冢狐责编 | 夕颜出品 | CSDN博客什么是AOP?面向切面编程(Aspect Oriented Programming),通过预编译的方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点&#xff…

RuoYi-Cloud 进阶篇_03( Seata 高可用集群与 NacosConfig配置中心整合)

文章目录1. 创建文件config.txt2. 创建nacos-config.sh3. 配置导入nacos配置中心4. 配置验证1. 创建文件config.txt 在seata的安装文件夹下创建文件config.txt [rootnode2 ~]# cd /app/seata/seata-server-1.4.2/ [rootnode2 seata-server-1.4.2]# vim config.txt 说明&#…

基于 Tracing 数据的拓扑关系生成原理

背景 随着互联网架构的流行,越来越多的系统开始走向分布式化、微服务化。如何快速发现和定位分布式系统下的各类性能瓶颈成为了摆在开发者面前的难题。借助分布式追踪系统的调用链路还原能力,开发者可以完整地了解一次请求的执行过程和详细信息。但要真…

一条命令导出MySQL表结构xls

文章目录🌱介绍🌷一、先尝鲜💘二、导出失败的看过来🐒三、原理🐷总结🌱介绍 🌷一、先尝鲜 🍃执行下面SQL语句,将会发生神奇的事情😁 SELECT 字段名称,数据…

揭秘2019双11背后的云网络 – 双11网络架构和洛神系统

图1 天猫双11成交额 2019年天猫双11成交额,2684亿!核心系统100%上云!全球最大流量洪峰,阿里云扛住了。 狂欢背后的技术栈 网上轻松购物体验实际上是背后复杂的技术组成的,这是一个简化的通用电商系统架构&#xff0…

拿专属内推码!一汽-大众专场直播招聘来了

作者 | 张红月出品 | CSDN遇见OFFER开学即毕业毕业即失业线下宣讲招聘统统被按下了暂停键迷茫,焦虑,惶恐而HR却说,今年招人太难了腾讯总监甚至路边摆摊招聘2020年各大企业纷纷开启线上模式CSDN作为深受开发者喜爱的社区以用户为本特开设遇见O…

vmware workstation 12 打开vm18 不兼容问题解决

由于需要让别人给我发了一下xp系统的虚拟机,可是打开后,却显示:配置文件“”是由VMware产品创建,但该产品与此版VMware workstations 不兼容,因此无法使用。 解决方案: 分析: 出现这种情况主要…

阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器

为什么要做这个工具? 由于阿里云上的容器服务 ACK 在使用成本、运维成本、方便性、长期稳定性上大大超过公司自建自维护 Kubernets 集群,有不少公司纷纷想把之前自己维护 Kubernetes 负载迁移到阿里云 ACK 服务上。在迁移过程中,往往会碰到一…

短网址系统设计与实战

🎨领域:Java后端开发🔥收录专栏: 系统设计与实战 🐒个人主页:BreezAm 💖Gitee:https://gitee.com/BreezAm ✨个人标签:【后端】【大数据】【前端】【运维】 文章目录&am…

“我,懂数据,不怕被裁”:这项核心能力到底有多香?

我见过市面上很多的 Python 讲解教程和书籍,他们大都这样讲 Python 的:先从 Python 的发展历史开始,介绍 Python 的基本语法规则,Python 的 list, dict, tuple 等数据结构,然后再介绍字符串处理和正则表达式&#xff0…

RuoYi-Cloud 登陆 /code 获取验证码出错

文章目录1. 异常信息2. 分析定位3. 解决方案1. 异常信息 [网关异常处理]请求路径:/code,异常信息:Invalid value ‘KaptchaTextCreator’ for config parameter ‘kaptcha.textproducer.impl’. 2. 分析定位 如果不修改包名的话,默认不会出现此问题,…

谁顶住双11的世界级流量洪峰?神龙架构负责人等9位大牛现场拆解阿里秘籍

阿里江湖中,很多资源和技术,如神龙服务器、OceanBase、POLARDB等等,在开源、自研、云这三架马车上形成协同效应,既是内功也是武器。 “不是任何一朵云都能撑住这个流量。中国有两朵云,一朵是阿里云,一朵叫…

如何回答性能优化的问题,才能打动阿里面试官?

阿里妹导读:日常工作中,我们多少都会遇到应用的性能问题。在阿里面试中,性能优化也是常被问到的题目,用来考察是否有实际的线上问题处理经验。面对这类问题,阿里工程师齐光给出了详细流程。来阿里面试前,先…

RuoYi-Cloud [网关异常处理]请求路径:/code,异常信息:null

文章目录1. 现象2. 分析定位3. 解决方案1. 现象 nacos配置文件中有值,但是代码初始化时未赋上值 2. 分析定位 既然nacos已经配置了,获取不到只能存在二种情况, 第一种:获取的不是最新的nacos的配置 第二种:没有…

这 10 行比较字符串相等的代码给我整懵了,不信你也来看看

来源 | 程序猿石头责编 | Carol 封图 | CSDN 下载自视觉中国先直接上代码&#xff1a;boolean safeEqual(String a, String b) {if (a.length() ! b.length()) {return false;}int equal 0;for (int i 0; i < a.length(); i) {equal | a.charAt(i) ^ b.charAt(i);}return …