2009年4月30日星期四

[转]Facebook 如何管理150亿张照片(值得学习)

Facebook 的照片分享很受欢迎,迄今,Facebook 用户已经上传了150亿张照片,加上缩略图,总容量超过1.5PB,而每周新增的照片为2亿2000万张,约25TB,高峰期,Facebook 每秒处理55万张照片,这些数字让如何管理这些数据成为一个巨大的挑战。本文由 Facebook 工程师撰写,讲述了他们是如何管理这些照片的。

旧的 NFS 照片架构
老的照片系统架构分以下几个层:
# 上传层接收用户上传的照片并保存在 NFS 存储层。
# 照片服务层接收 HTTP 请求并从 NFS 存储层输出照片。
# NFS存储层建立在商业存储系统之上。

因为每张照片都以文件形式单独存储,这样庞大的照片量导致非常庞大的元数据规模,超过了 NFS 存储层的缓存上限,导致每次招聘请求会上传都包含多次I/O操作。庞大的元数据成为整个照片架构的瓶颈。这就是为什么 Facebook 主要依赖 CDN 的原因。为了解决这些问题,他们做了两项优化:
# Cachr: 一个缓存服务器,缓存 Facebook 的小尺寸用户资料照片。
# NFS文件句柄缓存:部署在照片输出层,以降低 NFS 存储层的元数据开销。

新的 Haystack 照片架构
新的照片架构将输出层和存储层合并为一个物理层,建立在一个基于 HTTP 的照片服务器上,照片存储在一个叫做 haystack 的对象库,以消除照片读取操作中不必要的元数据开销。新架构中,I/O 操作只针对真正的照片数据(而不是文件系统元数据)。haystack 可以细分为以下几个功能层:
# HTTP 服务器
# 照片存储
# Haystack 对象存储
# 文件系统
# 存储空间

存储
Haystack 部署在商业存储刀片服务器上,典型配置为一个2U的服务器,包含:
# 两个4核CPU
# 16GB – 32GB 内存
# 硬件 RAID,含256-512M NVRAM 高速缓存
# 超过12个1TB SATA 硬盘

每个刀片服务器提供大约10TB的存储能力,使用了硬件 RAID-6, RAID 6在保持低成本的基础上实现了很好的性能和冗余。不佳的写性能可以通过高速缓存解决,硬盘缓存被禁用以防止断电损失。
文件系统
Haystack 对象库是建立在10TB容量的单一文件系统之上。文件系统中的每个文件都在一张区块表中对应具体的物理位置,目前使用的文件系统为 XFS。
Haystack 对象库
Haystack 是一个简单的日志结构,存储着其内部数据对象的指针。一个 Haystack 包括两个文件,包括指针和索引文件:



Haystack 对象存储结构



指针和索引文件结构




Haystack 写操作
Haystack 写操作同步将指针追加到 haystack 存储文件,当指针积累到一定程度,就会生成索引写到索引文件。为了降低硬件故障带来的损失,索引文件还会定期写道存储空间中。

Haystack 读操作
传到 haystack 读操作的参数包括指针的偏移量,key,代用Key,Cookie 以及数据尺寸。Haystack 于是根据数据尺寸从文件中读取整个指针。

Haystack 删除操作
删除比较简单,只是在 Haystack 存储的指针上设置一个已删除标志。已经删除的指针和索引的空间并不回收。

照片存储服务器
照片存储服务器负责接受 HTTP 请求,并转换成相应的 Haystack 操作。为了降低I/O操作,该服务器维护着全部 Haystack 中文件索引的缓存。服务器启动时,系统就会将这些索引读到缓存中。由于每个节点都有数百万张照片,必须保证索引的容量不会超过服务器的物理内存。

对于用户上传的图片,系统分配一个64位的独立ID,照片接着被缩放成4种不同尺寸,每种尺寸的图拥有相同的随机 Cookie 和 ID,图片尺寸描述(大,中,小,缩略图)被存在代用key 中。接着上传服务器通知照片存储服务器将这些资料联通图片存储到 haystack 中。

每张图片的索引缓存包含以下数据

Haystack 使用 Google 的开源 sparse hash data 结构以保证内存中的索引缓存尽可能小。
照片存储的写/修改操作
写操作将照片数据写到 Haystack 存储并更新内存中的索引。如果索引中已经包含相同的 Key,说明是修改操作。

照片存储的读操作
传递到 Haystack 的参数包括 Haystack ID,照片的 Key, 尺寸以及 Cookie,服务器从缓存中查找并到 Haystack 中读取真正的数据。

照片存储的删除操作
通知 Haystack 执行删除操作之后,内存中的索引缓存会被更新,将便宜量设置为0,表示照片已被删除。

重新捆扎
重新捆扎会复制并建立新的 Haystack,期间,略过那些已经删除的照片的数据,并重新建立内存中的索引缓存。

HTTP 服务器
Http 框架使用的是简单的 evhttp 服务器。使用多线程,每个线程都可以单独处理一个 HTTP 请求。

结束语
Haystack 是一个基于 HTTP 的对象存储,包含指向实体数据的指针,该架构消除了文件系统元数据的开销,并实现将全部索引直接存储到缓存,以最小的 I/O 操作实现对照片的存储和读取。

本文国际来源:http://www.facebook.com/FacebookEngineering#/note.php?note_id=76191543919&ref=mf
中文翻译来源:COMSHARP CMS 官方网站

编译安装Vala Toys for GEdit

今天终于编译安装成功了Vala Toys for GEdit 。它是一个不错的vala语言的gedit插件。
按照:http://code.google.com/p/vtg/wiki/Compile的步骤编译安装。
不过需要注意的是它的依赖(我选的svn里的版本,vala语言的版本也是0.7.1):
需要安装的东西一般是:

sudo apt-get install libreadline5-dev gedit-dev

就可以了。如果不装全会出现错误:

gtksourcecompletion需要编译安装,这个容易./configure, make, make install就可以了。

就下来正式安装就是:

./autogen.sh --prefix=/home/zmm/.gnome2/gedit/plugins --datadir=/home/
zmm/.gnome2/gedit/plugins

make

make install

即可,最后完成了安装。不过如何启用这个插件呢?

很简单,将~/.gnome2/gedit/plugins/lib/gedit-2/plugins下的东西移到~/.gnome2/gedit/plugins/即可。在重新打开Gedit在首选项/插件中启用vala toy即可。

附录:目前插件还在开发之中,发现new project选项不是很好用。期待以后改正,目前可以用
/home/zmm/.gnome2/gedit/plugins/bin目录下的vala-gen-project生成工程打开。vsc-shell的功能还在琢磨中...

[转]西方教育让我儿子失去了“理想”

看了我写儿子在西方上学的文章,很多朋友写信给我,希望我就教育问题写一些文章,发表一些看法,提出一些建议,推动一些改革。我又何尝不想呢?我一直以来都认为教育是头等的大事。如果想一个国家发生变化,最平和又快捷的办法就是对成人加强启蒙教育或者宣传洗脑,可如果想让一个国家彻底发生变化,则非得从孩子的教育开始不可。

对成年人的思想控制,可以用一句话来概括:控制了现在,就可以改变过去;改变了过去,也就掌握了未来。说的是篡改历史和控制舆论的重要性。可如果在和平年代,则我认为下面的话更加具有普适意义:谁控制了孩子的教育,谁就掌握了未来。

当然,我这里说的教育,强调的是教育的内容,是我们用什么来教育我们的孩子,而不是多少人读书,多少人失学的问题。

我对一个国家教育的重要性的认识有一个过程,和我出国之后的经历有一定的关系。那时我很想知道中西文化的区别到底在哪里,以及为什么只要在大陆读过小学和中学的年轻人出国后就永远无法真正融入西方社会,而在西方受到小学和中学教育的移民第二代却再也无法融入中国大陆的社会——你能告诉我有一个海外出生的华人华侨能够从精神上回流到中国大陆的例子吗?

十几年前出国后,我除了老老实实潜伏下来,研究美国等西方国家的政治和军事外,有段时间我一度把注意力转向教育,因为我隐约地意识到,无论政治还是军事,甚至是经济,都不能最终决定我们国家和民族的未来,我们国家的未来最终将由我们施于孩子身上的教育来决定。

于是,我先后在美国和澳洲大学(美国的是华盛顿的一所大学,澳洲的是悉尼大学教育学院)里申请了教育学硕士等课程,但都因为看不到显著效果而半途而废。可我却得出了一个结论,教育形式和方式不重要,重要的是教育的内容。因此,我一度悲观地认为,与其任凭学校把那些垃圾和有害的东西灌输给我们的孩子,不如让他们当文盲。当文盲的话,他们总还有靠自己的天性和经历觉醒的一天,可一旦被灌输了那些所谓的“知识”和害人的价值观,他们就沦落为世界上最不可救药的“知识人”了。

没有拿到教育学的硕 士、博士学位,可我自认对教育还是有一定发言权的,我从中国农村小学读起,又到多个国家读书,在四十多的高龄才拿到博士学位,没有经验也有教训吧。可我不 得不承认,由于最终认定是教育的内容决定一个国家和民族命运,而我始终无法掌握外国小学和中学的教育内容——因为我不可能再靠我一直自鸣得意的“实践”的 方式到西方国家的小学、中学去“潜伏”,去取经。

可是,那句话怎么说 的,有心栽花花不发,无意插柳柳成荫,没有想到,我对中西教育最大的灵感和收获却来自我的两个儿子。大儿子在国内读幼儿园,到美国和澳洲读小学,小儿子出 生在国外。我对他们的教育一直很重视,那是父亲对儿子的本能关心。可后来,就在我对教育很迷茫的时候,我逐渐发现,两个分别在美国和澳洲从幼儿园一路读到 高中和小学的儿子,却给我另外一种启示。虽然我竭力在用自己认为是对的方式方法教育他们,然而,短短两年后,我就发现在教育上(包括世界观上)他们和我渐 行渐远。那时我最想知道的是,澳洲人使用什么样的教材,在短短几年里,把我的儿子从我身边“夺走”?我并不是没有说服力的人,可面对他们学校整天放羊似的 教育,我竟然显得无能为力!

(插一句,说到美国 和澳洲“放羊似的教育”,我要控诉:几乎就在儿子要考大学的前一年,他们竟然还是我行我素,根本没有延长教学时间,早上九点才上课,下午三点就放学了,中 间竟然还有那么多体育和课外活动。读小学的儿子就更不用说了,读到四年级,竟然没有给我带回一本让老子看看他在学什么的“课本”,到他教室去,竟然发现, 他大部分时间是爬在地上一边玩耍一边听老师讲课的,我郁闷啊!想当初老子在神州大地的时候,从小学到高中,早起晚归,忙得连偷看邻家女孩的时间都没有……)

从自己和儿子身上,我深深的感觉到,教育的重要性在于教育的内容,而我们长成什么样的人,是在小学和中学就被决定了的。从那以后,我发现自己在研究教育上的“潜伏”毫无疑义,反而是无意中以儿子做实验,让我感受良多,也最终让我明白,人是怎样被教育出来的?我为什么是我?我的儿子又和我有什么不同……以及,你为什么是你那些年轻人又是怎么变成今天这个样子的……

大家注意到,我并没有说哪种教育好哪种教育坏的意思,这不是此篇短文里要探讨的。实际上,中国现代的教育体系几乎都是从西方引进的,特别是理工科的设置和内容几乎全盘西化,就连社会科学,各科目的设置也是从欧美以及前苏联引进的。唯一有中国特色的是我们的政治、思想教育和语文课文内容的设置,让我们有了中国特色。

和很多朋友期待的我来攻击一番中国教育相反,今天我要“攻击”的正好是儿子所受的西方的教育。我的大儿子十六岁了,快要高考了。我对大儿子影响比较大,从幼儿园就灌输他要“有所作为”,他的成绩也一直很好。可是正如我所说的,他已经从我对他的中国式的灌输渐渐走开。

我曾经按照我的父亲对待我的方式多次和儿子讨论理想,也就是今后想干啥事、想从事什么职业,一开始,他还能听我忽悠,要做一个有意义的人,要当科学家,要当公务员,要当作家,要当……。可最近一次他的回答让我非常吃惊,他对我说,可以开一个卖东西的小店铺啊……

乖乖隆的冬!你不在 中国,我就不怪你不想当雷锋、王杰、黄继光,但你至少也应该有当一名厅长、局长或者师长、团长的志向吧,再不济,你也应该搞个科学家、不拿工资的市长、总 经理、作家什么的玩玩吧?没想到他的理想就是去开一个小商店,看到我横眉冷对怒发冲冠血脉膨胀浑身上下气不打一处来的样子,儿子心态平和地说,能养活自 己,干点自己想干的事,就很快乐了。

鉴于万恶的西方教育 把我的大儿子搞得一点“理想”都没有了,我就立即把关注焦点转移到刚上四年级的小儿子身上。我要多和他交流,多引导引导他。特别是利用他回国的机会,我得 让他从小心中有一些榜样。要知道,在中国的教育下,像小儿子这么大的孩子,早就知道这个世界上不但有那么好的主席(主席的睡衣)、那么好的将军(朱德的扁 担)、还有让孩子都能流出眼泪的“人民的好总理”恩来同志,而且,九岁的中国孩子谁不知道雷锋叔叔的故事?

可是,我郁闷地发现,我的那一套在小儿子身上完全不起作用,才多少年没有把他抱在怀里啊?竟然这么快就被澳洲的学校“洗脑”了?!

很显然,我已经无法 在儿子心中树立一些我认为是楷模的榜样,无论是什么“家”还是那些有权有钱的人,小儿子几乎没有任何概念,说到“当官的”,在他眼中,竟然和工人、农民没 有任何区别,甚至“当官的”还没有一个拥有几匹马的农民酷。在儿子眼里,当官是不实际的,又不开工厂,又不卖东西,靠什么赚钱呢?靠税收养活的人,总要看 纳税人的脸色,腰杆总是站不直的啊。(所以大家也应该注意到,西方最优秀的人才,总是集中在创造财富、钻研科技、从事教育等领域,至于公仆的行列里,大多 是碌碌无为的家伙)

在儿子们的学校,好 像没有任何政治思想教育课,也没理想培养之类的课程,我曾经和八十岁的老父亲讨论这个问题,他和我一样感觉问题很严重,我们当时一起哀叹,这种(西方)国 家,到时培养出来的人怎么会有干劲和理想?我们一致同意,关于理想、道德和中国式的思想教育这一课,就由我这个老爸来完成。

不幸的是,我失败了,更不幸的是,儿子并没有失败——不幸在哪里?不幸在我从中国带出来的那一套是失败的!更不幸在哪里?在于我那失败的一套正在教育全中国的孩子!

人家的孩子培养出来却能够让这个社会挺和谐的,甚至那些整天放羊似的教育却仍然培养出在科学技术和各方面都引导世界潮流的人才,而我们,一个最注重理想和思想品德教育的国家,却培养出——我不说别人,说我自己好不好?——培养出我这种到了四十岁还在迷茫和彷徨的人……

我再强调一句,区别不在教育的方式方法,甚至不在于有多少人不识字,是文盲,更不在于我们的孩子是否从小学就开始加班加点学“知识” ……问题的关键,也即是我们国家和民族的前途在于:我们用什么样的价值观和“知识”来教育我们的孩子!

杨恒均2009/4/30

vs2005打开项目后自动关闭问题

阔别多日打开了vs2005看看自己所写的一些代码,但是发现打开项目之后vs2005自动关闭了。google之后发现时vmware的问题。
找到了以下的回复:
我遇到过类似的问题,发现是VMware(我用的是6.0)搞的鬼(因为我把它的几个自动启动的服务 VMware Authorization/VMware DHCP Service/VMware NAT Service给设成手动并停止了)
visual Studio 可以正常使用.
前几天为了试装一下leopard装了一个vmware。现在没什么需要了,干脆卸了。

重启之后万事大吉了!

2009年4月29日星期三

编译vala过程

今天编译vala了,一直想这么干,今天终于实现了。当然首先下载vala的源码。然后安装flex和bison两个东西。使用典型的apt安装

sudo apt-get install flex bison

然后解压源码之后输入
./configure

make

sudo make install
本人使用./configure时加了参数--perfix=/usr/local所以导致了一个安装完后运行时的一个错误:
valac: error while loading shared libraries: libvala.so.0: cannot open shared object file: No such file or directory
应该是共享库的路径没有/usr/local/lib。
解决方法很简单就是修改/etc/ld.so.conf加入/usr/local/lib一行,然后运行sudo ldconfig
之后就可以了。

[Shell]set、env、export的区别

set 显示当前shell的变量,包括当前用户的变量
env 显示当前用户的变量
export 显示当前导出成用户变量的shell变量

每个shell有自己特有的变量(set)显示的变量,这个和用户变量是不同的,当前用户变量和你用什么shell无关,不管你用什么shell都在,比 如HOME,SHELL等这些变量,但shell自己的变量不同shell是不同的,比如BASH_ARGC, BASH等,这些变量只有set才会显示,是bash特有的,export不加参数的时候,显示哪些变量被导出成了用户变量,因为一个shell自己的变 量可以通过export “导出”变成一个用户变量。

2009年4月28日星期二

自己动手丰衣足食,hack了一个gnome主题

今天实在是对gnome look上的主题忍无可忍了,都不是很喜欢。趁着9.04刚装完,心情正好,故改了一个以前的一直较为喜欢的主题:Glow Leopard。

以下是截图:


下载就不方上来了,网盘什么的比较麻烦。有喜欢的,email我就可以了(zmmbreeze0825@gmail.com)。