热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HBase加Solr,

HBase加Solr如何解决分布式系统数据事务一致性问题 (HBase加Solr) 摘要:对于所有的分布式系统,我想事务一致性问题是极其非常重要的问题,因为它直接影响到系统的可用性
HBase加Solr

如何解决分布式系统数据事务一致性问题

 

(HBase加Solr)

 

摘要:对于所有的分布式系统,我想事务一致性问题是极其非常重要的问题,因为它直接影响到系统的可用性。本文以下所述所要解决的问题是:对于入HBase和Solr的过程,如何保证HBase中写入的数据与Solr中写入的数据完全一致。

 

关键词:HBase, Solr, 分布式, 事务, 系统架构, 大数据

 

作者:王安琪(博客:http://www.cnblogs.com/wgp13x/)

  

  

 

一、关于分布式系统事务一致性问题

 

Java 中有三种可以的事务模型,分别称作本地事务模型(Local Transaction Model),编程式事务模型(Programmatic Transaction Model),和声明式事务模型(Declarative Transaction Model)。事务要求包含原子性(Atomicity),一致性(Consistency),独立性(Isolation),和持久性(Durability)。

 

《大型网站系统与Java中间件实践》一书中分享了一些解决分步式系统一致性问题的方案构思与实践,如在第六章中谈到的消息中间件。下表展现了解决一致性方案与传统方式的对比。

 

 

 

传统方式是,我做完了,发你消息。解决一致性的方案的意思就是,我先发你消息,我做完了再跟你确认我做完了。这是改进后的有事务的消息中间件。

 

因为在非XA 环境中,消息队列的插入过程独立于数据库更新操作,ACID 准则中的原子性和独立性不能得到保证,从而整体上数据完整性受到损害。使用X/Open 的XA 接口,我们便能够做到协调多个资源,保证维持ACID 准则。

 

在《淘宝技术这十年》这本书里也提到这么一段描写“用户在银行的网关付钱后,银行需要通知到支付宝,但银行的系统不一定能发出通知;如果通知发出了,不一定能通知到;如果通知到了,不一定不重复通知一遍。这个状况在支付宝持续了很长时间,非常痛苦。支付宝从淘宝剥离出来的时候,淘宝和支付宝之间的通信也面临同样的问题,那是2005年的事情,支付宝的架构师鲁肃提出用MQ(Message Queue)的方式来解决这个问题,我负责淘宝这边读取消息的模块。但我们发现消息数量上来之后,常常造成拥堵,消息的顺序也会出错,在系统挂掉的时候,消息也会丢掉,这样非常不保险。然后鲁肃提出做一个系统框架上的解决方案,把要发出的通知存放到数据库中,如果实时发送失败,再用一个时间程序来周期性地发送这些通知,系统记录下消息的中间状态和时间戳,这样保证消息一定能发出,也一定能通知到,且通知带有时间顺序,这些通知甚至可以实现事务性的操作。”

 

一致性更是可以分为强一致性和弱一致性两种,弱一致性可以允许某一时间间隔内的偶尔不一致,强一致性的要求要高很多。在实际中,弱一致性往往就能达到业务要求,甚至某些银行系统都只要求弱一致性即可,允许不一致性的窗口存在,只要不造成损失即可。

 

对于每一种分布式系统,其组织方式各不相同,实现形式也各有千秋,业务要求更是千变万化,因此要因地制宜的实施一致性方案。表6-5提出的解决办法是要求处理方在完成业务操作后主动发送给消息中间件这一结果,而后消息中间件确认后再做处理,这样是可以保证事务性。但对于表6-5提出的解决办法,在入HBase和Solr的流程中并不能适用。因为为了保证数据写入Solr的性能,入Solr使用的是Concurrent….方式,然而此种方式并不会返回是否入Solr成功,因此这种异步特性不是表6-5中方案所能解决的。

 

 

 

二、针对HBase和Solr分布式系统事务一致性解决方案

 

在此,我们对于HBase加Solr这种分布式系统,经过种种构思-推翻-再构思-再推翻,终于成功,特设计了如下事务一致性解决方案。

 

1、写入数据到HBase和Solr

 

 

 

图1 HBase加Solr分布式系统事务一致性解决方案(写入数据)

 

 

 

从图1时序图中可以看出,其思想与表6-5方案还是一致的,但实现手法则完全不同。它的本质即是:需要确认数据处理成功后,方可证实数据同步。关键在于,如何确认数据处理成功,靠HBase返回?靠Solr返回?不行。那只有做个缓存,先把没确认的存着,等后期有时间了挨个确认。这里的MySQL就起到了方案所述的缓存的作用。我们先把数据写入到MySQL缓存起来,写入时数据状态为0,说明还没有提交HBase和Solr,每间隔3秒我们使用“入库线程”取状态为0的数据,提交到HBase和Solr中,并将数据状态更新为2,以此说明此数据已经入了库。如果没有“核查线程”做数据一致性检查,则数据一致性无法保证。有可能存在这样一种情况:HBase里数据写入成功了,Solr里出于某种原因没有写入成功(Solr异常了或网络不通了等等)。如果此不一致性很久没有被发现,那么就会在HBase中出现一些根本无法取得的飘浮数据。我们的“核查线程”可以保证HBase中和Solr里的数据是一致的。

 

 

 

2、从HBase和Solr中删除数据

 

现在我们已经做到了写入数据操作的事务一致性,同理的还有,删除数据操作的事务一致性,更新数据操作的事务一致性,都可以以这种思想实现。

 

 

 

图2 HBase加Solr分布式系统事务一致性解决方案(删除数据)

 

 

 

从图2中可以看出,删除数据先从Solr中删除,再从HBase中删除,同样的,如果发生某种不可预见的异常,HBase中也会出现一些根本无法取得的飘浮数据,这种情况很少见,然而一旦发生,我们的“核查线程”可以保证HBase中和Solr里的数据是一致的。

 

3、更新数据到HBase和Solr

 

 

 

图3 HBase加Solr分布式系统事务一致性解决方案(更新数据)

 

 

 

更新数据的一致性解决方案要稍微复杂一些,因为对HBase和Solr中数据核查某一数据是否已经正确更新是很难做到的。你可以将HBase中的数据一个个地取出来与更新数据进行比较,查看是否已经正确更新;但你没有办法将更新数据所有的字段去Solr中查,是否更新到Solr。因此我们设计的方案是:先对要更新的RowKey-数据生成一个新的newRowKey,再将HBase和Solr中的原始数据进行删除,然后将更新后的数据添加入HBase和Solr中,这样就是完成了一次更新数据的操作,将更新分成了删除与添加两步进行操作,核查此数据是否已经正确更新也因此有迹可寻,此时只需要搜索HBase和Solr中有newRowKey即可证明数据已经更新成功。

 

 

 

三、总结

 

在这里,我们引用一下《支付宝数据平台》中的海狗系统的架构设计。海狗系统(ARSC)——准实时搜索查询,它提供千亿级别数据实时查询和全文检索、支持每天10亿+级别的数据更新。它的实时性可以保证实时搜索延迟3s、查询和插入TPS > 1.5WTPS。数据容量线性扩展,Schema扩展基于HBase列式无限扩张,基于ZK动态感知节点状态自动容灾。下图即简单表明了其流程。

 

 

 

 

 

 

 

粗看不起眼,琢磨一下便知其是考虑到了HBase和Solr的数据一致性的。在HBase中的MQ表就是起到上面我们的设计方案中的MySQL的作用。在d步骤中,才批量删除处理过的数据,MQ表是留凭证用的。HBase在高性能处理方面还是要远远优于MySQL,如果可以,我们设计方案中的MySQL也可以用HBase取代。

 

做个总结:无论是我们设计方案,还是其他类似的分布式系统事务性解决方案,其的本质思想是一样的,即是:做个缓存,先把没确认的存着,等后期有时间了挨个确认。

 

“既然计算是异步的,那么反馈也应该是异步的,你完全可以让SendMail将发送结果写入数据库,并生成报表,然后让应用程序定期对报告中发送失败的邮件执行再次发送。这里需要假设失败的情况并不是很多。”在《构建高性能web站点》第17章分布式计算-异布计算中对此类问题的解决方法,也是构成我们解决HBase和Solr分布式系统事务一致性问题的重要指导,感谢作者郭欣。当然也感谢《大型网站系统与Java中间件实践》的作者曾宪杰、《构建高性能web站点》的作者郭欣。更感谢分享海狗系统设计的蒋杰(花名:平原君),以及众多乐于分享技术的人们。

 

看这些书,觉得系统架构方面的技术真的是非常庞大,佩服阿里的那群将数据从小做到大的问题解决者。千里之行,始于足下。

 

 

 

 

 

 

 

 

来自王安琪

 

 

作者:
Angel  出处:
http://www.cnblogs.com/wgp13x/  欢迎转载或分享,但请务必声明文章出处。 如果文章对您有帮助,希望你能推荐或关注。

公告

王安琪,英文名Angel,南京邮电大学计算机应用技术硕士学位。 熟悉Java、C#编程语言。专注于WebService、海量数据处理、搜索引擎技术、消息中间件技术、分布式文件存储、.NET应用程序开发、系统架构设计。

主要从事大数据管理系统的研发,项目经理,系统架构师,就职于江苏金陵科技集团有限公司。

Email:aitanjupt@hotmail.com

QQ:289770363 

昵称:
王安琪


推荐阅读
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 达人评测 酷睿i5 12450h和锐龙r7 5800h选哪个好 i512450h和r75800h对比
    本文介绍了达人评测酷睿i5 12450h和锐龙r7 5800h选哪个好的相关知识,包括两者的基本配置和重要考虑点。希望对你在选择时提供一定的参考价值。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 来吹下汽车
    最近帮同事的一个朋友选车,最后他决定了一汽大众的迈腾,也就是海外版(欧洲为主)的帕萨特B8,国内如果加长过的话,应该叫B8L吧。基于大众最新的通用MQB平台(模块化横置发动机平台) ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • 多线程补充(一)JVM内存结构 VS Java内存模型 VS Java对象模型
    一:Java内存结构参考:https:www.zhihu.comquestion64586462answer576543433内存结构࿱ ... [详细]
author-avatar
俺是糊涂人一个
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有