NoSql是一个很老的概念了,但对自己来说,仍然是一个短板,果断补上。
首先通过几个简单的例子来了解NOSQL在国内的情况(2013年左右的数据,有些过时),比如新浪微博,其就有200多台物理机运行着Redis,其结合NOSQL和MySQL一起使用,关系型数据,通过索引保存在MYSQL中,K/V数据保存在Redis中。淘宝的Oceanbase用于处理线上事务,Tair用于K/V存储,于2010上线(自己落后时代不少啊)。优酷的现在评论业务使用mongoDB存储,运营数据分析及挖掘处理使用Hadoop/HBase。
对于数据来说,常用的单位按序增加为,Byte, KB, MB, GB, TB, PB, EB, ZB, YD, DB, NB。
大数据的特点体现在4个V上,分别是: Volumn数据量,比如腾讯涉及8亿以上用户,2013年的总数据量压缩后仍然高达100PB,并以每月10%的速度增长;Variety数据类型繁多,包括文字、视频、图片、地理位置等;Value价值密度低,商业价值高;Velocity处理速度快,"1秒定律"。
大数据相关技术:采集技术,比如RFID射频数据、传感器数据、社交网络数据等;预处理技术,对数据进行抽取和清洗操作;大数据存储与管理技术,比如DFS分布式文件系统,NOSQL数据库;大数据分析与挖掘技术,包括数据挖掘,机器学习等;大数据应用技术,在国内常用于商业智能、政府决策和公共服务。
什么是NOSQL? "Not Only SQL"
过去传统的关系型数据库,优点是通用性和性能都很高、通过事务保持数据一致性、可以通过JOIN完成复杂查询,但缺点是不擅长大量数据的写入、表结构的改变、快速返回简单查询等。
NOSQL数据库易于数据的分散,其本身不支持join操作,各个数据独立设计,很容易把数据分散到各个服务器,相对于提升服务器性能,增大规模可以低成本的提高系统整体处理能力。
接下来通过一个表格来了解NOSQL数据库的类型,加粗部分为最常用实现。
NOSQL类型 | 常见实现 |
---|---|
键值对类型 | Memcached临时性, Redis兼具临时性和永久性,可用缓存数据,读写非常快速 Dynamo, LevelDB |
文档类型 | MongoDB, CouchDB, 无需定义表结构,可以使用复杂查询条件 |
面向列的类型 | Cassandra, HBASE,Hadoop 这类数据库相对最难理解,但重要性最高,扩展性非常强。我们过去的数据库,数据存储以行位单位,便于少量行的读取和更新,而面向列的数据库则适合对大量行少量列进行读取,对所有特定列进行同时更新 |
Tip:对我们来说,传统数据库和NOSQL数据库不分好坏,能够合理的使用才是王道。
对于传统数据库来说,其数据一致性通过事务的ACID特性来保证,但对于分布式系统来说,这套方案是行不通的。NOSQL系统就是一个分布式系统,其对于客户来说就是一个统一的整体,但实际上是由一组服务器组成的。提到分布式系统的数据一致性,就不得不提Eric Brewer提出的CAP理论,CAP分别表示Consistency强一致性,Availability可用性,Partition Tolerance分区容错性。
根据该理论, 任何一个数据共享系统只能满足这三个特性中的两个,在选型时需要做相应的权衡。
放弃P分区容错性:出现网络故障时,需要将所有数据放到一台机器,但对于NOSQL数据库一定来说,一定需要P
放弃A可用性:出现故障时,服务不可用,需要等待
放弃C强一致性:但保留数据的最终一致性,以网购为例,对于同一货物的两个订单吗,较晚的订单将被告知售罄。对于一些不敏感的数据,比如头像、评论,可以放弃C,但对于金额等敏感数据则不能。
相对于传统的ACID, NOSQL引入BASE准则。
Basically Available基本可用:系统能够基本运行,一直提供服务。
Soft-State软状态:系统不要求一直保持强一直状态。
Eventual consistency最终一致性:系统需要在某一时刻后达到一致性要求。
ACID | BASE |
---|---|
强一致性 | 弱一致性 |
隔离性 | 可用性优先 |
悲观,保守方法(悲观锁) | 乐观方法(乐观锁) |
难以变化 | 适用变化、简单快捷 |
数据一致性的实现方法:Quorun系统NEW策略;时间戳策略;向量时钟。(这部分需要时再深入学习,目前只需应用水平)
对于当下的海量数据,过去通过垂直扩展性能的方式已不合适,因此水平扩展已成为必由之路,通常来说,对于NOSQL数据库,水平扩展的方式就是复制和分片。
方案 | 诠释 |
---|---|
所有数据存放在一个服务器上 | |
分片(Sharding) | 将数据不同部分分配到不同服务器 记住:在设计,及早考虑分片 |
主从复制(Master-Slave) | 主负责处理数据更新,并启动单独进程将数据同步到从 但主仍然存在瓶颈和单点故障 |
对等复制(Peer to Peer) | 同时写入时,存在不一致的情况,可以由应用程序来判断 选举模式 |
复制和分片同时使用 |
分片的算法:Range-Based Partition(mongodb), Round-Robin(mod算法),一致性hash算法(详情请见http://www.cnblogs.com/wanliwang01/p/Architect_JAVA_LINKHOME.html)。
Tip:
五分钟法则:一条记录频繁被访问则应该放在内存,反之则应该放在硬盘,这个临界时间就是五分钟。
不要删除数据:包括不用使用IsDeleted软删除,推荐的方式是使用代表数据状态的字段,如:有效、停用、弃置、取消等。
参考资料:
- 皮雄军. NoSQL数据库技术实战[M]. 北京:清华大学出版社, 2015.