07 Dec

拉环很爱易拉罐,他们不再分离

我是个土人,平时喝罐装饮料也不多。某个月当有一天喝可乐的时候,发现拉环拉起来后没有和易拉罐分离,另外一部分嵌入到易拉罐里面了。我很慌张啊,心想自己咋这么丢人呢,连易拉罐也不会开。从此以后,每次喝可乐我就很小心,很细致的去拉拉环,但始终没能成功把它拉出来。

终于有一天真相让我泪流满面。那拉环是真的不能拉出来的,为了环保的考虑,拉环都做成内嵌式的了。是的,现在不会有人整天发“拉环一直喜欢易拉罐,可是易拉罐的心里却住着可乐。所以每当喝完罐状可乐,请把拉环放入易拉罐,成全拉环的爱情!”这种白痴信息了,拉环和易拉罐已经再也不会分离了。

03 Dec

康神之bbs心得

原作者:kxn@bbs.Tsinghua.edu.cn / smth.org / bbs.newsmth.net
康神kxn的blog:kangkang.org 内含:康神之心得、发布Fterm最新版本、提交Fterm的bug
注:这是康神的一篇旧作,转载时请勿删除以上信息,以示对原作者kxn之尊重!谢谢!
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   我们现在提到的 BBS ,通常指的都是 Telnet BBS ,用一个 term 软件连接上,就可以看到文本的界面,比起如今花哨到无以复加的 WWW BBS 们来可谓是简陋到了极点,然而就是这样的 BBS,无数人每天面对它长达两位数小时还乐在其中,恐怕 UI 设计专家们知道也要气到吐血。也不时有人发表预言,预言 Telnet BBS 将很快消亡而被更加富有表现力的WWW BBS全面取代,只是年复一年,当年的预言者已经消失不见,BBS 上的用户数目却翻了一番又一番。。。这就是 Telnet BBS 的魅力。
Telnet BBS 系统数目众多,但是从根源找起,大致可以分成两大家族,Firebird BBS 和 Maple BBS,在大陆 Firebird BBS 的变种占据了绝对优势,在台湾地区则是 Maple BBS 的天下,由于台湾地区计算机发展历史比较长,因此 BBS 的人气也比大陆高,同时上站人数过万的站点有好几个,不过大陆毕竟有着人口优势,近年来教育网几大 BBS 的人数也迅速增长。下面我们就分别介绍这两大 BBS 家族。首先是在大陆最为流行的Firebird BBS ,最有名的 SMTH BBS, YTHT BBS,  Firebird 2000 三大流派都是由此而来。
很久很久以前,有那么一群大学生,也可能是科研机构的研究员什么的,他们整天在Unix主机上面打滚,觉得要是能在主机上面做一个论坛样的东西多好,于是他们就写了一个命令行程序,运行这个程序,操作者可以在界面下面留言,为了让多个人同时可以操作这个系统,他们把这个程序设置为系统某个用户的 shell ,每个 telnet 上该主机的用户,只要使用这个用户的用户名和密码登陆,就可以进行交流。这就是Internet BBS 的雏形。经过一段时间的发展,这个系统具有了相当多的交互功能,用户不仅可以留言,还可以互相发送信件,发送信息,看到同时在线的用户等等。

BBS 系统的开发者们为了让更多的人能使用这个系统并完善之,将BBS系统以开源协议发布于网络上面。只要拥有Unix主机,就可以取得源代码并安装BBS系统。因此BBS系统以很快的速度发展起来。在众多BBS系统中,某个叫做 Pirate BBS ,经过某些人修改后叫做  Eagle BBS 的分枝,流传入了台湾地区,交大资讯工程系从他发展出了Phoenix BBS,Phoenix BBS 是如今大部分中文 Telnet BBS 系统的祖先,然而它的名字却远不如其后辈响亮,在它的基础上由中正资工进一步修改的 BBS 系统,被赋予了那个大陆 BBS 开发者耳熟能详的名字 -- Firebird BBS。
   应该说, BBS 系统在传入台湾地区时候虽然功能还比较简陋,但是 BBS 系系统的基本架构已经定型,比如多进程模型,共享内存信息交换,利用系统信号来传递呼叫消息,用文件存储文章和索引等,这些设计在现在的 BBS 系统中大部分还在沿用,其中不少设计即使现在来看,也是相当标准有效的多进程 Unix 服务器设计。
   下面我们进入正文。
   Telnet BBS是一种流行于大学和研究机构中的电子公告牌系统,和时下流行的Web BBS系统不同,bbs的界面采用纯文本方式表现,用户使用终端软件连接bbs系统,文本界面在服务器端生成并发送出来,客户端软件仅原样显示文本内容,属于一种瘦客户机的应用。Telnet bbs (后面除非特殊提到,否则简称bbs)在台湾地区和大陆的教育网地区比较流行,比较大规模的站点在线人数一般都在万人以上。
   由于历史原因,bbs系统采用的是Unix下相当传统的1:1多进程模型,每进程处理一个连接的模型,此种模型的好处是服务相对比较稳定,不会因为一个用户出错导致整个系统的不可用,但是也带来耗费资源较多和进程之间通信比较困难的问题。Bbs服务器端的复杂逻辑也使得分布式设计很难实施。因此 bbs通常是单机承担几乎所有负载,大陆地区较大规模的bbs服务器上经常同时保持超过7000进程,台湾地区的bbs站甚至有并发20000进程以上的纪录。
   我们在维护大型bbs站点的过程中,积累了一些优化和维护如bbs这样高并发进程服务器的经验,考虑到1:1进程模型服务仍然有很广泛的应用,在这里写出和读者共享。

   优化服务器是综合性的工作,不仅需要修改代码,还需要调整系统参数,包含有很多琐碎的内容,根据目的来讲,大致可以根据节约资源的类型分为磁盘IO优化,内存优化,和CPU优化等几方面。下面介绍的优化思路虽然应用于bbs,但是也适用于其他应用系统。
1: 磁盘IO优化
磁盘IO优化可以说是服务器优化中最重要的一环,除了极少数的纯计算性应用,几乎所有的重载服务器最后都是卡在磁盘IO瓶颈上面。
a) 尽量使用shm等IPC手段而不是文件
多进程和多线程相比,最大的麻烦是不同执行环境交换信息不方便,因此很多程序员选择了使用文件交换信息,例如最早的bbs设计中,用户的帐户信息是存在于文件中的,进程从文件中读出内容,有修改后就写入文件。改进后的设计是将账号信息文件完整读入共享内存,所有修改都写入共享内存,然后由外部进程定时往磁盘上面同步。
甚至flock这样看起来不会造成太多IO的同步操作都应该尽量避免,原因是flock需要先open文件,而open 文件需要找到i节点,因此会占用文件系统的inode缓存空间,可能造成其他IO操作的性能降低。在很多情况下面需要的只是一个跨进程的mutex,可以使用0/1信号灯来实现。
b) 使用应用层缓存。
很显然,操作系统的缓存会受到很多因素的干扰,对于一些确定会经常访问的内容,例如版面的最新几片文章和最新列表,如果放入shm中缓冲,性能会有大幅度提升。
c) 尽量减少关键IO数据结构的大小
Bbs 文章列表的索引文件是由定长数据结构构成的,在这个数据结构中为了将来扩展方便,留下了很多保留域,造成了很多不必要的IO,删除不必要的域之后,数据结构变小了一半,减少了很多IO。很多时候,扩展性和性能其实是对立的,如果很需要性能,那么损失一定的扩展性也是不错的选择。
d) 避免在同一目录下放过多文件或者使用合适的文件系统
大部分文件系统对在同一目录中的文件列表采用线性存储,因此在一个目录下面存在很多文件的时候,打开文件变得非常的慢,因此通常要将文件根据某种规则散列到不同的子目录中,例如,文件 Atest 会被存放在 A/Atest ,如果文件太多,可能会需要对子目录下面的文件再次进行散列。
另一种解决文件过多影响效率的方法是使用有特殊优化的文件系统,例如Linux下的reiserfs。在这些文件系统中,目录中的文件列表是用平衡树来组织的,因此同一目录下面可以同时有数十万个文件而不会降低太多性能。
e) 根据系统的访问模式选择适合的硬件配置和系统参数
Bbs 系统使用零散的文件存放文章,它的访问模式基本是小文件随机读写,而文章数据相对比较重要,因此bbs使用strip大小比较小的raid5比较合适。文件系统选择专门为小文件优化的reiserfs,系统的预读长度也可以调小一些,Linux 默认的长度是 256K, 有些偏大。如果是大文件连续读写的话,那么raid的strip 大小和系统的预读长度应该放大,文件系统则尽量选择结构简单的文件系统例如ext2/3 等,如果数据并不是非常重要,那么甚至可以取消raid5,代之以raid0或者直接使用单独的硬盘。
2: 内存使用优化
BBS系统使用的多进程模式相当耗费内存,在bbs发展过程中,最早遭遇的瓶颈就是内存。减少内存的不必要浪费,可以节约出来作为系统缓存,从而间接提高更重要的IO性能
a) 尽量避免动态初始化常量,使用const说明将变量和常量区分开来。
Unix 系统在fork出新进程的时候,子进程和父进程共享相同的空间,之后按照COW机制,对修改的页面才进行复制操作,常量如果可以预先计算出来(例如一些转换表之类),就应该尽量避免在运行时动态初始化。另外因为只要修改一个字节,整个页面就都会被复制,因此应该避免常量和会被修改的变量混在一起,编译器本身会自动将不会被修改的内容放在一起,程序员需要做的事情,就是用const通知编译器哪些内容是不会被修改的。
b) 减小内存的峰值使用,特别是堆栈中内存
很多人习惯写程序时候在堆栈上声明一个比较大的临时数组,认为退出函数之后这部分内存会自动被释放。殊不知这样分配的内存并不会被动态被系统回收,因为系统并没有一个明显的标记可以得知堆栈内存是否还在使用中,特别是在多线程的环境下面,操作系统通常采用的措施是需要的时候分配页面,但是在进程退出之前并不回收。即使是通过malloc分配的堆内存,其页面是否回收也视库函数的实现而不确定。因此在无论什么情况下,贸然分配过大的内存,都会对性能造成一定的影响。
c) 如有可能,尽量使用shm来保证页面一定会被多个进程共享。
3: CPU优化
这里说的CPU使用优化,不包括像使用hash来代替线性查找这类最基本的算法优化,而是涉及一些和系统关系比较密切的操作。
a) 使用针对硬件优化的编译器
这应该是所有CPU相关优化中最容易做到也是最容易看到效果的,Intel CPU的Linux系统上面使用 Intel C/C++ 编译器,可以获得很好的效果,甚至AMD的Athlon系列CPU也能获得一定程度的加速。。Bbs进站时候需要初始化很多内容,计算量比较大,使用gcc 时候负载在4左右,使用icc编译以后负载马上下降到1以下。推荐编译时候针对特定CPU指令集优化并且打开跨文件优化选项(-ipo)
b) 使用单独进程来初始化和维护共享内容,避免出现竞争导致逻辑错误
严格讲这并不能提升很多性能,只是为了减少多进程服务器上面经常出现的逻辑错误。在原始的bbs设计中,共享资源的创建是由第一个访问的进程在打开失败时候创建的,但是重负载服务器上面有时候打开也会失败,从而导致多次创建共享资源。
c) 序列化容易导致负载上升的行为
BBS进程在进站时候需要进行很多的初始化工作,同样进程退出的时候也要做很多的收尾工作,此时对CPU或者IO的占用比较大,通过一个互斥锁可以使多个进程不要同时进行这些操作,否则系统负载有可能上升到一定程度引起正反馈,导致系统彻底崩溃。
d) 尽量减少信号的使用
Unix系统下面对于信号的实现的代价是比较大的,同时信号本身也很容易导致处理逻辑的混乱。高负载服服务器应该尽量减少信号的使用。
e) 对于大范围IO读取操作,使用mmap调用
使用mmap操作比传统的read操作好处是减少了一次内核态到用户态的拷贝。在大范围IO操作的时候具有优势,bbs中使用mmap操作来在文件中搜索内容,速度最高时候提高了5倍左右。但是需要注意的是,mmap并不适用于有写入的情况,因为mmap写盘的时候是以页为单位进行操作,页中只要有一个字节被改写,就要往磁盘上面写整个页面的数据,无端增加了IO量。
以上是我们在维护大型bbs站点时积累的一些经验,供各位读者参考。

28 Nov

为什么要用非关系数据库?

From javaeye

随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。而传统的关系数据库在应付 web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:

1、High performance - 对数据库高并发读写的需求
web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的 BBS网站,往往也存在对高并发写请求的需求,例如像JavaEye网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。

2、Huge Storage - 对海量数据的高效率存储和访问的需求
类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Friendfeed为例,一个月就达到了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)风起云涌,多得让人眼花缭乱。前不久国外刚刚举办了NoSQL Conference,各路NoSQL数据库纷纷亮相,加上未亮相但是名声在外的,起码有超过10个开源的NoSQLDB,例如:

Redis,Tokyo Cabinet,Cassandra,Voldemort,MongoDB,Dynomite,HBase,CouchDB,Hypertable, Riak,Tin, Flare, Lightcloud, KiokuDB,Scalaris, Kai, ThruDB,  ......

这些NoSQL数据库,有的是用C/C++编写的,有的是用Java编写的,还有的是用Erlang编写的,每个都有自己的独到之处,看都看不过来了,我(robbin)也只能从中挑选一些比较有特色,看起来更有前景的产品学习和了解一下。这些NoSQL数据库大致可以分为以下的三类:

一、满足极高读写性能需求的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以及简单的条件,分页和排序操作,是一个很棒的 NoSQL数据库。
TC的主要缺点是在数据量达到上亿级别以后,并发写数据性能会大幅度下降,NoSQL: 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多的NoSQL数据库,例如 Cassandar,Voldemort,Tokyo Cabinet,Flare等等。Voldemort的资料不是很多,因此我没有特别仔细去钻研,Voldemort官方给出Voldemort的并发读写性能也很不错,每秒超过了1.5万次读写。
从Facebook开发Cassandra,Linkedin开发Voldemort,我们也可以大致看出国外大型SNS网站对于分布式数据库,特别是对数据库的scale能力方面的需求是多么殷切。前面我(robbin)提到,web应用的架构当中,web层和app层相对来说都很容易横向扩展,唯有数据库是单点的,极难scale,现在Facebook和Linkedin在非关系型数据库的分布式方面探索了一条很好的方向,这也是为什么现在 Cassandra这么热门的主要原因。

22 Nov

蓝色长空50年,大家相视泪流满面

image

图95 vs 闪电

image

图95 vs F106

image

图95熊 vs F4鬼怪

image

图95熊 vs F14雄猫

image

图95熊 vs F15鹰

image

图95熊 vs 台风

image

图95熊 vs F/A18大黄蜂

image

图95熊 vs F22猛禽

t95看着米空军一点点长大,内牛满面,北极熊情何以堪

17 Nov

俺的5800丢了

最近流年不利,这丢那丢,终于,我的Nokia 5800也丢掉了,是我这辈子丢过的最值钱的东西了。中午一起去吃了饭,到易初莲花买了冰激淋,回来后手机就没了。打过去拒接,再打就关机了。郁闷至死,现代人的素质真是太低了。

回来买个几百块的小手机算了,丢了也不心疼。

17 Nov

Google将限制Python语言的应用

Collin Winter是Python社区一位颇具影响力的开发者,他曾是CPython项目的核心开发者之一、也曾是Unladen Swallow(见文末注释)的核心开发者,参与了很多Python项目的开发。近来传闻Google将在其新项目中限制Python的使用,为此有开发 者(以K表示)在Google 论坛中公开询问了Collin Winter,Collin Winter就很多尖锐的问题做了解答。这篇帖子同时也吸引了很多高质量的跟帖。

K:我听说Google将在其新项目中限制Python的使用,无疑这将大大减少Python代码和Python得到的支持。这是否确有其事还是只是谣传?


Collin Winter:的确,Google将限制Python的应用因为:Python不如Java和C++快,线程占有、内存使用都很高在使用Python开发 新系统的时候,我们深知如果负载增加了10倍或者100倍系统会怎样,开发出的服务会有多糟糕我想Python已经发展到了一个狭缝中,因此在选择时我们 应当权衡其优点和缺点,也许开发人员使用Python会很有效率,但随着系统的增大却会遇到许多平台级的性能限制。

K:Unladen Swallow会改变这一切么?你的期望是什么呢?

Collin Winter:Unladen Swallow旨在尽可能地将Python用在更多它现在尚未涉足的地方,而且Unladen Swallow也并非包治百病的灵丹妙药。如果没有人给Python注入投资,Python将仍旧比C和Java慢、占用更多的内存和线程。我希望开发者 对Python的关注能够形成一个良性循环:越多的开发者感兴趣、越多的公司干兴趣,就有越多的投资注入,从而开发出更多的Python资源。

我认为Python及其他动态语言最好的一点就是:许多开发者工作于不同的子系统,但都为同一个代码基工作。而C或者C++语言则不同,参与的开发 者越多,代码基就越支离破碎。从这个角度来说动态语言更加易于sandbox操作。这种敏捷和灵活是Python语言的重要特性。

K:Python的确是比C和Java慢,但它比较起v8 JavaScript引擎如何,是否会是后者的竞争对手呢?

Collin Winter:我认为像CPython之类的应用不可能像V8或者SquirrelFish Extreme那样快,毕竟后两者是专为速度而生的。我们也曾遇到一些高速性能方面的优化却很难配置到CPython中,因而只能放弃。作为开源项目的志 愿者,CPython跟V8的侧重点不一样:CPython强调的是简单,也即简单、稍慢的内核便于人们在业余时间维护。

对于Python的另一个项目PyPy我倒是有很高的期望,希望它能摆脱C-level向后兼容的束缚而提供长久的性能解决方案。但这个愿望可能需要十年来实现。

K:CPython为什么考虑的是人们在业余时间的维护?

Collin Winter:CPython开发人员很少是有报酬的,几乎全部是志愿者,而Ruby开发者却能够从EngineYard等赞助商那里获得基金,因而当他 们意识到MRI伺服web应用很慢时,他们可以更好地开发他们的VM。这也决定了我们开发的东西更加照顾大多数人的需求。

一位名叫Leon Sit的开发者在这里补充道:我认为当系统增大时,CPython除了在数字码方面表现不错之外其他的都差强人意。而且,CPython依赖C编辑器而 Windows系统根本没有C编辑器。为了提高CPython的速度,就需要添加打印信息而它们涉及的语法却非Python的标准语法。

K:那么Jython呢?

Collin Winter: Unladen Swallow的另一个主要目标是维护与C扩展模块的兼容性,后者被Google广泛使用。使用Jython需要将基础架构从SWIG移植到JNI,这是 一项很痛苦的工作,而且几乎会无可避免地带来非常繁琐的bug。这是我们为什么没有选择Jython作为baseline的首要原因。

Jython是一部分全职的有薪开发者。但到目前为止,IronPython和Jython不得不将大部分的开发精力放在与CPython的兼容 上,只有很少的精力放在性能优化方面。也由此可见支持Python 3多么影响Jython,IronPython, PyPy等项目。

网友Tom Machinski认为:CPython并非与低阶虚拟机(LLVM)相兼容。Unladen Swallow项目组提高五倍性能的承诺并没有真正意义上的实现。如果CPU耗用至少90%的执行时间用以运行一小段循环,CPython无疑可以将这段 程序提高100倍甚至更多。但如果是大的应用呢?而且不要忘了,这种加速往往只是针对程序的某个点,也即热点优化(hot spot optimization)。

不要误会我的意思,我当然对Unladen Swallow项目很感兴趣而且希望它能够真正地实现目标。但我也绝对认同Collin的意思:即便Unladen Swallow项目所有的目标都能真正实现,Python也不是Java或者C++的对手。

有开发者问:像Google这样的公司为什么不用Python编写一个原型,然后逐渐将核心部分转化为Cyhton,这样以来既能利用Python的优势,也也可以获得C的效率和优化性能?

Craig Citro答道:我认为对Google而言这是发展Python的新计划:用Python写代码、做测试,然后将重要部分转化为CPython以提高速 度。然而这无疑是一项巨大的工作,而Collin Winter在上文中谈到的也不过是提高Python的运行速度、让Python在Google中继续保留下去。

而且目前CPython与Unladen Swallow的目标有很多矛盾之处,比如在低阶虚拟机(LLVM)方面,Unladen Swallow希望引入许多runtime优化和特性,而CPython却无法做到。

但是正如HotSpot JVM在一些标准方面可以打败g++一样,CPython击败单纯的Python代码静态编辑也不是什么难事。比如,如果你想写一个特殊的应用而你又很在 乎性能,CPython就是很棒的选择。你可以将对象转化为本地的C数据类型,如果你嫌麻烦而将Python代码转为CPython,JIT编辑器会很好 地优化这些纯Python代码。

注释: Unladen Swallow是Python的一个分支,由Google的一组开发人员组成。由于Google 在很多的应用项目中使用了Python,例如内部的服务器监控以及对外的Google Groups等。 所以Google很自然地希望提高Python的性能。该项目致力于改善Python的执行效率。Unladen Swallow的目标是将Python的性能提高五倍。为了实现该目标,将增加JIT的支持,并对虚拟机进行重新设计。在性能提升的同时,依旧会与 CPython保证源代码级别的兼容。

Unladen Swallow 的项目领导者及核心开发人员包括: Collin Winter、Jeffrey Yasskin、Thomas Wouters ,均为长期从事 CPython 的核心开发人员。他们贡献自己的20%的自由工作时间给Unladen Swallow。但是这个组织坚持认为这是一个Python项目,而非Google所有。

10 Nov

新浪推出云计算平台Sina App Engine

之前在架构师大会上透出风声,现在正式出来了。

Sina App Engine(SAE)算是国产版的google app engine,地址为http://sae.sina.com.cn/,现在支持php+mysql环境,其官方宣称:”SAE的目标是实现互联网应用在开发运维上的无缝整合,为App开发者提供稳定、快捷、透明、可控的服务化的平台,同时减少开发者的开发和维护成本。”

目前sae需要邀请码才可以注册。对于我们路人甲来说,sae相当于提供了一个免费的PHP+mysql虚拟主机空间,相比较google app engine而言,好处是不会被盾,坏处是可能会需要备案……

30 Oct

TripAdvisor收购酷讯

旅游评论网站TripAdvisor在本周五说,他们已经收购中国的机票和酒店搜索引擎酷讯,以此作为其进入快速增长的中国旅游市场的重要一步。

Expedia控制的TripAdvisor计划到2011年底之前在中国投资5000万美元,TripAdvisor的CEO Stephen Kaufer透露。其投资计划包括收购酷讯、在今年四月发布其中文旅游评论网站到到网以及聘用更多的员工。

他说:“中国的经济在持续增长,旅游业将会受益-更多的国内游客访问更多的国内景点。”

Kaufer拒绝透露TripAdvisor收购酷讯的价格,这是他们在中国市场的第一次收购,而中国已经拥有全球最多的互联网用户。

Kaufer说,TripAdvisor将会扩大目前两个网站的员工团队,从目前的80人增长到160人,并在未来的两年内,将酷讯和到到网的访问流量翻倍。

从中可以得到两个信息:

1. 酷讯现在很便宜,TripAdvisor没花多少钱,当初的疯投都亏了

2. TripAdvisor是个白痴

09 Oct

GAE生成验证码

我的blog开放了匿名评论以后,一直以来都挺平静的,没有垃圾评论,多半因为它本来看的人就不多……但是前端时间不晓得是哪里的谁忽然看上它了,spam扑面而来。国庆前两天就有苗头了,但我直接把垃圾评论删了了事,也没在意。回家待了几天回来,已经上白天spamming信息了。

所以我终于决定要解决一下GAE上的验证码问题了。本来生成验证码是件挺简单的事,JDK就有把文字打到图片中的方法;而且还富有大量第三方的Captcha库,能生成各式各样的验证码,诸如背景带斑点的,文字扭曲的,英文的,汉字的,机器看不懂人也看不懂的……一应俱全。但是悲剧的GAE啊!作为谷歌一直鼓吹的云,连一点点图片io操作都不支持,所有和图片相关的jdk接口全上了它的blacklist!

真是恨GAE不成钢啊。无奈之下决定山寨到底,自己从头动手:

  1. 开个矩阵存放图片每个像素的RGB值,自己手动在RGB矩阵里划出数字和字符来……由于字符实在太多就只画了10个阿拉伯数字,而且横平竖直的像老式电子表中的数字
  2. 写个纯java的图片编码工具,把RGB值矩阵编码成gif或者png格式的byte流,写到response里。

山寨是山寨了点,不过总算是整出来了,对付一般的小蟊贼够用了。

08 Oct

《古井、女人和狗》又开播了

犬夜叉完结篇开始播出了!当初刚开始看的时候,我还是一个眼睛里透着纯洁,充满憧憬和希望的大学新生;如今七八年过去了,犬夜叉依然握着他的铁碎牙,开始了不断的升级之路,开始了和奈落之间欲说害羞,缠绵悱恻,欲罢不能的纠结故事……

桔梗被他们给画崩了。

共277篇,第11/28页 首页 上一页 ... 6 7 8 9 10 11 12 13 14 15 16 ... 下一页 尾页