• 数据存储,其实说的就是资料库,也就是在高并发的业务场景下,我们的资料库如何架构设计。

  • 知道有哪些资料库

    关系型资料库

    是建立在关系模型基础上的资料库,其借助于集合代数等数学概念和方法来处理资料库中的数据,几句简单的SQL语句就能快速的实现小规模数据的读写、查询统计,对于程序猿来说真是爽歪歪呀。

  • MySQL

  • 目前互联网企业基本都用它来做数据存储。愿意很简单,它是免费的,轻量级的,其他关系型资料库能做他他一样能做。用起来爽爽的。并且能基于Mycat的中间件的帮助,一样完成大规模数据的存储,满足高并发下的数据读写。关于MyCat,国内开源的项目,从它的版本更新计划,还是有很多让人值得期待的地方。

  • Oracle

  • 应该说是最好的关系资料库,容量大,数据安全。比如金融行业,实时交易系统较多,在对数据的联机事务处理(OLTP)上也就要求很高。但做大规模的数据存储,扩展性不好且价格昂贵。

  • SQL Server

  • 如果还有人在用SQL Server,说明这个企业的信息化水平很Low。SQL Server几乎没人在用了。

    NoSQL资料库

    也叫是「Not Only Sql」,指的是非关系型的资料库。这类资料库主要有这些特点:非关系型的、分散式、开源的、水平可扩展的。

  • memcached-临时性键值存储

  • 是一个自由开源的,高性能,分散式内存对象缓存系统。数据全部放在内存中,在架构设计中使用memcached能减少对磁碟数据的读写操作。

    比如可以提高用户对空节点数据查询的性能,页面上查不到数据,用户还在狂点,我不可能不停的查边系统中的每个节点。需要对空节点数据进行缓存。

    还有一个就是减少对资料库的读写,比如对查询命中率很高的能否做缓存。对写操作能否所队列缓存。人家是对象缓存系统,所以啥对象都 是可以放的。

  • Redis-永久性键值存储

  • Redis和memcached在功能上发挥的作用和使用场景基本是一样的。只是Redis更像是一个对象资料库,它不仅做内存对象缓存,还可以做对象磁碟缓存。也就是最终的数据是被放到了磁碟上的。功能上比memcached要丰富一些,在企业中Redis用的更多一些。

  • MongoDB面向文档的资料库

  • 轻量的分散式文件存储系统,MongoDB的功能很强大,在大规模数据的读写方面不亚于HBASE。MongoDB对数据的存储是透明的。现在一般企业通过MongoDB存一下非格式的文件,比如图片,视频,各种文件等。MongoDB在数据查询上比HBase方面,但在数据分析处理上不及HBase。

  • HBase面向列的资料库

  • 面向列的新型的数据存储方式,这也是HBase在超大规模数据量中能毫秒级读写数据的原因。超大的什么级别呢,「This project"s goal is the hosting of very large tables -- billions of rows X millions of columns,billions of rows X millions of columns」一个表的数据能支持的数据结构是上亿行 乘以 百万列,这是HBase官方的描述。也就是说你一个HBase表没有上亿条数据,都对不起使用HBase。牛逼吧。哈哈。之前我们卡弗卡大数据课堂的一个学生亲自测过,确实可能达到上亿行 乘以 百万列的这个结构。

    虽然HBase的维护成本比较高,但在数据分析上妥妥的,因为他是基于HDFS的,跟MapReduce、Hive、spark等都能很好的整合,达到数据的计算分析。

    关系型资料库特点

  • 优点:

    1. 保持数据的一致性

    2. 可以进行复杂查询,操作简单。

    3. 通用并且技术成熟。

  • 缺点:

    1. 数据读写必须经过sql解析,大量数据高并发下读写性能不足。

    2. 对数据做读写,或修改数据结构时需要加锁,影响并发操作。

    3. 无法适应非结构化存储。

    4. 扩展困难。

    5. 昂贵、复杂。

    NoSQL资料库的特点

  • 优点:

    1. 高并发,大数据下读写能力较强。

    2. 基本支持分散式,易于扩展,可伸缩。

    3. 简单,弱结构化存储。

  • 缺点:

    1. 不能操作复杂的查询。

    2. 事务支持较弱。

    理解分散式系统的CAP理论

    前面我们说了关系型资料库和NoSQL资料库的种类以及他们的特点。如何能很好的在实际项目中的合理的应用,我们应该要了解CAP理论。

    CAP的含义是Consistency, Availability, Partition-tolerance也就是一致性、可用性以及分区容错性。

    Consistency:一致性(C)

    Availability:可用性(A)

    Partition tolerance:分区容错性(P)

  • 一致性

    在多并发访问更新过的数据时,提供给用户的数据是否一致。对于关系型资料库,要求更新过的数据能被后续的访问都能看到,这是强一致性。如果能容忍后续的部分或者全部访问不到,则是弱一致性。如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。

  • 可用性

    某一节点的伺服器挂了,集群整体还能响应客户端的读写请求。

  • 分区容错性

    如果由于节点通讯的问题不能达成数据一致性,必须在一致性和可用性中做出选择。

  • 所以说任何分散式系统只可同时满足二点,没法三者兼顾。例如:

  • CA应用:传统上的关系型资料库(RMDB).

  • CP应用:基于HDFS的牛叉的HBase分散式资料库

  • AP应用:面向文档的分散式系统的资料库MongoDB。

  • 那么我们说CAP理论提出就是针对分散式资料库环境的,所以,P这个属性是必须具备的。P就是在分散式环境中,由于网路的问题可能导致某个节点和其它节点失去联系,节点之间互相无法知道对方的状态,这在分散式环境下是非常常见的。所以就形成了P(partition)。那么当P发生时,你要么考虑A(Availability),失去联系的节点依然可以向系统提供服务给客户端,只不过它的数据就不能保证是同步的了(失去了C(Consistency)属性),但至少服务及时做了响应。要么考虑C,选择一致性C(Consistency)为了保证资料库的一致性,我们必须等待失去联系的节点恢复过来,在这个过程中,那个节点是不允许对外提供服务的,这时候系统处于不可用状态(失去了A(Availability)属性)。

    最常见的例子是读写分离,某个节点负责写入数据,然后将数据同步到其它节点,其它节点提供读取的服务,当两个节点出现通信问题时,你就面临著选择A(继续提供服务,但是数据不保证准确)或者C(用户处于等待状态,一直等到数据同步完成)。

    AP和CP该如何取舍呢? 我觉得可以根据不同的业务场景做不同的处理。CP对系统的一致性要求较高如ERP系统,OA系统。AP系统可以允许不一致。比如微博系统。

    结论

    懂得CAP理论,在实际业务需求中我们能很好的来做数据的存储的架构设计。

    所以,高并发下的大数据读写,尽可能的交给NoSQL,HBase或者MongoDB资料库。虽然他们不能像关系型资料库那样很爽的让你查询,但他们确实彪悍。因为专业就是干这个的。对于强事务的数据操作,NoSQL资料库就不要跟人家抢。当然,MySQL不是不好,表数据超过500W,就不要像几十条数据那样的修改、删除。这时候应该考虑是否需要读写分离,从业务上是否需要考虑分割哪些数据经常修改,哪些数据会频繁被查询,是否有大量的数据写入,是否有大量随机的数据读取。

    看似操作差不多,但在高并发的大数据面前,这些都是我们需要慎重考虑的。


    推荐阅读:
    查看原文 >>
    相关文章