数据存储,其实说的就是数据库,也就是在高并发的业务场景下,我们的数据库如何架构设计。
知道有哪些数据库
关系型数据库
是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库中的数据,几句简单的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等都能很好的整合,达到数据的计算分析。
关系型数据库特点
优点:
- 保持数据的一致性
- 可以进行复杂查询,操作简单。
- 通用并且技术成熟。
缺点:
- 数据读写必须经过sql解析,大量数据高并发下读写性能不足。
- 对数据做读写,或修改数据结构时需要加锁,影响并发操作。
- 无法适应非结构化存储。
- 扩展困难。
- 昂贵、复杂。
NoSQL数据库的特点
优点:
- 高并发,大数据下读写能力较强。
- 基本支持分布式,易于扩展,可伸缩。
- 简单,弱结构化存储。
缺点:
- 不能操作复杂的查询。
- 事务支持较弱。
理解分布式系统的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,就不要像几十条数据那样的修改、删除。这时候应该考虑是否需要读写分离,从业务上是否需要考虑分割哪些数据经常修改,哪些数据会频繁被查询,是否有大量的数据写入,是否有大量随机的数据读取。
看似操作差不多,但在高并发的大数据面前,这些都是我们需要慎重考虑的。