随着用户量的进一步增长,单个子系统数据库也会慢慢达到单机处理能力的上限。此时,已经不能再通过领域拆分来解决问题了,因为仅仅是单一的订单表中的数据就已经超出了单个数据库的处理能力。唯一的解决方式就是把订单数据拆分存储在多台数据库服务器中。至此,互联网应用已经成为一个彻底的分布式应用。但是做好这个分布式应用并不容易。

如何把订单数据保存到多台服务器上?

有三类方法可以实现。

第一类方法是仍然使用关系型数据库。在多个数据库中创建相同的订单表,然后按照一定的规则把订单分别存储在不同的服务器上。比如按用户存储,将用户id按照一定的规则划分成组,常见的方式是按id取余数,如按10取余数,可以把订单平均分到10台服务器上,当订单量继续增长时,可以把规则改为按100取余数,就可以把订单分到100台服务器上。这种架构的难点在于当取余规则更改时,需要把原来存储在10台服务器上的已有数据迁移到100台机器上。

再比如按时间存储,将一年的订单存储在一台机器上,随着时间的推移不断地增加服务器。这种方法不需要迁移数据,但是只适用于订单量没有太大变化的场景,所以应用场景比较受限。

这类方法相对比较好理解,其核心就是针对每台数据库服务器分别执行SQL语句,然后将SQL语句的执行结果进行合并。但是这种架构的使用是非常复杂的,需要处理各种异常情况,比如某台服务器的SQL语句执行失败等。为了简化这种架构的使用,开源领域出现了很多数据库中间件项目,用来让开发者不需要面对多台数据库服务器分别执行SQL语句,感觉自己仅仅是面对一台服务器在执行SQL语句。但是其核心原理没有改变,只是这些数据库中间件自动帮助开发者把SQL语句合并的事情做了。另外,无论是否采用这样的数据库中间件,每次执行SQL语句时需要所有服务器都执行这条SQL语句,成本和性能都是不可接受的,可见采用这种架构的应用都有很多限制。应尽量避免这样的操作,需要把应用设计成每次执行SQL语句时最好只发给一台服务器来处理。因此,最终不管用不用数据库中间件,都需要背后的数据库拆分逻辑。

最重要的一个难题是这种架构保证一致性非常有挑战性,让所有服务器上的数据都保持正确,是应用开发者要考虑的事情,也是数据库中间件开发者要考虑的事情。

**第二类方法是放弃SQL的便利性,采用分布式文件系统保存海量的数据。**分布式文件系统是近年来迅速发展起来的大数据技术的基石,Google公司在这方面做了开创性的工作。GFS被称为Google公司大数据的“三架马车”之一,HDFS是开源大数据领域的核心组件,它们提供的可靠的数据存储能力和强一致性,为大数据技术提供了强有力的基础支撑。

另外,在在线服务方面,我们也可以采用NoSQL数据库来存储数据。NoSQL是近年来出现的新型的数据库和存储系统,从名字上可以看出它除去了对SQL的支持。但是缺失SQL的支持并不是NoSQL数据库的弱项。用NoSQL数据库替换SQL数据库往往适用于因数据量大而需要拆分的场景,在这种场景下,SQL的使用受到很多限制,比如互联网公司往往都有不能使用join、SQL中必须携带分片id等要求。在这些使用要求下,受限的SQL数据库的能力与NoSQL数据库的能力相比,已经没有明显的优势了。NoSQL数据库通常具有很好的扩展能力、数据可靠存储能力和可用性,保存到NoSQL数据库中的数据会被系统自动拆分存储在多台服务器上,并且随着数据的增长自动重新拆分、迁移,这些功能大大降低了系统的使用难度。有些NoSQL数据库还放弃了一致性,也有些NoSQL数据库并没有放弃一致性,比如Google的BigTable系统就提供了很好的一致性。MongoDB在早期版本中没有很好的一致性保证,会出现各种异常,导致数据丢失,但是随着版本的逐步迭代,不断地加强一致性,慢慢消除了各种异常

第三类方法就是使用NewSQL数据库)。NewSQL数据库并没有去掉对SQL的支持,同时它还具有很好的水平扩展能力、可靠性和可用性。Spanner系统还不能被称作NewSQL数据库,它的后代产品才是NewSQL数据库。CockroachDB是NewSQL数据库,用户使用时无须考虑库表的拆分以及数据迁移的问题,就像使用单机数据库一样。相对于拆分数据库表的方法而言,NewSQL数据库给使用者带来的最大便利就是,使用者不用再关注数据的一致性,NewSQL数据库有非常好的一致性保证。

除前面讲到的三类方法中所涉及的分布式系统之外,做好一个分布式应用可能还会需要其他种类的分布式系统,比如消息系统。消息系统用来解耦各个系统,RabbitMQ)就是这样的一个系统。此外,还需要使用分布式协调服务来管理分布式系统中的各个进程,比如ZooKeeper(见第7章)。这些分布式系统的内部实现差别非常大,有些使用了非常复杂的分布式算法,第3部分会介绍其中的三种:Paxos算法、Raft算法、Zab算法。

最终,解决大规模应用问题就变成了对这些分布式系统和分布式技术的使用问题,用好分布式技术成为实现大规模应用的最后一个难题。

分布式技术是大规模应用的最后一个考验相关推荐

  1. 5G关键技术:大规模多天线技术现状及研究点介绍

    5G关键技术:大规模多天线技术现状及研究点介绍 随着无线通信技术的不断发展,高速数据业务以及无处不在接入的需求正呈现出一种爆炸式的增长.根据预测到2020年,业务量将为目前业务量的1000倍,基于此, ...

  2. 分布式技术与实战第一课 分布式理论与一致性算法

    开篇词:搭建分布式知识体系,挑战高薪 Offer 你好,我是邴越,在一线互联网公司从事分布式开发工作多年,一直关注分布式理论和新技术的发展. 互联网发展到今天,用户数量越来越多,产生的数据规模也越来越 ...

  3. 耗时十年!精心整理的Java高级开发需要的分布式技术

    前言 分布式.微服务几乎是现在的技术人员必须要了解的架构方向,从理论上来讲确实解耦了很多结构,但另一方面,又会带来更多衍生的复杂度及难点. 如何保证事物的最终一致性?如何进行性能及容量预估?如何处理分 ...

  4. 腾讯资深架构师整理出来的Java高级开发需要的分布式技术,简直绝了

    前言 又逢"金九银十",年轻的毕业生们满怀希望与忐忑,去寻找.竞争一个工作机会.已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇.更大的平台. 然而,面试人群众多 ...

  5. 华为资深架构师耗时十年精心整理:Java高级开发需要的分布式技术

    前言 分布式.微服务几乎是现在的技术人员必须要了解的架构方向,从理论上来讲确实解耦了很多结构,但另一方面,又会带来更多衍生的复杂度及难点. 如何保证事物的最终一致性?如何进行性能及容量预估?如何处理分 ...

  6. 分布式技术引爆人工智能

    分布式技术引爆人工智能 前言 什么是人工智能? 数据处理 分布式模型训练 什么是分布式模型训练? 数据分布式训练 模型分布式训练 混合模型训练 总结 前言 以人工智能技术为例,了解分布式技术的应用及其 ...

  7. 从下载到区块链,迅雷分布式技术解读

    作为一名计算机技术宅和迅雷下载重度用户,从当年迅雷刚推出的时候就开始用它,那种眼看着一部几个GB大小的电影在瞬间就下完的感觉特别爽,可以说迅雷是唯一一个陪伴了我十几年到现在还在用的软件了. 十五年来, ...

  8. 除了寻找梅森素数,分布式技术还能做这些!

    ▼更多精彩推荐,请关注我们▼ 公元前300多年,古希腊数学家欧几里得开启了研究2p-1这类素数的先河,随后也吸引了众多欧洲数学家们的研究兴趣.其中有一位叫马林·梅森的法国人,因其最早系统而深入的研究2 ...

  9. Impala打开分布式技术的大门 天云数据Hubble赶超

    在数据体量121亿条账户下进行资金查询测试,天云数据Hubble的性能是Impala的231%倍. Impala,一种栖息在非洲南部的高角羚,行动敏捷奔跑迅速,以其优雅的姿势和杰出的跳跃能力而出名.受 ...

最新文章

  1. Nature解析中国AI现状,2030年能引领全球吗?
  2. python画动态图代码-Python使用matplotlib画动态图
  3. 开发可统计单词个数的Android驱动程序(2)
  4. wxWidgets:wxMouseEvent类用法
  5. OpenGL EnvironmentMapping环境映射的实例
  6. 什么是类、对象、方法、属性、类的成员
  7. 【php】命名空间 和 自动加载的关系
  8. webpack打包ES6降级ES5
  9. C++对ascii文件按行和分隔符读取并显示
  10. 如何用php代码实现人脸识别,PHP实现人脸识别技术
  11. Android开发使用一行代码实现点击切换下一张图片
  12. 元宇宙需要“基建狂魔”
  13. Postman中文教程
  14. Arm 架构的过程调用标准
  15. 前端战五渣学JavaScript——深克隆(深拷贝)
  16. 华为物联网(IOT)开发者平台
  17. 可爱的灯泡眨眼表情动画特效
  18. Eigen零零散散的一些总结
  19. Planet比Google earth更好用的地图下载神器Basemaps Viewer不用写代码全球高清影像框选下载tif格式
  20. c++第二次作业-定期存款利息计算器

热门文章

  1. Rtsp之H265解析
  2. 视频编解码(十五):解码器解码查错步骤
  3. JS 对象(Object)和字符串(String)互转方法
  4. 微软lync 持续服务器,Lync Server 2013 Front-End服务器服务不会启动很长时间
  5. 云服务器如何清理垃圾释放空间?
  6. java webcms系统源码_java轻量级的CMS系统-天梯
  7. linux php 入侵,入侵linux教程 - 冷漠 ' Blog - Focus on Information Security !
  8. springboot 指定 logback_spring boot与日志
  9. 进阶07 Set接口、HashSet、LinkedHashSet
  10. vue封装echarts示例