转载制:http://www.cnblogs.com/bldly1989/p/6721758.htmlhtml
原文地址:https://baijiahao.baidu.com/po/feed/share?wfr=spider&for=pc&context=%7B"sourceFrom"%3A"bjh"%2C"nid"%3A"news_3690540158463624329"%7D前端
本文共11000字,阅读全文约需30分钟。node
本文为你们解析非关系型数据库(NoSQL)。mysql
前言web
NoSQL(NoSQL = Not Only SQL ),意即"不只仅是SQL"。redis
现代计算系统天天在网络上都会产生庞大的数据量。这些数据有很大一部分是由关系型数据库管理系统(RDBMSs)来处理,其严谨成熟的数学理论基础使得数据建模和应用程序编程更加简单。算法
但随着信息化的浪潮和互联网的兴起,传统的RDBMS在一些业务上开始出现问题。首先,对数据库存储的容量要求愈来愈高,单机没法知足需求,不少时候须要用集群来解决问题,而RDBMS因为要支持join,union等操做,通常不支持分布式集群。其次,在大数据大行其道的今天,不少的数据都“频繁读和增长,不频繁修改”,而RDBMS对全部操做一视同仁,这就带来了优化的空间。另外,互联网时代业务的不肯定性致使数据库的存储模式也须要频繁变动,不自由的存储模式增大了运维的复杂性和扩展的难度。sql
NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势愈加高涨。这类数据库主要有这些特色:非关系型的、分布式的、开源的、水平可扩展的。最初的目的是为了大规模web 应用。NoSQL 的拥护者们提倡运用非关系型的数据存储,一般的应用以下特色:模式自由、支持简易复制、简单的API、最终的一致性(非ACID)、大容量数据等。数据库
笔者是MongoDB用户,也使用过Redis。关系型数据库使用过MySQL与Oracle,对二者的区别有必定的体会。Mongo和Redis的操做都很是简单,速度很快,不少用SQL须要不少条语句的操做在NoSQL数据库中都是2句之内完成。另外NoSQL配置cluster也很容易,且能够随时更改partition和replication的数量,Mongo的新版本还内置了MapReduce操做,使其有了作大数据分析的能力。编程
NoSQL理论基础
1.关系型数据库理论 - ACID
ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程当中,为保证事务(transaction)是正确可靠的,所必须具有的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。
A – Atomicity – 原子性
一个事务(transaction)中的全部操做,要么所有完成,要么所有不完成,不会结束在中间某个环节。事务在执行过程当中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务历来没有被执行过同样。
C – Consistency – 一致性
在事务开始以前和事务结束之后,数据库的完整性没有被破坏。这表示写入的资料必须彻底符合全部的预设规则,这包含资料的精确度、串联性以及后续数据库能够自发性地完成预约的工做。
I – Isolation – 隔离性
数据库容许多个并发事务同时对其数据进行读写和修改的能力,隔离性能够防止多个事务并发执行时因为交叉执行而致使数据的不一致。事务隔离分为不一样级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
D – Durability – 持久性
事务处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。
关系型数据库严格遵循ACID理论。但当数据库要开始知足横向扩展、高可用、模式自由等需求时,须要对ACID理论进行取舍,不能严格遵循ACID。以CAP理论和BASE理论为基础的NoSQL数据库开始出现。
2.分布式系统理论
2.1 分布式系统介绍
分布式系统的核心理念是让多台服务器协同工做,完成单台服务器没法处理的任务,尤为是高并发或者大数据量的任务。分布式是NoSQL数据库的必要条件。
分布式系统由独立的服务器经过网络松散耦合组成的。每一个服务器都是一台独立的PC机,服务器之间经过内部网络链接,内部网络速度通常比较快。由于分布式集群里的服务器是经过内部网络松散耦合,各节点之间的通信有必定的网络开销,所以分布式系统在设计上尽量减小节点间通信。此外,由于网络传输瓶颈,单个节点的性能高低对分布式系统总体性能影响不大。好比,对分布式应用来讲,采用不一样编程语言开发带来的单个应用服务的性能差别,跟网络开销比起来均可以忽略不计。
所以,分布式系统每一个节点通常不采用高性能的服务器,而是使用性能相对通常的普通PC服务器。提高分布式系统的总体性能是经过横向扩展(增长更多的服务器),而不是纵向扩展(提高每一个节点的服务器性能)实现。
分布式系统最大的特色是可扩展性,它可以适应需求变化而扩展。企业级应用需求常常随时间而不断变化,这也对企业级应用平台提出了很高的要求。企业级应用平台必需要能适应需求的变化,即具备可扩展性。好比移动互联网2C应用,随着互联网企业的业务规模不断增大,业务变得愈来愈复杂,并发用户请求愈来愈多,要处理的数据也愈来愈多,这个时候企业级应用平台必须可以适应这些变化,支持高并发访问和海量数据处理。分布式系统有良好的可扩展性,能够经过增长服务器数量来加强分布式系统总体的处理能力,以应对企业的业务增加带来的计算需求增长。
2.2 分布式存储的问题 – CAP理论
若是咱们期待实现一套严格知足ACID的分布式事务,极可能出现的状况就是系统的可用性和严格一致性发生冲突。在可用性和一致性之间永远没法存在一个一箭双鵰的方案。因为NoSQL的基本需求就是支持分布式存储,严格一致性与可用性须要互相取舍,由此延伸出了CAP理论来定义分布式存储遇到的问题。
CAP理论告诉咱们:一个分布式系统不可能同时知足一致性(C:Consistency)、可用性(A:Availability)、分区容错性(P:Partitiontolerance)这三个基本需求,而且最多只能知足其中的两项。
对于一个分布式系统来讲,分区容错是基本需求,不然不能称之为分布式系统。所以架构师须要在C和A之间寻求平衡
C – Consistency – 一致性(与ACID的C彻底不一样)
一致性是指“all nodes see the same data at the same time”,即更新操做成功并返回客户端完成后,全部节点在同一时间的数据彻底一致。
对于一致性,能够分为从客户端和服务端两个不一样的视角。
从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。
从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。一致性是由于有并发读写才有的问题,所以在理解一致性的问题时,必定要注意结合考虑并发读写的场景。
从客户端角度,多进程并发访问时,更新过的数据在不一样进程如何获取的不一样策略,决定了不一样的一致性。对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。若是能容忍后续的部分或者所有访问不到,则是弱一致性。若是通过一段时间后要求能访问到更新后的数据,则是最终一致性。
A – Availability – 可用性
可用性是指“Reads and writes always succeed”,即服务一直可用,并且是正常响应时间。
对于一个可用性的分布式系统,每个非故障的节点必须对每个请求做出响应。也就是说,该系统使用的任何算法必须最终终止。当同时要求分区容忍性时,这是一个很强的定义:即便是严重的网络错误,每一个请求必须完成。
好的可用性主要是指系统可以很好的为用户服务,不出现用户操做失败或者访问超时等用户体验很差的状况。在一般状况下,可用性与分布式数据冗余、负载均衡等有着很大的关联。
P – Partition tolerance – 分区容错性
分区容错性是指“the system continues to operate despite arbitrary message loss or failureof part of the system”,即分布式系统在遇到某节点或网络分区故障的时候,仍然可以对外提供知足一致性和可用性的服务。
分区容错性和扩展性紧密相关。在分布式应用中,可能由于一些分布式的缘由致使系统没法正常运转。好的分区容错性要求可以使应用虽然是一个分布式系统,但看上去却好像是一个能够运转正常的总体。好比如今的分布式系统中有某一个或者几个机器宕掉了,其它剩下的机器还可以正常运转知足系统需求,或者是机器之间有网络异常,将分布式系统分隔成未独立的几个部分,各个部分还能维持分布式系统的运做,这样就具备好的分区容错性。
CA without P
若是不要求P(不容许分区),则C(强一致性)和A(可用性)是能够保证的。但其实分区不是你想不想的问题,而是始终会存在,所以CA的系统更多的是容许分区后各子系统依然保持CA。
CP without A
若是不要求A(可用),至关于每一个请求都须要在Server之间强一致,而P(分区)会致使同步时间无限延长,如此CP也是能够保证的。不少传统的数据库分布式事务都属于这种模式。
AP without C
要高可用并容许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每一个节点只能用本地数据提供服务,而这样会致使全局数据的不一致性。如今众多的NoSQL都属于此类。
CAP理论定义了分布式存储的根本问题,但并无指出一致性和可用性之间到底应该如何权衡。因而出现了BASE理论,给出了权衡A与C的一种可行方案。
2.3 权衡一致性与可用性 - BASE理论
Base = Basically Available + Soft state + Eventuallyconsistent 基本可用性+软状态+最终一致性,由eBay架构师DanPritchett提出。Base是对CAP中一致性A和可用性C权衡的结果,源于提出者本身在大规模分布式系统上实践的总结。核心思想是没法作到强一致性,但每一个应用均可以根据自身的特色,采用适当方式达到最终一致性。
BA - Basically Available - 基本可用
基本可用。这里是指分布式系统在出现故障的时候,容许损失部分可用性,即保证核心功能或者当前最重要功能可用。对于用户来讲,他们当前最关注的功能或者最经常使用的功能的可用性将会得到保证,可是其余功能会被削弱。
S – Soft State - 软状态
容许系统数据存在中间状态,但不会影响到系统的总体可用性,即容许系统在不一样节点的数据副本之间进行数据同步时存在延时。
E - Eventually Consistent - 最终一致性
要求系统数据副本最终可以一致,而不须要实时保证数据副本一致。最终一致性是弱一致性的一种特殊状况。最终一致性有5个变种:
因果一致性
读己之所写(因果一致性特例)
会话一致性
单调读一致性
单调写一致性
3.分布式存储算法
3.1一致性算法 – Paxos
Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。一个典型的场景是,在一个分布式数据库系统中,若是各节点的初始状态一致,每一个节点执行相同的操做序列,那么他们最后能获得一个一致的状态。为保证每一个节点执行相同的命令序列,须要在每一条指令上执行一个“一致性算法”以保证每一个节点看到的指令一致。一个通用的一致性算法能够应用在许多场景中,是分布式计算中的重要问题。所以从20世纪80年代起对于一致性算法的研究就没有中止过。节点通讯存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。Paxos 算法就是一种基于消息传递模型的一致性算法。
不只仅是在分布式系统中,凡是多个过程须要达成某种一致的场合均可以使用Paxos 算法。一致性算法能够经过共享内存(须要锁)或者消息传递实现,Paxos 算法采用的是后者。Paxos 算法适用的几种状况:一台机器中多个进程/线程达成数据一致;分布式文件系统或者分布式数据库中多客户端并发读写数据;分布式存储中多个副本响应读写请求的一致性。
3.2分区(Partitioning)
原来全部的数据都是在一个数据库上的,网络IO及文件IO都集中在一个数据库上的,所以CPU、内存、文件IO、网络IO均可能会成为系统瓶颈。而分区的方案就是把某一个表或某几个相关的表的数据放在一个独立的数据库上,这样就能够把CPU、内存、文件IO、网络IO分解到多个机器中,从而提高系统处理能力。
3.3分片(Replication)
分区有两种模式,一种是主从模式,用于作读写分离;另一种模式是分片模式,也就是说把一个表中的数据分解到多个表中。一个分区只能是其中的一种模式。
3.4一致性哈希(Consistent Hashing)
一致性哈希算法是分布式系统中经常使用的算法。好比,一个分布式的存储系统,要将数据存储到具体的节点上,若是采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,若是有一个机器加入或退出这个集群,则全部的数据映射都无效了,若是是持久化存储则要作数据迁移,若是是分布式缓存,则其余缓存就失效了。
一致性哈希基本解决了在P2P环境中最为关键的问题——如何在动态的网络拓扑中分布存储和路由。每一个节点仅需维护少许相邻节点的信息,而且在节点加入/退出系统时,仅有相关的少许节点参与到拓扑的维护中。全部这一切使得一致性哈希成为第一个实用的DHT算法。
4.NoSQL的优势/缺点
4.1优势
易扩展
NoSQL数据库种类繁多,可是有一个共同的特色,都是去掉了关系型数据库的关系型特性。数据之间无关系,这样就很是容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
大数据量,高性能
NoSQL数据库都具备很是高的读写性能,尤为在大数据量下,一样表现优秀。这得益于它的无关系性,数据库的结构简单。通常MySQL使用Query Cache,每次表更新Cache就失效,是一种大粒度的Cache,针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,因此NoSQL在这个层面上来讲性能就要高不少了。
灵活的数据模型
NoSQL无需事先为要存储的数据创建字段,随时能够存储自定义的数据格式。而在关系型数据库里,增删字段是一件很是麻烦的事情。若是是很是大数据量的表,增长字段简直就是一个噩梦。这点在大数据量的web2.0时代尤为明显。
高可用
NoSQL在不太影响性能的状况下,就能够方便地实现高可用的架构。好比Cassandra、HBase模型,经过复制模型也能实现高可用。
4.1缺点
没有标准
没有对NoSQL数据库定义的标准,因此没有两个NoSQL数据库是平等的。
没有存储过程
NoSQL数据库中大多没有存储过程。
不支持SQL
NoSQL大多不提供对SQL的支持:若是不支持SQL这样的工业标准,将会对用户产生必定的学习和应用迁移上的成本。
支持的特性不够丰富,产品不够成熟
现有产品所提供的功能都比较有限,不像MS SQL Server和Oracle那样能提供各类附加功能,好比BI和报表等。大多数产品都还处于初创期,和关系型数据库几十年的完善不可同日而语。
NoSQL与SQL的对比
NoSQL数据库的分类
1.键值(Key-Value)存储数据库
这一类数据库主要会使用到哈希表,在这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来讲优点在于简单、易部署。可是若是DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。
E. g:
TokyoCabinet/Tyrant
Redis
Voldemort
OracleBDB
列存储数据库
这部分数据库一般是用来应对分布式存储的海量数据。键仍然存在,可是它们的特色是指向了多个列。这些列是由列家族来安排的。
E. g:
Cassandra
HBase
Riak
文档型数据库
文档型数据库的灵感来自于Lotus Notes办公软件,它同第一种键值存储相相似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,好比JSON。文档型数据库能够看做是键值数据库的升级版,容许之间嵌套键值。并且文档型数据库比键值数据库的查询效率更高。
E. g:
CouchDB
MongoDB
SequoiaDB
图形(Graph)数据库
图形结构的数据库同其它行列以及刚性结构的SQL数据库不一样,它是使用灵活的图形模型,而且可以扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),所以进行数据库查询须要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。
E. g:
Neo4J
InfoGrid
InfiniteGraph
主流NoSQL数据库介绍及其适用场景
1. Redis
1.1 介绍
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工做由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
1.2 适用场景
数据变化较少,执行预约义查询,进行数据统计的应用程序
须要提供数据版本支持的应用程序
例如:股票价格、数据分析、实时数据搜集、实时通信、分布式缓存
2. MongoDB
2.1 介绍
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系型数据库的非关系型数据库。
2.2 适用场景
须要动态查询支持
须要使用索引而不是 map/reduce功能
须要对大数据库有性能要求
须要使用 CouchDB但由于数据改变太频繁而占满内存
3.Neo4j
3.1 介绍
Neo4j是一个高性能的NoSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具有彻底的事务特性的Java持久化引擎,可是它将结构化数据存储在网络(从数学角度叫作图)上而不是表中。Neo4j也能够被看做是一个高性能的图引擎,该引擎具备成熟数据库的全部特性。
3.2 适用场景
适用于图形一类数据
这是 Neo4j与其余NoSQL数据库的最显著区别
例如:社会关系,公共交通网络,地图及网络拓谱
4.Cassandra
4.1 介绍
Apache Cassandra 是一套开源分布式 Key-Value 存储系统。它最初由 Facebook 开发,用于储存特别大的数据。 Cassandra 不是一个数据库,它是一个混合型的非关系的数据库,相似于Google 的 BigTable。Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型。
4.2适用场景
银行业,金融业
写比读更快
5. HBase
5.1 介绍
HBase是一个分布式的、面向列的开源数据库,该技术来源于Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储同样,HBase在Hadoop之上提供了相似于Bigtable的能力。它是一个适合于非结构化数据存储的数据库。另外一个不一样的是HBase基于列的而不是基于行的模式。
5.2适用场景
对大数据进行随机、实时访问的场合
例如: Facebook消息数据库
6.CouchDB
6.1 介绍
CouchDB 是一个开源的面向文档的数据库管理系统,能够经过 RESTful JavaScript Object Notation (JSON) API 访问。术语 “Couch” 是 “Cluster Of Unreliable CommodityHardware” 的首字母缩写,它反映了 CouchDB 的目标具备高度可伸缩性,提供了高可用性和高可靠性,即便运行在容易出现故障的硬件上也是如此。
6.2适用场景
数据变化较少,执行预约义查询,进行数据统计的应用程序
须要提供数据版本支持的应用程序。
例如: CRM、CMS系统。 master-master复制对于多站点部署是很是有用的。
NoSQL优秀应用实例
1. 新浪微博 - Redis
新浪微博从技术上来讲,天天用户发表微博特别容易,这形成天天新增的数据量都是百万级、上千万级的这样一个量。你常常要面对的一个问题就是增长服务器,由于通常一台MySQL服务器,它可能支撑的规模也就是几千万,或者说复杂一点只有几百万,这样,可能天天都要增长服务器,从而解决所你面对的这些问题。
目前新浪微博是Redis全球最大的用户,在新浪有200多台物理机,400多个端口正在运行着Redis, 有4G的数据跑在Redis上来为微博用户提供服务。
新浪微博面临的问题以下:
数据结构(Data Structure)需求愈来愈多, 但memcache中没有, 影响开发效率
随着读操做的量的上升,性能问题须要解决,经历的过程有:
数据库读写分离(M/S)-->数据库使用多个Slave-->增长Cache (memcache)-->转到Redis
解决写的问题:
水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在另一个表。
可靠性需求
Cache的"雪崩"问题难以解决,面临着快速恢复的挑战。
开发成本需求
Cache和DB的一致性维护成本愈来愈高,但开发须要跟上不断涌入的产品需求。且硬件成本最贵的就是数据库层面的机器,基本上比前端的机器要贵几倍,主要是IO密集型,很耗硬件。
维护性复杂
一致性维护成本愈来愈高
BerkeleyDB使用B树,会一直写新的,内部不会有文件从新组织;这样会致使文件愈来愈大;大的时候须要进行文件归档,归档的操做要按期作,这样,就须要有必定的down time。
基于以上考虑,新浪微博选择了Redis。
在新浪NoSQL和MySQL在大多数状况下是结合使用的,根据应用的特色选择合适的存储方式。譬如:关系型数据,例如:索引使用MySQL存储;非关系型数据,例如:一些K/V需求的,对并发要求比较高的放入Redis存储。
新浪微博团队经过修改Redis源码知足本身的业务需求:完善它的replication机制,加入position的概念,让维护更容易,同时failover能力也大大加强。改善Hashset在RDB里面的存储方式,提高复杂数据类型的加载速度。
业务场景以下:
1. 业务使用方式:
hash sets: 关注列表, 粉丝列表, 双向关注列表(key-value(field), 排序)
string(counter): 微博数, 粉丝数, ...(避免了select count(*) from ...)
sort sets(自动排序): TopN, 热门微博等, 自动排序
lists(queue): push/sub提醒,...
上述四种, 从精细化控制方面,hash sets和string(counter)推荐使用, sort sets和lists(queue)不推荐使用
还可经过二次开发,进行精简。好比: 存储字符改成存储整形, 16亿数据,只须要16G内存
存储类型保存在3种之内,建议不要超过3种;
将memcache +mysql 替换为Redis:
Redis做为存储并提供查询,后台再也不使用mysql,解决数据多份之间的一致性问题;
2. 对大数据表的存储(eg:140字微博的存储)
一个库就存惟一性id和140个字;
另外一个库存id和用户名,发布日期、点击数等信息,用来计算、排序等,等计算出最后须要展现的数据时再到第一个库中提取微博内容;
3. 一些技巧
不少应用, 能够承受数据库链接失败, 但不能承受处理慢
一份数据, 多份索引(针对不一样的查询场景)
解决IO瓶颈的惟一途径: 用内存
在数据量变化不大的状况下,优先选用Redis
2. 淘宝数据平台 – Oceanbase,Tair(均为自研)
数据产品的一个最大特色是数据的非实时写入,正由于如此,能够认为在必定的时间段内,整个系统的数据是只读的。这为设计缓存奠基了很是重要的基础。一些对实效性要求很高的数据,例如针对搜索词的统计数据,但愿能尽快推送到数据产品前端,因此在内存中作实时计算,并把计算结果在尽量短的时间内刷新到 NoSQL存储设备中,供前端产品调用。
淘宝Oceanbase的设计之初,是这样的。公司经过对淘宝的在线存储需求进行分析发现:
淘宝的数据总量比较大,将来一段时间,好比五年以内的数据规模为百TB级别,千亿条记录,另外,数据膨胀很快,传统的分库分表对业务形成很大的压力,必须设计自动化的分布式系统。因此有了淘宝Oceanbase,它以一种很简单的方式知足了将来一段时间的在线存储需求,而且还得到了一些其它特性,如高效支持跨行跨表事务,这对于淘宝的业务是很是重要的。
OceanBase由以下几个部分组成:
客户端:用户使用OceanBase的方式和MySQL数据库彻底相同,支持JDBC、 C客户端访问,等等。基于MySQL数据库开发的应用程序、工具可以直接迁移到OceanBase。
RootServer:管理集群中的全部服务器,子表(tablet)数据分布以及副本管理。 RootServer通常为一主一备,主备之间数据强同步。
UpdateServer:存储OceanBase系统的增量更新数据。UpdateServer通常为一主一备,主备之间能够配置不一样的同步模式。部署时,UpdateServer进程和RootServer进程每每共用物理服务器。
ChunkServer:存储OceanBase系统的基线数据。基线数据通常存储两份或者三份,可配置。
Merge Server:接收并解析用户的SQL请求,通过词法分析、语法分析、查询优化等一系列操做后转发给相应的ChunkServer或者UpdateServer。若是请求的数据分布在多台ChunkServer上,MergeServer还须要对多台ChunkServer返回的结果进行合并。客户端和MergeServer之间采用原生的MySQL通讯协议,MySQL客户端能够直接访问MergeServer。
淘宝Tair是由淘宝自主开发的Key/Value结构数据存储系统,而且于 2010年6月30号在淘宝开源平台上正式对外开源,在淘宝网有着大规模的应用。用户在登陆淘宝、查看商品详情页面或者在淘江湖和好友“捣浆糊”的时候,都在直接或间接地和Tair交互。淘宝将Tair开源,但愿有更多的用户能从咱们开发的产品中受益,更但愿依托社区的力量,使Tair有更广阔的发展空间。
Tair 的分布采用的是一致性哈希算法, 对于全部的key, 分到Q个桶中, 桶是负载均衡和数据迁移的基本单位. config server 根据必定的策略把每一个桶指派到不一样的data server上. 由于数据按照key作hash算法, 因此能够认为每一个桶中的数据基本是平衡的. 保证了桶分布的均衡性, 就保证了数据分布的均衡性。
3. 优酷运营数据分析 – HBase,MongoDB, Redis
优酷做为一家大型视频网站,拥有海量播放流畅的视频。它秉承注重用户体验这一产品技术理念,将绝大部分存储用在视频资源上。经过建设专用的视频CDN,创建了可自由扩展、性能优异的架构,在提供更好用户体验的同时优化了存储资源。在除视频资源外的其它方面,优酷也累积了海量数据:仅运营数据,天天收集到的网站各种访问日志总量已经达到TB级,经分析及压缩处理后留存下来的历史运营数据已达数百TB,很快将会达到 PB级,5年后数据量将会达到几十PB级。
目前优酷的在线评论业务已部分迁移到MongoDB,运营数据分析及挖掘处理目前在使用Hadoop/HBase;在Key-Value产品方面,它也在寻找更优的 Memcached替代品,如Redis,相对于Memcached,除了对Value的存储支持三种不一样的数据结构外,同一个Key的Value进行部分更新也会更适合一些对Value频繁修改的在线业务;同时在搜索产品中应用了Tokyo Tyrant;对于Cassandra等产品也进行过研究。
对于优酷来讲,仍处于飞速发展阶段,已经在考虑将来自建数据中心,提升数据处理能力,从网站的运营中发掘出更多信息,为用户提供更好的视频服务。
4. 豆瓣社区 – BeansDB(自研KV数据库)
它采用相似memcached的去中心化结构,在客户端实现数据路由。目前只提供了Python版本的客户端,其它语言的客户端能够由memcached的客户端稍加改造获得。它具备以下特性:
高可用:经过多个可读写的用于备份实现高可用
最终一致性:经过哈希树实现快速完整数据同步(短期内数据可能不一致)
容易扩展:能够在不中断服务的状况下进行容量扩展。
高性能:异步网络IO, 日志结构的存储方式Bitcask.
简单协议:Memcache兼容协议,大量可用客户端
目前,BeansDB在豆瓣主要部署了两个集群:一个集群用于存储数据库中的大文本数据,好比日记、帖子一类;另一个豆瓣FS集群,主要用于存储媒体文件,好比用户上传的图片、豆瓣电台上的音乐等。
BeansDB采用Key-Value存储架构,其最大的特色是具备高度的可伸缩性;在BeansDB的架构下,在大数据量下,扩展数据节点将垂手可得,只须要添加硬件,安装软件,修改相应的配置文件便可。
BeansDB项目能够说是一个简化版的AWS DynamoDB。BeansDB对key作哈希运算找到节点来实现分布和冗余, 一个写操做会写好几个节点,而如今的配置是写三份读一份。BeansDB主要的特色是支持海量KV数据库——相比Redis这种支持几十个G到几百个G的内存KV数据库,BeansDB能够支持到上百T的数据。另外BeansDB最大的好处就是运维很简单,性能、扩容都很好,也实现了最终一致性。
BeansDB在可用性方面也有很大的优点,任何一个节点宕机都不会受到影响,数据是自动伸缩冗余的。在运维方面也很简单,基本上没有什么用户数据的冗余残余,全部数据经过一个同步脚本能够快速同步。
学习资料
1.书籍
1.1 MongoDB: The Definitive Guide(Kristina Chodorow)
MongoDB是入门NoSQL数据库的最好选择之一。本书讲解了全部关于MongoDB的基础知识,是本很好的入门书籍。
1.2 NoSQL精粹 (Pramod J.Sadalage,Martin Fowler)
本书全方位比较关系型数据库与NoSQL数据库的异同,详细讲解4大主流NoSQL数据库的优劣势、用法和适用场合,深刻探讨实现NoSQL数据库系统的各类细节。此书对于技术选型有很好的指导做用。
1.3 各类NoSQL数据库的官方文档
有必定计算机基础的人仍是最推荐看官方文档,官方文档对其产品的理解永远是最深的,对于开发者若能理解其设计原则,上手比看书要快。
2.视频
2.1 GettingStarted - NoSQL - MongoDB
地址:
https://www.youtube.com/watch?v=5rbFoSGHErA&list=PLf0swTFhTI8ra5T5B7QsNuu5yxiEdd6Ro
老外的视频,MongoDB的一个比较通俗易懂的教程。
2.2 Cassandra-NoSQL-Tutorials
地址:
https://www.youtube.com/watch?v=8G4a4G3S654&list=PLpE_8MUgZj5vSp1Q_5GyDKBgy9dG1ifdE
一样是老外的Cassandra的系列教程。
2.3 Redis ServerTutorial
地址:
https://www.youtube.com/watch?v=fyV3OK1fCr0&list=PLpIXNzrq3JHQ8-QCJqrC2ihrGJkjdN2J6
Redis的系列教程,不过侧重于分布式缓存功能的实现。这也是Redis的主要使用场景。
3.边用边Google
工具类的事物永远是边用边学最快,真正用过了(尤为是遇到过超高并发/存储的状况)才会体验到NoSQL的好处。
进一步学习
在数据派THU后台(非留言区)回复"综述"便可获取资源。
1.分布式算法
Paxos made simple
一篇通俗讲解paxos算法的论文,由paxos算法发明者Leslie Lamport所写,是其发明paxos算法的论文的简化版。此算法用于肯定分布式系统的共识。
Byzantine generals problem
一篇研究“拜占庭将军”问题的论文。“拜占庭将军”是分布式场景的典型问题,paxos算法就是用来解决此问题的。
Research on the improvement of MongoDBAuto-Sharding in cloud environment
一篇研究MongoDB分片算法的论文。分片是NoSQL数据库的基本功能。
2. NoSQL数据库的研究及底层实现
Bigtable:A distributed storage system for structured data
BigTable的设计论文,HBase是其开源实现,是一个典型的基于列的NoSQL数据库。此篇论文是Google的“三大马车”之一。
Optimizingevent polling for network-intensive applications: A case study on redis
一篇研究Redis底层Networking IO的论文,并优化了原有的epoll模型,命名为FlexPoll。
Performanceevaluation of a MongoDB and Hadoop platform for scientific data analysis
一篇研究MongoDB和Hadoop在科学计算场景的性能的论文(科学计算是cpu/gpu-intensive而非i/o密集型)。
3. NoSQL应用案例
Big dataanalysis with MongoDB for decision support system
这篇论文使用MongoDB对商业数据作了大数据分析,为企业提供决策,并比较了RDBMS与NoSQL在数据分析方面的优劣。
Implementingjoins over HBase on cloud platform
一篇在论述如何在HBase上实现Join功能的论文。Join在分布式环境下实现很是困难,为此此篇论文设计了2种算法:MapReduceJoin与ParallelHashJoin