浏览模式: 标准 | 列表 分类:系统&服务

八种不同的NoSql对比

14

虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破。这只是时间问题:被迫使用关系数据库,但最终发现不能适应需求的情况不胜枚举。

  但是NoSQL数据库之间的不同,远超过两 SQL数据库之间的差别。这意味着软件架构师更应该在项目开始时就选择好一个适合的 NoSQL数据库。针对这种情况,这里对 CassandraMongodbCouchDBRedis、 Riak、 MembaseNeo4jHBase进行了比较:

  (编注1:NoSQL:是一项全新的数据库革命性运动,NoSQL的拥护者们提倡运用非关系型的数据存储。现今的计算机体系结构在数据存储方面要求具 备庞大的水平扩 展性,而NoSQL致力于改变这一现状。目前Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型数据库。 参见NoSQL词条。)


  1. CouchDB
所用语言: Erlang特点:DB一致性,易于使用使用许可: Apache协议: HTTP/REST双向数据复制,持续进行或临时处理,处理时带冲突检查,因此,采用的是master-master复制(见编注2)MVCC - 写操作不阻塞读操作可保存文件之前的版本Crash-only(可靠的)设计需要不时地进行数据压缩视图:嵌入式 映射/减少格式化视图:列表显示支持进行服务器端文档验证支持认证根据变化实时更新支持附件处理因此, CouchApps(独立的 js应用程序)需要 jQuery程序库
  最佳应用场景:适用于数据变化较少,执行预定义查询,进行数据统计的应用程序。适用于需要提供数据版本支持的应用程序。

  例如: CRM、CMS系统。 master-master复制对于多站点部署是非常有用的。

  (编注2:master-master复制:是一种数据库同步方法,允许数据在一组计算机之间共享数据,并且可以通过小组中任意成员在组内进行数据更新。)


  2. Redis
所用语言:C/C++特点:运行异常快使用许可: BSD协议:类 Telnet有硬盘存储支持的内存数据库,但自2.0版本以后可以将数据交换到硬盘(注意, 2.4以后版本不支持该特性!)Master-slave复制(见编注3)虽然采用简单数据或以键值索引的哈希表,但也支持复杂操作,例如 ZREVRANGEBYSCORE。INCR & co (适合计算极限值或统计数据)支持 sets(同时也支持 union/diff/inter)支持列表(同时也支持队列;阻塞式 pop操作)支持哈希表(带有多个域的对象)支持排序 sets(高得分表,适用于范围查询)Redis支持事务支持将数据设置成过期数据(类似快速缓冲区设计)Pub/Sub允许用户实现消息机制
  最佳应用场景:适用于数据变化快且数据库大小可遇见(适合内存容量)的应用程序。

  例如:股票价格、数据分析、实时数据搜集、实时通讯。

  (编注3:Master-slave复制:如果同一时刻只有一台服务器处理所有的复制请求,这被称为 Master-slave复制,通常应用在需要提供高可用性的服务器集群。)


  3. MongoDB
所用语言:C++特点:保留了SQL一些友好的特性(查询,索引)。使用许可: AGPL(发起者: Apache)协议: Custom, binary( BSON)Master/slave复制(支持自动错误恢复,使用 sets 复制)内建分片机制支持 javascript表达式查询可在服务器端执行任意的 javascript函数update-in-place支持比CouchDB更好在数据存储时采用内存到文件映射对性能的关注超过对功能的要求建议最好打开日志功能(参数 --journal)在32位操作系统上,数据库大小限制在约2.5Gb空数据库大约占 192Mb采用 GridFS存储大数据或元数据(不是真正的文件系统)
  最佳应用场景:适用于需要动态查询支持;需要使用索引而不是 map/reduce功能;需要对大数据库有性能要求;需要使用 CouchDB但因为数据改变太频繁而占满内存的应用程序。

  例如:你本打算采用 MySQL或 PostgreSQL,但因为它们本身自带的预定义栏让你望而却步。



  4. Riak
所用语言:Erlang和C,以及一些Javascript特点:具备容错能力使用许可: Apache协议: HTTP/REST或者 custom binary可调节的分发及复制(N, R, W)用 JavaScript or Erlang在操作前或操作后进行验证和安全支持。使用JavaScript或Erlang进行 Map/reduce连接及连接遍历:可作为图形数据库使用索引:输入元数据进行搜索(1.0版本即将支持)大数据对象支持( Luwak)提供“开源”和“企业”两个版本全文本搜索,索引,通过 Riak搜索服务器查询( beta版)支持Masterless多站点复制及商业许可的 SNMP监控
  最佳应用场景:适用于想使用类似 Cassandra(类似Dynamo)数据库但无法处理 bloat及复杂性的情况。适用于你打算做多站点复制,但又需要对单个站点的扩展性,可用性及出错处理有要求的情况。

  例如:销售数据搜集,工厂控制系统;对宕机时间有严格要求;可以作为易于更新的 web服务器使用。



  5. Membase
所用语言: Erlang和C特点:兼容 Memcache,但同时兼具持久化和支持集群使用许可: Apache 2.0协议:分布式缓存及扩展非常快速(200k+/秒),通过键值索引数据可持久化存储到硬盘所有节点都是唯一的( master-master复制)在内存中同样支持类似分布式缓存的缓存单元写数据时通过去除重复数据来减少 IO提供非常好的集群管理 web界面更新软件时软无需停止数据库服务支持连接池和多路复用的连接代理
  最佳应用场景:适用于需要低延迟数据访问,高并发支持以及高可用性的应用程序

  例如:低延迟数据访问比如以广告为目标的应用,高并发的 web 应用比如网络游戏(例如 Zynga)



  6. Neo4j

所用语言: Java特点:基于关系的图形数据库使用许可: GPL,其中一些特性使用 AGPL/商业许可协议: HTTP/REST(或嵌入在 Java中)可独立使用或嵌入到 Java应用程序图形的节点和边都可以带有元数据很好的自带web管理功能使用多种算法支持路径搜索使用键值和关系进行索引为读操作进行优化支持事务(用 Java api)使用 Gremlin图形遍历语言支持 Groovy脚本支持在线备份,高级监控及高可靠性支持使用 AGPL/商业许可
  最佳应用场景:适用于图形一类数据。这是 Neo4j与其他nosql数据库的最显著区别

  例如:社会关系,公共交通网络,地图及网络拓谱


  7. Cassandra

所用语言: Java特点:对大型表格和 Dynamo支持得最好使用许可: Apache协议: Custom, binary (节约型)可调节的分发及复制(N, R, W)支持以某个范围的键值通过列查询类似大表格的功能:列,某个特性的列集合写操作比读操作更快基于 Apache分布式平台尽可能地 Map/reduce我承认对 Cassandra有偏见,一部分是因为它本身的臃肿和复杂性,也因为 Java的问题(配置,出现异常,等等)
  最佳应用场景:当使用写操作多过读操作(记录日志)如果每个系统组建都必须用 Java编写(没有人因为选用 Apache的软件被解雇)

  例如:银行业,金融业(虽然对于金融交易不是必须的,但这些产业对数据库的要求会比它们更大)写比读更快,所以一个自然的特性就是实时数据分析



  8. HBase

  (配合 ghshephard使用)
所用语言: Java特点:支持数十亿行X上百万列使用许可: Apache协议:HTTP/REST (支持 Thrift,见编注4)在 BigTable之后建模采用分布式架构 Map/reduce对实时查询进行优化高性能 Thrift网关通过在server端扫描及过滤实现对查询操作预判支持 XML, Protobuf, 和binary的HTTPCascading, hive, and pig source and sink modules基于 Jruby( JIRB)的shell对配置改变和较小的升级都会重新回滚不会出现单点故障堪比MySQL的随机访问性能  最佳应用场景:适用于偏好BigTable:)并且需要对大数据进行随机、实时访问的场合。

  例如: Facebook消息数据库(更多通用的用例即将出现)

  编注4:Thrift 是一种接口定义语言,为多种其他语言提供定义和创建服务,由Facebook开发并开源

用dd命令测试磁盘写入性能

21

1. dd if=/dev/zero of=test bs=64k count=16k

  这个很不准确的,因为命令结束的时候数据还没有真正写到磁盘上去

  2. dd if=/dev/zero of=test bs=64k count=16k conv=fsync

  这个还算准确,数据已经写入磁盘

  3. dd if=/dev/zero of=test bs=64k count=4k oflag=dsync

  这个可以当成是模拟数据库插入操作,所以很慢

  接着让我们来看看buyvm的磁盘性能

  dd if=/dev/zero of=test bs=64k count=16k

  1073741824 bytes (1.1 GB) copied, 2.99687 seconds, 358 MB/s

  第一种方式得到的结果貌似很快

  dd if=/dev/zero of=test bs=64k count=16k conv=fsync

  1073741824 bytes (1.1 GB) copied, 13.9241 seconds, 77.1 MB/s

  这次慢了很多,这个数据才有参考价值

  dd if=/dev/zero of=test bs=64k count=2k oflag=dsync

  134217728 bytes (134 MB) copied, 177.813 seconds, 755 kB/s

  这是buyvm的真正实力,我在84的vps上测可是有20M/s的

 

TAGS: dd

Google 推出 mod_pagespeed 模块 让你的网站飞起来

08

mod_pagespeed是一个Apache httpd模块,它可自动完成15项以上的优化工作包括优化缓存,减少客户端服务器之间的通讯,降低负载等。

目前支持 CentOS, RHEL, Ubuntu, Debian, Fedora 等 Linux 发行版,用户只需要下载并安装相应的 Deb 或 RPM 包就可以完全自动优化 Apache Http 服务器了。

mod_pagespeed已应用于有 850万客户的 GoDaddy 服务器上,而且反响良好。

根据此前的一些实践来看, 通过 mod_pagespeed 可以对 Web 性能的多个方面,包括缓存、客户端与服务器之间的连接、载荷大小等进行优化,最大可将页面加载时间缩短 50% 。

 

网页提速的问题是一个复杂多样的问题,有很多解决方法,往往关系到网站系统程序,服务器硬件,网络传输速度等方面,而Google这款加速模块简单的解决了许多复情况的问题:

•如果你的网站采用apache构建服务器,不需要对网站CMS系统进行处理即可应用
•加速模块可以自行对网络传输的html字节优化及对图象,css进入压缩优化传输
•智能缓存是一大亮点,它可以自动智能缓存,加速下载
下面介绍一下所有特点功能

优化缓存
•缓存扩展
•压缩处理CSS
•优化javascript最大限度的减少重复请求
•自动缓存CSS
•JavaScript内嵌技术
有效载荷尺寸最小化
•压缩空白
•合并头信息
•附加属性
•内建核心Javascript
•优化图像下载
•跳地非法字符
•重写优化CSS

 

大型网站架构不得不考虑的10个问题

17

这里的大型网站架构只包括高互动性高交互性的数据型大型网站,基于大家众所周知的原因,我们就不谈新闻类和一些依靠HTML静态化就可以实现的架构了,我 们以高负载高数据交换高数据流动性的网站为例,比如海内,开心网等类似的web2.0系列架构。这个时候,就需要一个好的数据并发处理策略以及缓存策略。 5、数据索引的问题。们这里不讨论是PHP还是JSP或者.NET环境,我们从架构的方面去看问题,实现语言方面并不是问题,语言的优势在于实现而不是好 坏,不论你选择任何语言,架构都是必须要面对的。

这里的大型网站架构只包括高互动性高交互性的数据型大型网站,基于大家众所周知的原因, 我们就不谈新闻类和一些依靠HTML静态化就可以实现的架构了,我们以高负载高数据交换高数据流动性的网站为例,比如海内,开心网等类似的web2.0系 列架构。我们这里不讨论是 PHP还是JSP或者.NET环境,我们从架构的方面去看问题,实现语言方面并不是问题,语言的优势在于实现而不是好坏,不论你选择任何语言,架构都是必 须要面对的。

这里讨论一下大型网站需要注意和考虑的问题

1、海量数据的处理

众所周知,对于一些相对小的 站点来说,数据量并不是很大,select和update就可以解决我们面对的问题,本身负载量不是很大,最多再加几个索引就可以搞定。对于大型网站,每 天的数据量可能就上百万,如果一个设计不好的多对多关系,在前期是没有任何问题的,但是随着用户的增长,数据量会是几何级的增长的。在这个时候我们对于一 个表的select和update的时候(还不说多表联合查询)的成本的非常高的。

2、数据并发的处理

在一些时 候,2.0的CTO都有个尚方宝剑,就是缓存。对于缓存,在高并发高处理的时候也是个大问题。在整个应用程序下,缓存是全局共享的,然而在我们进行修改的 时候就,如果两个或者多个请求同时对缓存有更新的要求的情况下,应用程序会直接的死掉。这个时候,就需要一个好的数据并发处理策略以及缓存策略。

另外,就是数据库的死锁问题,也许平时我们感觉不到,死锁在高并发的情况下的出现的概率是非常高的,磁盘缓存就是一个大问题。

3、文件存贮的问题

对 于一些支持文件上传的2.0的站点,在庆幸硬盘容量越来越大的时候我们更多的应该考虑的是文件应该如何被存储并且被有效的索引。常见的方案是对文件按照日 期和类型进行存贮。但是当文件量是海量的数据的情况下,如果一块硬盘存贮了500个G的琐碎文件,那么维护的时候和使用的时候磁盘的Io就是一个巨大的问 题,哪怕你的带宽足够,但是你的磁盘也未必响应过来。如果这个时候还涉及上传,磁盘很容易就over了。

也许用raid和专用存贮服务器能解决眼下的问题,但是还有个问题就是各地的访问问题,也许我们的服务器在北京,可能在云南的访问速度如何解决?如果做分布式,那么我们的文件索引以及架构该如何规划。

所以我们不得不承认,文件存贮是个很不容易的问题

4、数据关系的处理

我们可以很容易的规划出一个符合第三范式的数据库,里面布满了多对多关系,还能用GUID来替换INDENTIFY COLUMN 但是,多对多关系充斥的2.0时代,第三范式是第一个应该被抛弃的。必须有效的把多表联合查询降到最低。

5、数据索引的问题

众所周知,索引是提高数据库效率查询的最方面最廉价最容易实现的方案。但是,在高UPDATE的情况下,update和delete付出的成本会高的无法想想,笔者遇到过一个情况,在更新一个聚焦索引的时候需要10分钟来完成,那么对于站点来说,这些基本上是不可忍受的。

索引和更新是一对天生的冤家,问题A,D,E这些是我们在做架构的时候不得不考虑的问题,并且也可能是花费时间最多的问题,

6、分布式处理

对于2.0网站由于其高互动性,CDN实现的效果基本上为0,内容是实时更新的,我们常规的处理。为了保证各地的访问速度,我们就需要面对一个绝大的问题,就是如何有效的实现数据同步和更新,实现各地服务器的实时通讯有是一个不得不需要考虑的问题。

7、Ajax的利弊分析

成 也AJAX,败也AJAX,AJAX成为了主流趋势,突然发现基于XMLHTTP的post和get是如此的容易。客户端get或者post 到服务器数据,服务器接到数据请求之后返回来,这是一个很正常的AJAX请求。但是在AJAX处理的时候,如果我们使用一个抓包工具的话,对数据返回和处 理是一目了然。对于一些计算量大的AJAX请求的话,我们可以构造一个发包机,很容易就可以把一个webserver干掉。

8、数据安全性的分析

对 于HTTP协议来说,数据包都是明文传输的,也许我们可以说我们可以用加密啊,但是对于G问题来说的话,加密的过程就可能是明文了(比如我们知道的QQ, 可以很容易的判断他的加密,并有效的写一个跟他一样的加密和解密方法出来的)。当你站点流量不是很大的时候没有人会在乎你,但是当你流量上来之后,那么所 谓的外挂,所谓的群发就会接踵而来(从qq一开始的群发可见端倪)。也许我们可以很的意的说,我们可以采用更高级别的判断甚至HTTPS来实现,注意,当 你做这些处理的时候付出的将是海量的database,io以及CPU的成本。对于一些群发,基本上是不可能的。笔者已经可以实现对于百度空间和qq空间 的群发了。大家愿意试试,实际上并不是很难。

9、数据同步和集群的处理的问题

当我们的一台databaseserver 不堪重负的时候,这个时候我们就需要做基于数据库的负载和集群了。而这个时候可能是最让人困扰的的问题了,数据基于网络传输根据数据库的设计的不同,数据 延迟是很可怕的问题,也是不可避免的问题,这样的话,我们就需要通过另外的手段来保证在这延迟的几秒或者更长的几分钟时间内,实现有效的交互。比如数据散 列,分割,内容处理等等问题

10、数据共享的渠道以及OPENAPI趋势

Openapi已经成为一个不可避免的趋势,从 google,facebook,myspace到海内校内,都在考虑这个问题,它可以更有效的留住用户并激发用户的更多的兴趣以及让更多的人帮助你做最 有效的开发。这个时候一个有效的数据共享平台,数据开放平台就成为必不可少的途径了,而在开放的接口的情况保证数据的安全性和性能,又是一个我们必须要认 真思考的问题了

TAGS: 架构

Linux命令行扫盲 最基本命令应用

06

在Linux的世界中最不能缺少的就是Linux命令行的应用。Linux命令行可以帮助我们十分迅速的找的想要的、完成想做的、批量完成各种繁琐的事情。是一个不折不扣的系统管理与应用的利器。本文主要向大家介绍最常见的几个Linux命令,进行一次大型的Linux命令扫盲。
su
su命令是最基本的命令之一,常用于不同用户间切换。例如,如果登录为 user1,要切换为user2,只要用如下命令:
$su user2
然后系统提示输入user2口令,输入正确的口令之后就可以切换到user2。完成之后就可以用exit命令返回到user1。
su命令的常见用法是变成根用户或超级用户。如果发出不带用户名的su命令 ,则系统提示输入根口令,输入之后则可切换为根用户。
如果登录为根用户,则可以用su命令成为系统上任何用户而不需要口令。
pwd
pwd命令也是最常用最基本的命令之一,用于显示用户当前所在的目录
cd
cd命令不仅显示当前状态,还改变当前状态,它的用发跟dos下的cd命令基本一致。
cd ..可进入上一层目录   cd -可进入上一个进入的目录   cd ~可进入用户的home目录
ls
ls命令跟dos下的dir命令一样,用于显示当前目录的内容。
如果想取得详细的信息,可用ls -l命令, 这样就可以显示目录内容的详细信息。
如果目录下的文件太多,用一屏显示不了,可以用ls -l |more分屏显示 。
find
find命令用于查找文件。这个命令可以按文件名、建立或修改日期、所有者(通常是建立文件的用户)、文件长度或文件类型进行搜索。
find命令的基本结构如下:
$find
其中指定从哪个目录开始搜索。指定搜索条件。表示找到文件怎么处理。一般来说,要用-print动作,显示 整个文件路径和名称。如果没有这个动作,则find命令进行所要搜索而不显示结果,等于白费劲。
例如,要搜索系统上所有名称为ye的文件,可用如下命令:
$find / -name ye -print
这样就可以显示出系统上所有名称为ye的文件。
tar
tar最初用于建立磁带备份系统,目前广泛用于建立文件发布档案。可用如下方法建立tar档案:
$tar cvf
例如,如果要将当前目录中所有文件存档到ye.tar中,可用如下命令:
$tar cvf ye.tar *.*
要浏览档案内容,将c选项变成t。如果要浏览ye.tar档案中的内容,可用如下命令:
$tar tvf ye.tar
要取出档案内的内容,将c选项变成x。如果要将ye.tar档案中的内容取到当前目录中,可用如下命令:
$tar xvf ye.tar
gzip
gzip命令用于压缩文件。 例如,如果要将ye.txt文件压缩,可用如下命令:
$gzip ye.txt
这样就可以压缩文件并在文件名后面加上gz扩展名,变成文件ye.txt.gz。
解压缩文件可用gzip -d命令实现:
$gzip -d ye.txt.gz
这样就可以解压缩文件并删除gz扩展名。除此之外还可以用gunzip命令来解 压缩文件,效果跟用gzip -d命令一样。
旧版的tar命令不压缩档案,可用gzip压缩。例如:
$tar cvf ye.tar *.txt   $gzip ye.tar
则可建立压缩档案ye.tar.gz。
新版的tar可以直接访问和建立gzip压缩的tar档案,只要在tar命令中加上z 选项就可以了。例如:
$tar czvf ye.tar *.txt
生成压缩档案ye.tar.gz,
$tar tzvf ye.tar *.txt
显示压缩档案ye.tar.gz的内容,而
$tar xzvf ye.tar *.txt
取出压缩档案ye.tar.gz的内容。
mkdir
这个命令很简单,跟dos的md命令用法几乎一样,用于建立目录。
cp
cp命令用于复制文件或目录。
cp命令可以一次复制多个文件,例如:
$cp *.txt *.doc *.bak /home
将当前目录中扩展名为txt、doc和bak的文件全部复制到/home目录中。
如果要复制整个目录及其所有子目录,可以用cp -R命令。
rm
rm命令用于删除文件或目录。
rm命令会强制删除文件,如果想要在删除时提示确认,可用rm -i命令。
如果要删除目录,可用rm -r命令。rm -r命令在删除目录时,每删除一个文件或目录都会显示提示,如果目录太大,响应每个提示是不现实的。这时可以用 rm -rf命令来强制删除目录,这样即使用了-i标志也当无效处理。
mv
mv命令用于移动文件和更名文件。例如:
$mv ye.txt /home
将当前目录下的ye.txt文件移动到/home目录下,
$mv ye.txt ye1.txt
将ye.txt文件改名为ye1.txt。
类似于跟cp命令,mv命令也可以一次移动多个文件,在此不再赘叙。
reboot
重启命令,不必多说。
halt
关机命令,不必多说。

TAGS: linux

404中的学问

09

404的基本理解就是网页不存在,它是HTTP协议中的一个状态码。

最近需要通过404来解决一个问题,所以产生了一系列关于404的研究,总结一些小小收获分享出来:

1.即使你自定义了404的页面,但http头信息返回的一定要是404状态。这主要是对搜索引擎有关系,因为如果你网站产生较多页面时候但搜索引擎看到的是很多一样的正常页面,有可能会误被认为作弊。

2.404页面不要自动跳转,让用户来决定去向。

3.自定义404页面内容不要太小,否则浏览器不认。这个我可是吃过苦头了,就因为这个原因折腾了一天。http的数据分为header和content ,对于浏览器来说显示什么内容其实并不是header决定的而是content,也就是当header信息是404状态的时候,如果你输出的content有内容还应该象是一个页面,那浏览器就把你这个内容输出给用户,反之浏览就会把它默认的404页面显示给用户。

关于其它希望更多补充…

我们的404页面,做了这么几个工作:

1.识别图片,也就是说如果url是图片那我返回的是图片而不是html,这样就不会造成,假设你的网站有些图片被删除后网站上显示红X的不好体验。

2.重新生成静态页,在信息详细页如果静态页不存在可以在404页触发时被生成。

3.识别搜索引擎关键字,给用户更好的引导信息,也就是如果用户从搜索引擎进来的页面是不存在的,那么我们可以通过用户在搜索引擎输入的关键字提供我们网站的相关信息给用户,以防止用户直接流失,效果直接看下图:

百度的某个关键字搜索:

http://www.baidu.com/s?wd=%B3%F6%CA%DB+%C3%C0%C8%CB%B1%AA+%BA%DA

Records:52123456789