本文介绍一下NoSQL相关的知识。
书籍推荐 <<NoSQL精粹>> 英文名 <<NoSQL Distilled>> 作者 Martin Fowler。
第一眼看到NoSQL时把它理解为No SQL,这让我着实高兴了一阵子。因为我对SQL没啥兴趣,尤其遇到写Function、Procedure、Trigger时更是烦恼。这下子出了个不要SQL的数据库理论加有实际开源产品的东东,我很高兴。
但是找了相关资料看了之后稍微有点失望:NoSQL的意思为 Not Only SQL。也就是说数据存储技术不仅仅是SQL的意思。
关系数据库制霸数据存储领域几十年了,这期间也出现过挑战其地位的理论,如对象数据库、文件存储数据、XML数据库等等。但是关系数据库的地位一直稳如磐石。
如今看来NoSQL的出现也挑战不了关系数据库的地位。NoSQL的目标就是协助构建高性能、易扩展、易编程的系统。
NoSQL看起来更像是要和关系数据库和平共处,互助互补。NoSQL带来的是数据持久化的另一种选择。NoSQL可能要开启数据库领域混合持久化时代。
大师说应用程序
选择NoSQL有两个理由:
提高应用程序开发效率:选择了NoSQL就可以抛弃ORM映射,改为直接存储程序数据结构元素;这是更符合应用程序需求的一种数据模型及开发过程。
NoSQL可以更高效地处理大规模数据: NoSQL分布式集群部署简单,NoSQL存储的数据模型更符合应用程序需要;关系数据库是为独立运行的计算机设计的,其数据模型与现今流行的面向对象编程阻抗失衡,需要做一个关系映射。
下面重点介绍一下NoSQL的四种模型、分布式模型、Map-Reduce(映射-化减)等概念。
四种NoSQL数据库:
1.
键值数据库(Key-Value Store): 它可以理解为一张简单的哈希表(hash table),主要应用在所有数据库访问均通过主键访问的情况下。
键值数据库API简单,能够存储程序聚合单元(通俗理解为可以存储对象)。
流行的键值数据库有:Riak,Redis(数据结构服务器,Data Structure Server),Memcached DB,Memcaced,HamsterDB。
我自己闲暇时把弄过Memcached,其通过字符串键值来操作数据;确实可以存储序列化后的Java对象;可以做一个集群部署;应用程序接口确实很简单。
2.
文档数据库(Document DataBase): 文档数据库可以存放并获取文档,其格式可以为XML、JSON、BSON等;这些文档具有自描述性(self-decribing),呈分层的树状数据结构(Hierarchical tree data structure),可以包含映射表、集合和纯量值;数据库中文档彼此相似,但不必完全相同;其存放的文档就相当于键值数据库所存放的值。
流行的文档数据库有: MongoDB、CouchDB、OrientDB、RavenDB等。
我写过MongoDB的Hello World程序,以后再继续关注。
3.
列族数据库: 其可以存储关键字及其映射值,并且可以把值分成多个列族,让每个列族代表一张数据映射表。
流行的列族数据库: Cassandra,HBase,Hypertable等。
个人暂时还没有应用过列族数据库。
4.
图数据库: 可以存放实体及实体间关系;实体又叫节点(Node),他们具有属性(Property);可以将节点视为应用程序中某个对象实例;关系又叫边(edge),他们也有属性 ;边具备方向性(directional significance),而节点则按关系组织起来,以便在其中查找所需模式;用图将数据一次性组织好,便可以根据关系以不同的方式解读它。
图数据库有:Neo4J、Infinite Graph、OrientDB等。
暂时还没有接触过图数据库。
分布式部署可能是非常熟悉的名词了,那数据库的分布式模型又有哪些呢?下面来介绍一下:
数据分布有两条路径:复制(replication),分片(sharding)。
分片则是将不同数据存放的不同节点,每一个数据子集都有专门一台服务器负责。
复制就是将同一份数据拷贝至多个节点。
复制又可以分为两种形式:主从复制,对等复制。
主从复制:将其中一个节点作为权威数据源,并负责写入操作;其他从节点都要和主节点保持同步,他们可以负责读取操作。
对等复制:任何节点都可以写入,节点间相互协调以同步其数据。
以上介绍了数据库的3种分布式模型,其优缺点都非常明显:
分片部署模型:优点是对应用性能提升作用明显(同时提升了读写性能);缺点是故障恢复能力没有;但是某个节点故障只会影响部分用户又是其优点了。
主从复制模型:优点是提升了数据库读的能力,避免了写入冲突;缺点是数据库写可能成为应用的瓶颈,并且主库一旦故障了没有恢复能力。
对等复制模型:优点是解决了主从复制写的毛病;缺点是引入了数据一致性的问题。
大师的思考:
面向聚合的数据库能够兴起,很大程度上是由于集群的增长。运行在集群环境中的数据库对数据存储问题的权衡方式与单机环境有所不同。集群不仅改变了数据存储规则,而且改变了数据计算规则。如果把大量数据放在集群里,那么为了有效处理数据,你必须以另外一种思路来考虑如何安排数据处理流程。
当把数据库放到集群后,立刻带来一个好处:把运算工作分布到多台计算机中去。然而此时仍要试着减少通过网络传输的数据量,把某个节点所需的数据尽可能多的放在节点执行。
映射-化减 模式(map-reduce pattern)是一种安排数据处理流程的手段,可以利用集群中的多台计算机,同时又能将某台计算机所需的数据及处理工作尽量放在本机执行。
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐