切换导航
首页
技术问答
编程语言
前端开发
移动开发
开发工具
程序设计
行业应用
CMS系统
服务器
频道导航
▸ PHP
▸ Java
▸ Java SE
▸ Python
▸ C#
▸ C&C++
▸ Ruby
▸ VB
▸ asp.Net
▸ Go
▸ Perl
▸ netty
▸ Django
▸ Delphi
▸ Jsp
▸ .NET Core
▸ Spring
▸ Flask
▸ Springboot
▸ SpringMVC
▸ Lua
▸ Laravel
▸ Mybatis
▸ Asp
▸ Groovy
▸ ThinkPHP
▸ Yii
▸ swoole
▸ HTML
▸ HTML5
▸ JavaScript
▸ CSS
▸ jQuery
▸ Bootstrap
▸ Angularjs
▸ TypeScript
▸ Vue
▸ Dojo
▸ Json
▸ Electron
▸ Node.js
▸ extjs
▸ Express
▸ XML
▸ ES6
▸ Ajax
▸ Flash
▸ Unity
▸ React
▸ Flex
▸ Ant Design
▸ Web前端
▸ 微信小程序
▸ 微信公众号
▸ iOS
▸ Android
▸ Swift
▸ Hybrid
▸ Cocos2d-x
▸ Flutter
▸ Xcode
▸ Silverlight
▸ cocoa
▸ Cordova
前端之家
NoSQL
NoSQL数据库探讨
NoSQL数据库探讨
2020-05-16
NoSQL
前端之家
前端之家
收集整理的这篇文章主要介绍了
NoSQL数据库探讨
,
前端之家
小编觉得挺不错的,现在分享给大家,也给大家做个参考。
随着互联网web2.0网站的兴起,非关系型的
数据库
现在成了一个极其热门的新领域,非关系
数据库
产品的发展非常迅速。而传统的关系
数据库
在应付 web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如: 1、High performance - 对
数据库
高并发读写的需求 web2.0网站要根据
用户
个性化信息来实时
生成
动态
页面
和提供动态信息,所以基本上无法使用动态
页面
静态化
技术,因此
数据库
并发
负载
非常高,往往要达到每秒上万次读写请求。关系
数据库
应付上万次
SQL查询
还勉强顶得住,但是应付上万次
sql
写数据请求,硬盘IO就已经无法承受了。其实对于普通的 BBS网站,往往也存在对高并发写请求的需求,例如像JavaEye网站的实时
统计
在线
用户
状态,记录热门帖子的点击
次数
,投票计数等,因此这是一个相当普遍的需求。 2、Huge Storage - 对海量数据的高效率存储和访问的需求 类似Facebook,twitter,Friend
Feed
这样的SNS网站,每天
用户
产生海量的
用户
动态,以Friend
Feed
为例,一个月就达到了2.5亿条
用户
动态,对于关系
数据库
来说,在一张2.5亿条记录的表里面进行
SQL查询
,效率是极其低下乃至不可忍受的。再例如大型web网站的
用户
登录
系统,例如腾讯,盛大,动辄数以亿计的帐号,关系
数据库
也很难应付。 3、High Scalability && High Availability- 对
数据库
的高可扩展性和高可用性的需求 在基于web的架构当中,
数据库
是最难进行横向扩展的,当一个应用系统的
用户
量和访问量与日俱增的时候,你的
数据库
却没有办法像web server和app server那样简单的通过
添加
更多的硬件和服务节点来扩展
性能
和
负载
能力。对于很多需要提供24小时不间断服务的网站来说,对
数据库
系统进行
升级
和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么
数据库
不能通过不断的
添加
服务器节点来实现扩展呢? 在上面提到的“三高”需求面前,关系
数据库
遇到了难以克服的障碍,而对于web2.0网站来说,关系
数据库
的很多主要特性却往往无用武之地,例如: 1、
数据库
事务一致性需求 很多web实时系统并不要求严格的
数据库
事务,对读一致性的要求很低,有些场合对写一致性要求也不高。因此
数据库
事务管理成了
数据库
高
负载
下一个沉重的负担。 2、
数据库
的写实时性和读实时性需求 对关系
数据库
来说,插入一条数据之后立刻
查询
,是肯定可以读出来这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比方说我(JavaEye的robbin)发一条消息之后,过几秒乃至十几秒之后,我的
订阅
者才看到这条动态是完全可以接受的。 3、对复杂的
SQL查询
,特别是多表关联
查询
的需求 任何大数据量的web系统,都非常忌讳多个大表的关联
查询
,以及复杂的数据分析类型的复杂
sql
报表
查询
,特别是SNS类型的网站,从需求以及产品设计角度,就避免了这种情况的产生。往往更多的只是单表的主键
查询
,以及单表的简单条件
分页
查询
,
sql
的
功能
被极大的弱化了。 因此,关系
数据库
在这些越来越多的应用场景下显得不那么合适了,为了
解决
这类问题的非关系
数据库
应运而生,现在这两年,各种各样非关系
数据库
,特别是键值
数据库
(Key-Value Store DB)风起云涌,多得让人眼花缭乱。前不久国外刚刚举办了No
sql
Conference,各路No
sql
数据库
纷纷亮相,
加上
未亮相但是名声在外的,起码有超过10个开源的No
sql
DB,例如: Redis,Tokyo Cabinet,Cassandra,Voldemort,MongoDB,Dynomite,HBase,CouchDB,Hypertable, Riak,Tin, Flare, Lightcloud, KiokuDB,Scalaris, Kai, ThruDB, ...... 这些No
sql
数据库
,有的是用C/C++编写的,有的是用Java编写的,还有的是用Erlang编写的,每个都有自己的独到之处,看都看不过来了,我(robbin)也只能从中挑选一些比较有特色,看起来更有前景的产品学习和了解一下。这些No
sql
数据库
大致可以分为以下的三类: 一、满足极高读写
性能
需求的Kye-Value
数据库
:Redis,Tokyo Cabinet, Flare 高
性能
Key-Value
数据库
的主要特点就是具有极高的并发读写
性能
,Redis,Tokyo Cabinet, Flare,这3个Key-Value DB都是用C编写的,他们的
性能
都相当出色,但出了出色的
性能
,他们还有自己独特的
功能
: 1、Redis Redis是一个很新的项目,刚刚发布了1.0版本。Redis本质上是一个Key-Value类型的内存
数据库
,很像memcached,整个
数据库
统统加载在内存当中进行操作,定期通过异步操作把
数据库
数据flush到硬盘上进行保存。因为是纯内存操作,Redis的
性能
非常出色,每秒可以处理超过10万次读写操作,是我知道的
性能
最快的Key-Value DB。 Redis的出色之处不仅仅是
性能
,Redis最大的魅力是
支持
保存List链表和Set集合的数据结构,而且还
支持
对List进行各种操作,例如从List两端push和pop数据,取List区间,排序等等,对Set
支持
各种集合的并集交集操作,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的
功能
,比方说用他的List来做FIFO双向链表,实现一个轻量级的高
性能
消息队列服务,用他的Set可以做高
性能
的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一个
功能
加强版的memcached来用。 Redis的主要缺点是
数据库
容量受到物理内存的限制,不能用作海量数据的高
性能
读写,并且它没有原生的可扩展机制,不具有scale(可扩展)能力,要依赖客户端来实现分布式读写,因此Redis适合的场景主要局限在较小数据量的高
性能
操作和运算上。目前使用Redis的网站有 github,Engine Yard。 2、Tokyo Cabinet和Tokoy Tyrant TC和TT的开发者是日本人Mikio Hirabayashi,主要被用在日本最大的SNS网站mixi.jp上,TC发展的时间最早,现在已经是一个非常成熟的项目,也是Kye-Value
数据库
领域最大的热点,现在被广泛的应用在很多很多网站上。TC是一个高
性能
的存储引擎,而TT提供了多线程高并发服务器,
性能
也非常出色,每秒可以处理 4-5万次读写操作。 TC除了
支持
Key-Value存储之外,还
支持
保存Hashtable数据类型,因此很像一个简单的
数据库
表,并且还
支持
基于column的条件
查询
,
分页
查询
和排序
功能
,基本上相当于
支持
单表的基础
查询
功能
了,所以可以简单的替代关系
数据库
的很多操作,这也是TC受到大家欢迎的主要原因之一,有一个Ruby的项目miyazakiresistance将TT的hashtable的操作封装成和ActiveRecord一样的操作,用起来非常爽。 TC/TT在mixi的实际应用当中,存储了2000万条以上的数据,同时支撑了上万个并发连接,是一个久经考验的项目。TC在保证了极高的并发读写
性能
的同时,具有可靠的数据持久化机制,同时还
支持
类似关系
数据库
表结构的hashtable以及简单的条件,
分页
和排序操作,是一个很棒的No
sql
数据库
。 TC的主要缺点是在数据量达到上亿级别以后,并发写数据
性能
会大幅度下降,No
sql
: If Only It Was That Easy提到,他们发现在TC里面插入1.6亿条2-20KB数据的时候,写入
性能
开始急剧下降。看来是当数据量上亿条的时候,TC
性能
开始大幅度下降,从TC作者自己提供的mixi数据来看,至少上千万条数据量的时候还没有遇到这么明显的写入
性能
瓶颈。 这个是Tim Yang做的一个Memcached,Redis和Tokyo Tyrant的简单的
性能
评测,仅供参考 3、Flare TC是日本第一大SNS网站mixi开发的,而Flare是日本第二大SNS网站green.jp开发的,有意思吧。Flare简单的说就是给 TC
添加
了scale
功能
。他替换掉了TT部分,自己另外给TC写了网络服务器,Flare的主要特点就是
支持
scale能力,他在网络服务端之前
添加
了一个node server,来管理后端的多个服务器节点,因此可以动态
添加
数据库
服务节点,
删除
服务器节点,也
支持
failover。如果你的使用场景必须要让TC可以scale,那么可以考虑flare。 flare唯一的缺点就是他只
支持
memcached协议,因此当你使用flare的时候,就不能使用TC的table数据结构了,只能使用TC 的key-value数据结构存储。 二、满足海量存储需求和访问的面向文档的
数据库
:MongoDB,CouchDB 面向文档的非关系
数据库
主要
解决
的问题不是高
性能
的并发读写,而是保证海量数据存储的同时,具有良好的
查询
性能
。MongoDB是用C++开发的,而CouchDB则是Erlang开发的: 1、MongoDB MongoDB是一个介于关系
数据库
和非关系
数据库
之间的产品,是非关系
数据库
当中
功能
最丰富,最像关系
数据库
的。他
支持
的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他
支持
的
查询
语言非常强大,其语法有点类似于面向对象的
查询
语言,几乎可以实现类似关系
数据库
单表
查询
的绝大部分
功能
,而且还
支持
对数据建立索引。 Mongo主要
解决
的是海量数据的访问效率问题,根据官方的文档,当数据量达到50GB以上的时候,Mongo的
数据库
访问速度是
MysqL
的 10倍以上。Mongo的并发读写效率不是特别出色,根据官方提供的
性能
测试表明,大约每秒可以处理0.5万-1.5次读写请求。对于Mongo的并发读写
性能
,我(robbin)也打算有空的时候好好测试一下。 因为Mongo主要是
支持
海量数据存储的,所以Mongo还
自带
了一个出色的分布式
文件
系统GridFS,可以
支持
海量的数据存储,但我也看到有些
评论
认为GridFS
性能
不佳,这一点还是有待亲自做点测试来验证了。 最后由于Mongo可以
支持
复杂的数据结构,而且带有强大的数据
查询
功能
,因此非常受到欢迎,很多项目都考虑用MongoDB来替代
MysqL
来实现不是特别复杂的Web应用,比方说why we migrated from
MysqL
to MongoDB就是一个真实的从
MysqL
迁移到MongoDB的案例,由于数据量实在太大,所以迁移到了Mongo上面,数据
查询
的速度得到了非常显著的提升。 MongoDB也有一个ruby的项目MongoMapper,是模仿Merb的DataMapper编写的MongoDB的接口,使用起来非常简单,几乎和DataMapper一模一样,
功能
非常强大易用。 2、CouchDB CouchDB现在是一个非常有名气的项目,似乎不用多介绍了。但是我却对CouchDB没有什么兴趣,主要是因为CouchDB仅仅提供了基于 HTTP REST的接口,因此CouchDB单纯从并发读写
性能
来说,是非常糟糕的,这让我立刻抛弃了对CouchDB的兴趣。 三、满足高可扩展性和可用性的面向分布式计算的
数据库
:Cassandra,Voldemort 面向scale能力的
数据库
其实主要
解决
的问题领域和上述两类
数据库
还不太一样,它首先必须是一个分布式的
数据库
系统,由分布在不同节点上面的
数据库
共同构成一个
数据库
服务系统,并且根据这种分布式架构来提供online的,具有弹性的可扩展能力,例如可以不停机的
添加
更多数据节点,
删除
数据节点等等。因此像Cassandra常常被看成是一个开源版本的Google BigTable的替代品。Cassandra和Voldemort都是用Java开发的: 1、Cassandra Cassandra项目是Facebook在2008年开源出来的,随后Facebook自己使用Cassandra的另外一个不开源的分支,而开源出来的Cassandra主要被Amazon的Dynamite团队来维护,并且Cassandra被认为是Dynamite2.0版本。目前除了 Facebook之外,twitter和digg.com都在使用Cassandra。 Cassandra的主要特点就是它不是一个
数据库
,而是由一堆
数据库
节点共同构成的一个分布式网络服务,对Cassandra的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展
性能
是比较简单的事情,只管在群集里面
添加
节点就可以了。我看到有
文章
说Facebook的Cassandra群集有超过100台服务器构成的
数据库
群集。 Cassandra也
支持
比较丰富的数据结构和
功能
强大的
查询
语言,和MongoDB比较类似,
查询
功能
比MongoDB稍弱一些,twitter的平台架构部门领导Evan Weaver写了一篇
文章
介绍Cassandra:http://blog.evanweaver.com/articles/2009/07/06/up-and-running-with-cassandra/,有非常详细的介绍。 Cassandra以单个节点来衡量,其节点的并发读写
性能
不是特别好,有
文章
说评测下来Cassandra每秒大约不到1万次读写请求,我也看到一些对这个问题进行质疑的
评论
,但是评价Cassandra单个节点的
性能
是没有意义的,真实的分布式
数据库
访问系统必然是n多个节点构成的系统,其并发
性能
取决于整个系统的节点
数量
,路由效率,而不仅仅是单节点的并发
负载
能力。 2、Voldemort Voldemort是个和Cassandra类似的面向
解决
scale问题的分布式
数据库
系统,Cassandra来自于Facebook这个 SNS网站,而Voldemort则来自于Linkedin这个SNS网站。说起来SNS网站为我们贡献了n多的No
sql
数据库
,例如Cassandar,Voldemort,Tokyo Cabinet,Flare等等。Voldemort的资料不是很多,因此我没有特别仔细去钻研,Voldemort官方给出Voldemort的并发读写
性能
也很不错,每秒超过了1.5万次读写。 从Facebook开发Cassandra,Linkedin开发Voldemort,我们也可以大致看出国外大型SNS网站对于分布式
数据库
,特别是对
数据库
的scale能力方面的需求是多么殷切。前面我(robbin)提到,web应用的架构当中,web层和app层相对来说都很容易横向扩展,唯有
数据库
是单点的,极难scale,现在Facebook和Linkedin在非关系型
数据库
的分布式方面探索了一条很好的方向,这也是为什么现在 Cassandra这么热门的主要原因。 如今,No
sql
数据库
是个令人很兴奋的领域,总是不断有新的技术新的产品冒出来,改变我们已经形成的固有的技术观念,我自己(robbin)稍微了解了一些,就感觉自己深深的沉迷进去了,可以说No
sql
数据库
领域也是博大精深的,我(robbin)也只能浅尝辄止,我(robbin)写这篇
文章
既是自己一点点钻研心得,也是抛砖引玉,希望吸引对这个领域有经验的朋友来讨论和交流。 从我(robbin)个人的兴趣来说,分布式
数据库
系统不是我能实际用到的技术,因此不打算花时间深入,而其他两个数据领域(高
性能
No
sql
DB和海量存储No
sql
DB)都是我很感兴趣的,特别是Redis,TT/TC和MongoDB这3个No
sql
数据库
,因此我接下来将写三篇
文章
分别详细介绍这3个
数据库
。
上一篇:NoSQL数据库技术特性解析之文档数据
下一篇:8种Nosql数据库系统对比
猜你在找的NoSQL相关文章
Redis进阶实践之十八 使用管道模式提高Redis查询的速度
一、引言 学习redis 也有一段时间了,该接触的也差不多了。后来有一天,以前的同事问我,如...
作者:前端之家 时间:2020-11-07
MongoDb进阶实践之二 如何在Windows上安装和配置MongoDB
一、引言 上一篇文章,我介绍了如何在Linux系统上安装和配置MongoDB,其实都不是很难,不需...
作者:前端之家 时间:2020-11-07
Redis进阶实践之十七 Redis协议的规范
一、介绍 Redis客户端使用RESP(Redis的序列化协议)协议与Redis的服务器端进行通信。 虽然...
作者:前端之家 时间:2020-11-07
Redis进阶实践之十九 Redis如何使用lua脚本
一、引言 redis学了一段时间了,基本的东西都没问题了。从今天开始讲写一些redis和lua脚本...
作者:前端之家 时间:2020-11-07
Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)
一、介绍 今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完...
作者:前端之家 时间:2020-11-07
Redis进阶实践之十四 Redis-cli命令行工具使用详解第一部分
一、介绍 redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西。现在redis的...
作者:前端之家 时间:2020-11-07
MongoDb进阶实践之七 MongoDB的索引入门
一、引言 好久没有写东西了,MongoDB系列的文章也丢下好长时间了。今天终于有时间了,就写...
作者:前端之家 时间:2020-11-07
Memcached在Linux环境下的使用详解
一、引言 写有关NoSQL数据库有关的文章已经有一段时间了,可以高兴的说,Redis暂时就算写完...
作者:前端之家 时间:2020-11-07
Redis进阶实践之二十 Redis的配置文件使用详解
一、引言 写完上一篇有关redis使用lua脚本的文章,就有意结束Redis这个系列的文章了,当然...
作者:前端之家 时间:2020-11-07
Redis进阶实践之十二 Redis的Cluster集群动态扩容
一、引言 上一篇文章我们一步一步的教大家搭建了Redis的Cluster集群环境,形成了3个主节点...
作者:前端之家 时间:2020-11-07
编程分类
MySQL
MsSQL
Oracle
Sqlite
Postgre SQL
Mariadb
MongoDB
NoSQL
HBase
JDBC
最新文章
• Redis进阶实践之十八 使用
• MongoDb进阶实践之二 如何
• Redis进阶实践之十七 Redi
• Redis进阶实践之十九 Red
• Redis进阶实践之十五 Redi
• MongoDb进阶实践之六 Mong
• Redis进阶实践之十四 Redi
• MongoDb进阶实践之七 Mong
• Memcached在Linux环境下的
• Redis进阶实践之二十 Redi
热门标签
更多 ►
undo日志
persistent-c
mysql-error-
postal-code
sql-match-al
mysql-5.6
mysql-8.0
database-tri
安装路径
系统错误
data_dir
丢失文件
主从同步
sql_mode
数据库目录
匿名用户
character_se
ID归零
数据库位置
查询表
重复字段
查询字段
截断日志
SUSPECT
7391
Remote Serve
Linked Serve
玄学问题
登录不上
开启远程访问