第一章 初识Nosql
1.互联网大潮下,NoSQL 的机遇
2000 年后互联网逐渐发展起来,而且十分的迅猛。早期的关系型数据库已经不能适应
互联网的快速变化。论坛、博客、sns、微博逐渐引领 web 领域的潮流。facebook , twitter
等这样的网站,每天都会产生海量的数据,几亿,十几亿的数据量。淘宝,腾讯都拥有庞大
的用户群。每天的访问量都是用亿来计算。用户账号也都以亿计算的。传统的 RDBMS 是难
以处理这样的数据的。数据量十分巨大,单个表存储的数据量是有上限的。不同的数据库上
限是不同的。 但一般达到 2-3 百万条数据后,查询和更新都会变慢,数据量的增加,处理
速度回几何的增加。
在 90 年代初期,2000 年左右。那时的应用都比较小,用户量也比较小。计算机还没有
普及。那时计算动辄上万元。网络速度也是出奇的慢。用户都是看看静态网页,看看新闻。
和网站的交互很少。什么论坛都没有几个人。单机一个数据库足以满足用户的使用。
此时我们的系统这样的:
-
单机时代:
此方式的缺点:
1.一个机器的数据存储量是有大小限制的。
2.读写数据都在一个数据库实例完成,大数量是不能承受的。
随着用户的访问量逐渐的上升。数据库都不同的出现了性能问题。web 应用不仅考虑功
能,还要追求性能。技术大牛们纷纷使用缓存技术缓解数据库的压力。开始的缓存数据是存
在文件中。大量的文件又导致访问磁盘的 io 问题。此时 Memcached 横空出世,一个非常时
尚,性能十分强悍。在内存中缓存数据。Memcached 作为一个独立的缓存服务器,为多个
web 服务器提供了一个共享的高性能缓存。 -
现在的我们的系统演变为:
Memcached 只能缓解数据库的读取压力,读写数据集中在一个数据库,数据库不堪重负。
技术大牛们开始使用读写分离技术。以提高数据库的读写能力。Mysql 的 master-slave 模
式称为网站标配。
我们的系统演变为:缓存加主从数据库
当 Memcached 和 MySQL 的读写分离渐渐也不能满足日益增强的性能需求。在 MySQL
的读写分离基础上,实现分表分库。数据库的集群。数据库的性能扩展是有极限的。关系数
据库很强大,但是它并不能很好的应付所有的应用场景。MySQL 的扩展性差(需要复杂的
技术来实现),大数据下 IO 压力大,表结构更改困难,正是当前使用 MySQL 以及关系型数
据库的开发人员面临的问题。
2.什么是 NoSQL
为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方案,就是NoSql数据库。
NoSQL = Not Only SQL(不仅仅是 SQL) ,也解释为 non-relational(非关系型数据库)。在NoSQL 数据库中数据之间是无联系的,无关系的。数据的结构是松散的,可变的。它可以作为关系型数据库的良好补充。
3.为什么使用 NoSQL
关系型数据库的瓶颈:
1)无法应对每秒上万次的读写请求,无法处理大量集中的高并发操作。关系型数据的是 IO
密集的应用。硬盘 IO 也变为性能瓶颈
2)表中存储记录数量有限,横向可扩展能力有限,一张表最大二百多列。纵向数据可承受
能力也是有限的,一张表的数据到达百万级,读写的速度就会逐渐的下降。面对海量数据,
必须使用主从复制,分库分表。这样的系统架构是难以维护的。
大数据查询 SQL 效率极低,数据量到达一定程度时,查询时间会呈指数级别增长
3)无法简单地通过增加硬件、服务节点来提高系统性能。数据整个存储在一个数据库中的。
多个服务器没有很好的解决办法,来复制这些数据。
4)关系型数据库大多是收费的,对硬件的要求较高。软件和硬件的成本花费比重较大。
4.NoSQL的优势
(1) 易扩展
NoSQL 数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数
据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
(2) 大数据量,高性能
NoSQL 数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益
于它的无关系性,数据库的结构简单。关系型数据库(例如 MySQL)使用查询缓存。这种
查询缓存在更新数据后,缓存就是失效了。在频繁的数据读写交互应用中。 缓存的性能不
高。NoSQL 的缓存性能要高的多。
(3) 灵活的数据模型
NoSQL 无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关
系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就
是一个噩梦。尤其在快速变化的市场环境中,用户的需求总是在不断变化的。
(4) 高可用
NoSQL 在不太影响性能的情况,就可以方便的实现高可用的架构。
NoSQL 能很好的解决关系型数据库扩展性差的问题。弥补了关系数据(比如 MySQL)
在某些方面的不足,在某些方面能极大的节省开发成本和维护成本。
MySQL 和 NoSQL 都有各自的特点和使用的应用场景,两者结合使用。让关系数据库
关注在关系上,NoSQL 关注在存储上。
(5) 低成本
这是大多数分布式数据库共有的特点,因为主要都是开源软件,没有昂贵的 License 成
本
5.NoSQL的劣势
(1) 无关系,数据之间是无联系的。
(2) 不支持标准的 SQL,没有公认的 NoSQL 标准
(3) 没有关系型数据库的约束,大多数也没有索引的概念
(4) 没有事务,不能依靠事务实现 ACID.
(5) 没有丰富的数据类型(数值,日期,字符,二进制,大文本等)
6. Nosql数据库分类
-
键值(Key-Value)存储数据库
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对
优势: 快速查询
劣势: 存储的数据缺少结构化 -
列存储数据库
相关产品:Cassandra, HBase, Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限 -
文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型: 一系列键值对
优势:数据结构要求不严格
劣势: 查询性能不高,而且缺乏统一的查询语法 -
图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。