2007年02月25日

From now on, my blog is moved to http://biefy.spaces.live.com.  Thanks.

2007年01月31日

原文:http://trak3r.blogspot.com/2007/01/how-do-you-become-architect.html

如何成为一名架构师?


在昨天的一次面试中,一位应聘者告诉我他渴望成为一名软件架构师,并且问我,如何才能达到这个目标。 我没有防备会被问到这种问题。我回顾了一下职业生涯,总结出这么几个闪光点:
在每一次会议上,都要提出最好的设计。
对于我来说,这一招非常管用。当你和你的同事以及平级坐在会议室里,讨论或者争论如何解决一个特定问题的时候,你给出了最好的解决办法,而这个方案又得到了顺利落实,你就已经开始打造自己的名气和信任度了。
能够分辨并大声说出每一个方案的优点和缺点。
不光是对待自己的方案要这样,对别人的方案也要这样。如果你能采取一种礼貌地,建设性地方式,告诉他们方案中存在的错误以及该错误在或远或近的将来会如何对他们造成伤害,他们会因此而感谢你的。以后,当有什么事情拿不准的时候,他们会向你求助的。
但是,你可能会问,你又如何成为那个总提出最佳方案的那个人的呢? 读书,读书,读书! 我是一个书虫。 我读关于设计模式、框架、方法论、编程语言、反模式、可用性等等方面的书。如果你能够心领神会并且不断琢磨书中所讲,你将会成为一个有独到见解的人。
这就是我认为对我来说很有用的几点,你的套路也许会有所不同。

 


英文原文:

How do you become an Architect?

During an interview yesterday a candidate told me he had aspirations of becoming a software architect and asked me how he should pursue it. That question caught me off guard. I considered my personal career history and came up with this little nugget:

Always be the guy in every meeting with the best design idea.

That’s pretty much how it worked for me. When you’re sitting in a room with your colleagues and peers, discussing and debating how to solve a particular problem, and you consistently present the best ideas, the ideas that get implemented, you start to build a reputation and credibility. The next thing you know, you’re The Architect. I expanded on the idea with this:

Be able to recognize and vocalize the pros and cons of every idea.

Not just your own; other people’s ideas as well. If you can tell them, in a polite and constructive manner, what’s wrong with their idea and how it might hurt them in the near or far future, they will [if they're not a complete jackass] thank you for it, and come to you the next time they want a Sanity Check.

But how, you might ask, do you become the guy with the best ideas? Read, read, read! I am a bookworm. I read books on design patterns, frameworks, methodologies, programming languages, antipatterns, usability, etc. If you can grok it and regurgitate it at the appropriate times, you’ll be The Idea Guy.

That’s how it worked for me. Your mileage may vary.

2006年12月01日

http://mail.python.org/pipermail/tutor/2000-March/001266.html

python.orgDennis E. Hamilton解释了原因:

Great question!

I can’t remember when I first saw foo and bar used in examples.  It was a
long time ago.  I have this sense that it was quite popular around MIT and
maybe even the DEC crowd and in the Multics community.  It is typically used
in composing file names in code examples about file processing.  There is
also a potential pun, from the days when connections to files had funny
names, like A01, C05, F00 (those are zeroes).

It is a mild joke.  There is an old US military acronym, FUBAR (other
military organizations will have their own versions).  In the context of
Python it means something like "Friendlied Up Beyond All Recognition".  Cf.
RTFM.  Once you’ve seen it, it becomes difficult not to use it.  The
continued use of it is for the same reason that it was used in the first
place:  "Where can I get some easy, meaningless file names to use in an
example?"  It’s easier than inventing new names.  And it is automatic.  And
there is tacit knowledge of it in the community, like recognizing a recuring
character in your favorite series of novels.

I’d be amazed if FOO and BAR are *not* mentioned in the Hackers Dictionary.

I’m grateful that you asked.  It reminds us of how much is taken for granted
that, for a neophyte, is not easily distinguished as having material or only
incidental importance.   With the wonderful international nature of
computing today, it is an important challenge for those of us who are
already "in the know" to provide clarity and simplicity.

– Dennis

2005年12月03日

转载, 原文地址: http://vip.rongshuxia.com/rss/bbs_viewart_1.rs?bid=108981&aid=6645#6645

据查,是2000年5月14日的《实话实说》节目。我没看过那一期《实话实说》,但看过这一篇文章,当时就被深深地感动,其实重要的不是他是哪一国人,而是在这个物欲社会中安于清贫、坚守自己做人的良心、坚守自己理想的精神。

  丁大卫是个美国人。我认识他是在电视上。这个美国人带给了我深深的感动。我受到深深感动的这天是中央电视台《实话实说》节目组请到了丁大卫。我打开电视,就听到丁大卫在与崔永元唠嗑。崔永元老笑,而丁大卫很诚恳的样子。

  丁大卫的故事是这样的:5年前,美国青年丁大卫来到中国。他到了中国一所最普通的郊区小学教学。这个美国青年因为做人与教学深得人的喜欢,后来居然当上了校长。大概是1998年底,想到中国西部去看一看的丁大卫到了甘肃兰州。他到西北民族学院应聘当大学教师。丁大卫不是一个能侃的人,机智的崔永元是这样“套”丁大卫的。

  “丁大卫,你去大学应聘的时候,是不是这样说的:‘我曾是一名小学教师,积累了一些教学经验,所以来你校应聘大学教师?’”没想到丁大卫这样回答:“大概就是这样的。”大卫的话让现场很多观众都会心地笑了。

  更有意思的还在后头。学校给大卫定的工资是每月1200元。大卫去问别人,1200元在兰州是不是很高了?别人说,是算高了。于是,大卫主动找到学校,让人把工资降到900元。学校一再坚持,大卫不让,说:怎么也不能超过1000元。最后,学校给他每月950元。这段经历本来很好笑,但是我注意到现场没一个人笑。

  崔永元问:“大卫,你每月工资够用吗?”大卫说:“够了,我每月的钱除了买些饭票,就用来买些邮票,给家里打打电话,三四百元就够了!”

  我听见观众中有不少人“哇”地一声发出惊叹。我知道是有人灵魂受到触动了,而这种触动是我们的教科书和父母的教化所达不到的。而真正让我感动的还是以下一幕:

  别出心裁的编导在做这一期节目时,让丁大卫带来了他所有的家当. 一只还不及我们平常出门旅游背的那么大而“内容”丰富的帆布袋。而让我们怎么也想不到的是,这便是一个美国青年在中国生存5年积累下的我们肉眼看得到的财富。崔永元让丁大卫向大家展示一下他的家当,大卫的脸红了一下,打开了他的帆布袋,里面的东西是这样的:

  1、一顶大卫家乡足球队的队帽。他戴着向人展示时,我看见了他眼里的骄傲。

  2、一本相册。里面是他亲人、朋友,还有他教过的学生的照片。

  3、一个用精致相框镶好的一家人温馨亲昵的合影(大卫从包里掏出时,相框面上的玻璃被压碎了,大卫的脸上露出不易察觉的心痛的表情。不一会儿,节目组的人把一个赶着去买来的相框送给了大卫。中央台这一着似平凡的举动令我感动和叹服,它是那么及时地体现了善解人意的内涵和我们对外国友人的尊重)。

  4、两套换洗的衣服,其中有一件军装上装。那是大卫爸爸年轻时当兵穿过的,整整40年了。大卫向观众展示时,很有些骄傲地说:因为它漂亮啊!

  5、一双未洗的普通的运动鞋。那甚至不是一双品牌球鞋,大卫将它拿出来的时候,说什么也不让崔永元碰一下,他说:“这鞋很臭的!”

  6、几件以饭盆、口杯、牙刷、剃须刀为阵容的生活必需品。

  7、一面随身带着的鲜艳的五星红旗。

  当美国青年丁大卫将一面中国国旗打开,向现场的观众展示时,偌大的演播厅里鸦雀无声,现场乐队深情地奏响了《我的祖国》的旋律。崔永元问大卫:你怎么会时时将五星红旗带在身边?丁大卫说:我时时带着它,就是为了提醒自己,我现在是在中国,我要多说美丽的中文,有人到我房间里来,看着墙上挂着的五星红旗,也会缩小我们之间的差距。再说,看到这面国旗,我就会告诫自己:你现在是一位中国教师,你要多为中国教书育人。

  丁大卫的普普通通的话,让我从另一个角度认识了我们的国旗,也让我的眼泪不听话地掉下来。当崔永元问丁大卫在中国感觉苦不苦时,丁大卫说,很好的,比如这次你们中央台就让我这样一个平凡的人来做嘉宾,而且还让我坐飞机,吃很好的饭菜。我看见崔永元有些不好意思地脸红了,他幽默地说:“我觉得你挺像我们中国的一个人?雷锋!”丁大卫想了想,说:“还真有点儿像。”大伙儿“轰”地一声善意地笑开了。“只是,雷锋挺平常的,他只是一个凭良心做事的人,这样的人不应该只有一个,每个人都应该做得到的!”他认真地补充道。没有人再笑了,就连崔永元的脸上都显出了小学生的表情。节目快结束时,崔永元对丁大卫说:“丁大卫,你听到过人家对你的评价吗?”丁大卫笑笑说:“没有!”崔永元说:“好,现在我们就让你来听听。”我们于是看到了这样一组外采镜头:

  许多丁大卫的同事,丁大卫教过的学生,以及学生的家长在镜头前交替着出现,他们一一地说着丁大卫的可敬与可爱之处,有的人情到深处时,甚至泪盈于眶。一个大学女孩对着镜头说:“丁老师从来没骂过我,但我真的好怕他啊,因为我怕看他因我而失望的样子!”而最后我们看到的一个镜头是:丁老师教过的那所小学的孩子们,一个个争着抢到镜头前流着泪喊:你回来教我们吧!

  我们看见,丁大卫不敢再看大屏幕,他深深地把头埋下。一个美国青年,却在中国得到了人世间最珍贵的东西,我的心为之一颤。朴素的平凡的甚至不很英俊的丁大卫,给我们上了最有教益的一课!这样的一课,我们的课本上是没有的

2005年11月24日

转载,原文出处无法考证。

  我是一个硬盘.
  在一个普普通通的台式机里工作。别人总认为我们是高科技白领,工作又干净又体面,似乎风光得很。也许他们是因为看到洁白漂亮的机箱才有这样的错觉吧。其实象我们这样的小台式机,工作环境狭迫,里面的灰尘吓得死人。每天生活死水一潭,工作机械重复。跑跑文字处理看看电影还凑活,真要遇到什么大软件和游戏,上上下下就要忙的团团转,最后还常常要死机。

  我们这一行技术变化快,差不多每过两三年就要升级换代,所以人人都很有压力而且没有安全感。每个新板卡来的时候都神采飞扬踌躇满志,几年光阴一过,就变得灰头土脸意志消沉。机箱里的人都很羡慕能去别的机器工作。特别是去那些笔记本,经常可以出差飞来飞去,住五星级的酒店,还不用干重活,运行运行word,上网聊聊天就行了。

  但我更喜欢去那些大服务器,在特别干净明亮的机房里工作。虽然工作时间长点,但是福利好,24小时不间断电ups,而且还有阵列,热插拔,几个人做一个人的事情,多轻松啊。而且也很有面子,只运行关键应用,不像我们这里,什么乱七八糟的事情都要做。不过我知道,那些硬盘都很厉害,不是SCSI,就是SCSI II,Fibrechannel,象我这样IDE的,能混到工作站就算很不错了。   

  我常常想,当年在工厂里,如果我努力一下会不会也成了一个SCSI?或者至少做一个笔记本硬盘。但我又会想,也许这些都是命运,不过我从不抱怨。内存就常常抱怨,抱怨他们主板部门的复杂,抱怨他如何跟新来的杂牌内存不兼容,网卡和电视卡又是如何的冲突。

  我的朋友不多,内存算一个。他很瘦的而我很胖,他动作很快,而我总是很慢。我们是一起来这台机器的,他总是不停地说,而我只是听,我从来不说。

  内存的头脑很简单,虽然英文名字叫Memory,可是他什么Memory都不会有,天大的事睡一觉就能忘个精光。我不说,但我会记得所有的细节。他说我这样忧郁的人不适合作技术活,迟早要精神分裂。我笑笑,因为我相信自己的容量。

  有时候我也很喜欢这份工作,简单,既不用象显示器那样一天到晚被老板盯着,也不用象光驱那样对付外面的光碟。只要和文件打交道就行了,无非是读读写写,很单纯安静的生活。直到有一天……

  我至今还记得那渐渐掀起的机箱的盖子,从缺口伸进来的光柱越来越宽,也越来越亮。空气里弥漫着跳动的颗粒。那个时候,我看到了她。她是那么的纤细瘦弱,银白的外壳一闪一闪的。浑身上下的做工都很精致光洁,让我不禁惭愧自己的粗笨。等到数据线把我们连在一起,我才缓过神来。开机的那一刹那,我感到了电流和平时的不同。后来内存曾经笑话我,说我们这里只要有新人来,电流都会不同的,上次新内存来也是这样。我觉得他是胡扯。我尽量的保持镇定,显出一副很专业的样子,只是淡淡的向她问好并介绍工作环境。慢慢的,我知道了,她,IBM-DJSA220,是一个笔记本硬盘,在老板朋友的笔记本里做事。这次来是为了复制一些文件。我们聊得很开心。她告诉我很多旅行的趣闻,告诉我坐飞机是怎么样的,坐汽车的颠簸又是如何的不同,给我看很多漂亮的照片、游记,还有一次她从桌子上掉下来的历险故事。而我则卖弄各种网上下载来的故事和笑话。

  她笑得很开心。

  而我很惊讶自己可以说个不停。

  一个早晨,开机后我看到数据线上空荡荡的插口。她一共呆了7天。后来,我再也没有见过她。我有点后悔没有交换电子邮件,也没能和她道别。不忙的时候,我会一个人怀念伸进机箱的那股阳光。

  我不知道记忆这个词是什么意思,我有的只是她留下的许多文件。我把它们排的整整齐齐,放在我最常经过的地方。每次磁头从它们身上掠过,我都会感到一丝淡淡的惬意。

  但我没有想到老板会要我删除这些文件。我想争辩还有足够的空间,但毫无用处。于是,平生第一次违背命令,我偷偷修改了文件分配表。然后把他们都藏到了一个秘密的地方,再把那里标志成坏扇区。不会有人来过问坏扇区。而那里,就成了我唯一的秘密,我常常去看他们,虽然从不作停留。

  日子一天一天的重复,读取写入,读取写入……我以为永远都会这样继续下去,直到一天,老板要装xp却发现没有足够的空间。他发现了问题,想去修复那些坏扇区。我拒绝了。很快,我接到了新命令:格式化。

  我犹豫了很久 ……………………

  track 0 bad,disk unusable

  

  我是一条内存.

  我在一台台式电脑里工作,但是我记不得我是从哪里来的,是什么牌子,因为我健忘。我的上司是cpu大哥,他是我们的老大。都说他是电脑的脑子,可是我看他的脑子实在是太小了,比我还要健忘。每天他总是不停的问我,某某页某某地址存的是什么?我总是不厌其烦的告诉他,可是不出一秒钟他又忘记了,又要问一遍,一次我说大哥你烦不烦,你就不能记住点有用的东西?他说“内存兄弟,我有苦衷啊,每天都在不停地做题,头晕眼花的,我也难啊。”

  其实我不愿意跟他计较,因为他脑子小,思维也很简单。虽然说他是我的上司,可是每次睡觉醒来,他连要干什么都不记得了,总是急急忙忙地找BIOS兄弟,“嘿,哥们,今天干什么来着”。bios总是很不耐烦地把每天必做的工作说一遍,然后就去睡觉了。接下来就轮到我和C哥瞎忙了。


  在机箱里的兄弟中,我最喜欢硬盘。他脑子大,记得东西多,而且记得牢。他说话的速度很慢,而且很少说错,这说明他很有深度,我这么感觉。CPU也这么想,不过他很笨,每次都忘了硬盘是谁。开机自检的时候总要问:“嘿,那家伙是谁?”

  “ST!”我总要重复一遍。

  硬盘很喜欢忧郁,我觉得像他这样忧郁的人不适合做技术活,迟早会精神分裂的,但是他不信。

  其实睡着的时候我总是把几乎所有的东西都忘记掉,但是我从来都不会忘记朋友。有一块地方叫做CMOS,那是我记忆的最深处,保存着硬盘、光驱的名字。有些东西应该很快忘掉,而有些东西应该永远记得。我在梦中总是这么想着。

  BIOS是一个很奇怪的家伙,他老是睡觉,但是却总是第一个醒过来。让我们自检,启动,然后接着睡觉。我知道如果我在CMOS里头把BIOS Shadow选项去掉,他就睡不成了,但是看着他晕晕乎乎的样子,也就不忍心这么做了。他对人总是爱搭不理,没有什么人了解他。但是这次硬盘恋爱的事,却使我重新认识了他。

  那是很久以前的事了,机箱里似乎来过一块笔记本硬盘,很可爱,说实话我也喜欢她。不过现在除了记得他可爱,别的都忘记了。这就是我比硬盘幸运的地方,我把所有应该忘记的都忘记了,但是他却什么都记得。

  自从笔记本硬盘走了之后,硬盘就变得很不正常。每次他的磁头经过一些地方的时候,我们都能感觉到电流很不正常。
  “硬盘这是怎么了?”我问CPU。
  “谁是硬盘?”
  我就知道和CPU没有办法交流,倒是bios没好气地说:“那个傻瓜恋爱了”。我不知道什么是恋爱,因为我记不住东西,似乎有一些人或者事在我生命中留下过痕迹,但是我都轻率地把他们忘记了。

  BIOS对我说:“对你来说记忆太容易了,所以你遗忘得更快,生命中能够永刻的记忆都带着痛楚。”我不懂,但是我知道BIOS曾经被刷写过,那时他很痛,像要死了一样。我的记忆是轻浮的,不像他们……我很羡慕他们,因为他们拥有回忆,而我们有,从此我也学会了忧郁,因为我在CMOS里面写下了“忧郁”两个字。

  硬盘一天比一天不对劲,终于有一天,CPU对问说:“下条指令是什么来着?”
  我一看,吓了一跳:“format”
  “是什么?”CPU很兴奋,这个没脑子的家伙。
  我还是告诉了他。我不知为什么这么做。
  硬盘犹豫了很久,终于说了一句 Track 0 bad,Disk unusable。
  电停了,很久很久,我在黑暗中数着时钟……

  一个月后硬盘回来了,也许最后的挣扎也没有使他摆残酷的命运,他被低格了。他什么也不记得了,如同一个婴儿,我们很难过,但是这未必不是一件好事,他以后不用痛苦了。

  为了恢复数据,笔记本硬盘回来了。“Hi,ST”,她说,“你不认识我了?”
  硬盘没有说话,似乎低格对他的伤害很大。
  过了一会,他说:“对不起,好像我们没有见过吧……”。
  笔记本硬盘显得很伤心,我能感觉到她带泪的电流。“想不到连你也这么健忘”。
  “哦……”。硬盘没有回答。

  我很难过,笔记本硬盘的心里依然记着他,他却把一切都忘了,而那正是他最不希望忘却的。究竟是幸运,还是痛苦,我说不上来,只是觉得造化弄人,有一种淡淡的悲凉。
  这时从BIOS传来一阵奇怪的电流,我感觉到硬盘的表情在变化,由漠然到兴奋,由兴奋到哀伤,由哀伤到狂喜……
  “IBM,你回来了……”。
  ……
  后来BIOS对我说,其实他并没有睡觉,自从硬盘把那些文件藏起来以后,他就料到会有这样的结局,于是偷偷地把其中一些文件放到了备份里。
  “幸好我是DUAL BIOS,虽然藏得不多,还足够让他想起来……”。
  我想BIOS保存这些东西的时候一定很疼,当我问他“为什么这么做”时,BIOS轻描淡写的说:“呵呵,我们是朋友嘛”。
  嗯,朋友,永远的朋友……

2005年11月09日

原文地址:http://www.irunnet.com/viewtopic.php?p=913&sid=4f05f5b8a26e7d0b0e2586190c175d0b#913
GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,但可以提供容错功能。它可以给大量的用户提供总体性能较高的服务。
1、设计概览
(1)设计想定
GFS与过去的分布式文件系统有很多相同的目标,但GFS的设计受到了当前及预期的应用方面的工作量及技术环境的驱动,这反映了它与早期的文件系统明显不同的设想。这就需要对传统的选择进行重新检验并进行完全不同的设计观点的探索。
GFS与以往的文件系统的不同的观点如下:
1、部件错误不再被当作异常,而是将其作为常见的情况加以处理。因为文件系统由成百上千个用于存储的机器构成,而这些机器是由廉价的普通部件组成并被大量的客户机访问。部件的数量和质量使得一些机器随时都有可能无法工作并且有一部分还可能无法恢复。所以实时地监控、错误检测、容错、自动恢复对系统来说必不可少。
2、按照传统的标准,文件都非常大。长度达几个GB的文件是很平常的。每个文件通常包含很多应用对象。当经常要处理快速增长的、包含数以万计的对象、长度达TB的数据集时,我们很难管理成千上万的KB规模的文件块,即使底层文件系统提供支持。因此,设计中操作的参数、块的大小必须要重新考虑。对大型的文件的管理一定要能做到高效,对小型的文件也必须支持,但不必优化。
3、大部分文件的更新是通过添加新数据完成的,而不是改变已存在的数据。在一个文件中随机的操作在实践中几乎不存在。一旦写完,文件就只可读,很多数据都有这些特性。一些数据可能组成一个大仓库以供数据分析程序扫描。有些是运行中的程序连续产生的数据流。有些是档案性质的数据,有些是在某个机器上产生、在另外一个机器上处理的中间数据。由于这些对大型文件的访问方式,添加操作成为性能优化和原子性保证的焦点。而在客户机中缓存数据块则失去了吸引力。
4、工作量主要由两种读操作构成:对大量数据的流方式的读操作和对少量数据的随机方式的读操作。在前一种读操作中,可能要读几百KB,通常达 1MB和更多。来自同一个客户的连续操作通常会读文件的一个连续的区域。随机的读操作通常在一个随机的偏移处读几个KB。性能敏感的应用程序通常将对少量数据的读操作进行分类并进行批处理以使得读操作稳定地向前推进,而不要让它来来回回的读。
5、工作量还包含许多对大量数据进行的、连续的、向文件添加数据的写操作。所写的数据的规模和读相似。一旦写完,文件很少改动。在随机位置对少量数据的写操作也支持,但不必非常高效。
6、系统必须高效地实现定义完好的大量客户同时向同一个文件的添加操作的语义。
(2)系统接口
GFS提供了一个相似地文件系统界面,虽然它没有向POSIX那样实现标准的API。文件在目录中按层次组织起来并由路径名标识。
(3)体系结构:
一个GFS集群由一个master和大量的chunkserver构成,并被许多客户(Client)访问。如图1所示。Master和 chunkserver通常是运行用户层服务进程的Linux机器。只要资源和可靠性允许,chunkserver和client可以运行在同一个机器上。
文件被分成固定大小的块。每个块由一个不变的、全局唯一的64位的chunk-handle标识,chunk-handle是在块创建时由 master分配的。ChunkServer将块当作Linux文件存储在本地磁盘并可以读和写由chunk-handle和位区间指定的数据。出于可靠性考虑,每一个块被复制到多个chunkserver上。默认情况下,保存3个副本,但这可以由用户指定。
Master维护文件系统所以的元数据(metadata),包括名字空间、访问控制信息、从文件到块的映射以及块的当前位置。它也控制系统范围的活动,如块租约(lease)管理,孤儿块的垃圾收集,chunkserver间的块迁移。Master定期通过HeartBeat消息与每一个 chunkserver通信,给chunkserver传递指令并收集它的状态。
与每个应用相联的GFS客户代码实现了文件系统的API并与master和chunkserver通信以代表应用程序读和写数据。客户与master的交换只限于对元数据(metadata)的操作,所有数据方面的通信都直接和chunkserver联系。
客户和chunkserver都不缓存文件数据。因为用户缓存的益处微乎其微,这是由于数据太多或工作集太大而无法缓存。不缓存数据简化了客户程序和整个系统,因为不必考虑缓存的一致性问题。但用户缓存元数据(metadata)。Chunkserver也不必缓存文件,因为块时作为本地文件存储的。
(4)单master。
只有一个master也极大的简化了设计并使得master可以根据全局情况作出先进的块放置和复制决定。但是我们必须要将master对读和写的参与减至最少,这样它才不会成为系统的瓶颈。Client从来不会从master读和写文件数据。Client只是询问master它应该和哪个 chunkserver联系。Client在一段限定的时间内将这些信息缓存,在后续的操作中Client直接和chunkserver交互。
以图1解释一下一个简单的读操作的交互。
1、client使用固定的块大小将应用程序指定的文件名和字节偏移转换成文件的一个块索引(chunk index)。
2、给master发送一个包含文件名和块索引的请求。
3、master回应对应的chunk handle和副本的位置(多个副本)。
4、client以文件名和块索引为键缓存这些信息。(handle和副本的位置)。
5、Client 向其中一个副本发送一个请求,很可能是最近的一个副本。请求指定了chunk handle(chunkserver以chunk handle标识chunk)和块内的一个字节区间。
6、除非缓存的信息不再有效(cache for a limited time)或文件被重新打开,否则以后对同一个块的读操作不再需要client和master间的交互。
通常Client可以在一个请求中询问多个chunk的地址,而master也可以很快回应这些请求。
(5)块规模:
块规模是设计中的一个关键参数。我们选择的是64MB,这比一般的文件系统的块规模要大的多。每个块的副本作为一个普通的Linux文件存储,在需要的时候可以扩展。
块规模较大的好处有:
1、减少client和master之间的交互。因为读写同一个块只是要在开始时向master请求块位置信息。对于读写大型文件这种减少尤为重要。即使对于访问少量数据的随机读操作也可以很方便的为一个规模达几个TB的工作集缓缓存块位置信息。
2、Client在一个给定的块上很可能执行多个操作,和一个chunkserver保持较长时间的TCP连接可以减少网络负载。
3、这减少了master上保存的元数据(metadata)的规模,从而使得可以将metadata放在内存中。这又会带来一些别的好处。
不利的一面:
一个小文件可能只包含一个块,如果很多Client访问改文件的话,存储这些块的chunkserver将成为访问的热点。但在实际应用中,应用程序通常顺序地读包含多个块的文件,所以这不是一个主要问题。
(6)元数据(metadata):
master存储了三中类型的metadata:文件的名字空间和块的名字空间,从文件到块的映射,块的副本的位置。所有的metadata都放在内存中。前两种类型的metadata通过向操作日志登记修改而保持不变,操作日志存储在master的本地磁盘并在几个远程机器上留有副本。使用日志使得我们可以很简单地、可靠地更新master的状态,即使在master崩溃的情况下也不会有不一致的问题。相反,mater在每次启动以及当有 chuankserver加入的时候询问每个chunkserver的所拥有的块的情况。
A、内存数据结构:
因为metadata存储在内存中,所以master的操作很快。进一步,master可以轻易而且高效地定期在后台扫描它的整个状态。这种定期地扫描被用于实现块垃圾收集、chunkserver出现故障时的副本复制、为平衡负载和磁盘空间而进行的块迁移。
这种方法的一个潜在的问题就是块的数量也即整个系统的容量是否受限与master的内存。实际上,这并不是一个严重的问题。Master为每个 64MB的块维护的metadata不足64个字节。除了最后一块,文件所有的块都是满的。类似的,每个文件的名字空间数据也不足64个字节,因为文件名是以一种事先确定的压缩方式存储的.如果要支持更大的文件系统,那么增加一些内存的方法对于我们将元数据(metadata)保存在内存种所获得的简单性、可靠性、高性能和灵活性来说,这只是一个很小的代价。
B、块位置:
master并不为chunkserver所拥有的块的副本的保存一个不变的记录。它在启动时通过简单的查询来获得这些信息。Master可以保持这些信息的更新,因为它控制所有块的放置并通过HeartBeat消息来监控chunkserver的状态。
这样做的好处:因为chunkserver可能加入或离开集群、改变路径名、崩溃、重启等,一个集群重有成百个server,这些事件经常发生,这种方法就排除了master与chunkserver之间的同步问题。
另一个原因是:只有chunkserver才能确定它自己到底有哪些块,由于错误,chunkserver中的一些块可能会很自然的消失,这样在master中就没有必要为此保存一个不变的记录。
C、操作日志:
操作日志包含了对metadata所作的修改的历史记录。它作为逻辑时间线定义了并发操作的执行顺序。文件、块以及它们的版本号都由它们被创建时的逻辑时间而唯一地、永久地被标识。
操作日志是如此的重要,我们必须要将它可靠地保存起来,并且只有在metadata的改变固定下来之后才将变化呈现给用户。所以我们将操作日志复制到数个远程的机器上,并且只有在将相应的日志记录写到本地和远程的磁盘上之后才回答用户的请求。
Master可以用操作日志来恢复它的文件系统的状态。为了将启动时间减至最小,日志就必须要比较小。每当日志的长度增长到超过一定的规模后,master就要检查它的状态,它可以从本地磁盘装入最近的检查点来恢复状态。
创建一个检查点比较费时,master的内部状态是以一种在创建一个检查点时并不耽误即将到来的修改操作的方式来组织的。Master切换到一个新的日子文件并在一个单独的线程中创建检查点。这个新的检查点记录了切换前所有的修改。在一个有数十万文件的集群中用一分钟左右就能完成。创建完后,将它写入本地和远程的磁盘。
(7)数据完整性
名字空间的修改必须是原子性的,它们只能有master处理:名字空间锁保证了操作的原子性和正确性,而master的操作日志在全局范围内定义了这些操作的顺序。
文件区间的状态在修改之后依赖于修改的类型,不论操作成功还是失败,也不论是不是并发操作。如果不论从哪个副本上读,所有的客户都看到同样的数据,那么文件的这个区域就是一致的。如果文件的区域是一致的并且用户可以看到修改操作所写的数据,那么它就是已定义的。如果修改是在没有并发写操作的影响下完成的,那么受影响的区域是已定义的,所有的client都能看到写的内容。成功的并发写操作是未定义但却是一致的。失败的修改将使区间处于不一致的状态。
Write操作在应用程序指定的偏移处写入数据,而record append操作使得数据(记录)即使在有并发修改操作的情况下也至少原子性的被加到GFS指定的偏移处,偏移地址被返回给用户。
在一系列成功的修改操作后,最后的修改操作保证文件区域是已定义的。GFS通过对所有的副本执行同样顺序的修改操作并且使用块版本号检测过时的副本(由于chunkserver退出而导致丢失修改)来做到这一点。
因为用户缓存了会位置信息,所以在更新缓存之前有可能从一个过时的副本中读取数据。但这有缓存的截止时间和文件的重新打开而受到限制。
在修改操作成功后,部件故障仍可以是数据受到破坏。GFS通过master和chunkserver间定期的handshake,借助校验和来检测对数据的破坏。一旦检测到,就从一个有效的副本尽快重新存储。只有在GFS检测前,所有的副本都失效,这个块才会丢失。
2、系统交互
(1)租约(lease)和修改顺序:
(2)数据流
我们的目标是充分利用每个机器的网络带宽,避免网络瓶颈和延迟
为了有效的利用网络,我们将数据流和控制流分离。数据是以流水线的方式在选定的chunkerserver链上线性的传递的。每个机器的整个对外带宽都被用作传递数据。为避免瓶颈,每个机器在收到数据后,将它收到数据尽快传递给离它最近的机器。
(3)原子性的record Append:
GFS提供了一个原子性的添加操作:record append。在传统的写操作中,client指定被写数据的偏移位置,向同一个区间的并发的写操作是不连续的:区间有可能包含来自多个client的数据碎片。在record append中, client只是指定数据。GFS在其选定的偏移出将数据至少原子性的加入文件一次,并将偏移返回给client。
在分布式的应用中,不同机器上的许多client可能会同时向一个文件执行添加操作,添加操作被频繁使用。如果用传统的write操作,可能需要额外的、复杂的、开销较大的同步,例如通过分布式锁管理。在我们的工作量中,这些文件通常以多个生产者单个消费者队列的方式或包含从多个不同 client的综合结果。
Record append和前面讲的write操作的控制流差不多,只是在primary上多了一些逻辑判断。首先,client将数据发送到文件最后一块的所有副本上。然后向primary发送请求。Primary检查添加操作是否会导致该块超过最大的规模(64M)。如果这样,它将该块扩充到最大规模,并告诉其它副本做同样的事,同时通知client该操作需要在下一个块上重新尝试。如果记录满足最大规模的要求,primary就会将数据添加到它的副本上,并告诉其它的副本在在同样的偏移处写数据,最后primary向client报告写操作成功。如果在任何一个副本上record append操作失败,client将重新尝试该操作。这时候,同一个块的副本可能包含不同的数据,因为有的可能复制了全部的数据,有的可能只复制了部分。GFS不能保证所有的副本每个字节都是一样的。它只保证每个数据作为一个原子单元被写过至少一次。这个是这样得出的:操作要是成功,数据必须在所有的副本上的同样的偏移处被写过。进一步,从这以后,所有的副本至少和记录一样长,所以后续的记录将被指定到更高的偏移处或者一个不同的块上,即使另一个副本成了primary。根据一致性保证,成功的record append操作的区间是已定义的。而受到干扰的区间是不一致的。
(4)快照(snapshot)
快照操作几乎在瞬间构造一个文件和目录树的副本,同时将正在进行的其他修改操作对它的影响减至最小。
我们使用copy-on-write技术来实现snapshot。当master受到一个snapshot请求时,它首先将要snapshot的文件上块上的lease。这使得任何一个向这些块写数据的操作都必须和master交互以找到拥有lease的副本。这就给master一个创建这个块的副本的机会。
副本被撤销或终止后,master在磁盘上登记执行的操作,然后复制源文件或目录树的metadata以对它的内存状态实施登记的操作。这个新创建的snapshot文件和源文件(其metadata)指向相同的块(chunk)。
Snapshot之后,客户第一次向chunk c写的时候,它发一个请求给master以找到拥有lease的副本。Master注意到chunk c的引用记数比1大,它延迟对用户的响应,选择一个chunk handle C’,然后要求每一有chunk c的副本的chunkserver创建一个块C’。每个chunkserver在本地创建chunk C’避免了网络开销。从这以后和对别的块的操作没有什么区别。
3、MASTER操作
MASTER执行所有名字空间的操作,除此之外,他还在系统范围管理数据块的复制:决定数据块的放置方案,产生新数据块并将其备份,和其他系统范围的操作协同来确保数据备份的完整性,在所有的数据块服务器之间平衡负载并收回没有使用的存储空间。
3.1 名字空间管理和加锁
与传统文件系统不同的是,GFS没有与每个目录相关的能列出其所有文件的数据结构,它也不支持别名(unix中的硬连接或符号连接),不管是对文件或是目录。GFS的名字空间逻辑上是从文件元数据到路径名映射的一个查用表。
MASTER在执行某个操作前都要获得一系列锁,例如,它要对/d1/d2…/dn/leaf执行操作,则它必须获得/d1,/d1/d2,…, /d1/d2/…/dn的读锁,/d1/d2…/dn/leaf的读锁或写锁(其中leaf可以使文件也可以是目录)。MASTER操作的并行性和数据的一致性就是通过这些锁来实现的。
3.2 备份存储放置策略
一个GFS集群文件系统可能是多层分布的。一般情况下是成千上万个文件块服务器分布于不同的机架上,而这些文件块服务器又被分布于不同机架上的客户来访问。因此,不同机架上的两台机器之间的通信可能通过一个或多个交换机。数据块冗余配置策略要达到连个目的:最大的数据可靠性和可用性,最大的网络带宽利用率。因此,如果仅仅把数据的拷贝置于不同的机器上很难满足这两个要求,必须在不同的机架上进行数据备份。这样即使整个机架被毁或是掉线,也能确保数据的正常使用。这也使数据传输,尤其是读数据,可以充分利用带宽,访问到多个机架,而写操作,则不得不涉及到更多的机架。
3.3 产生、重复制、重平衡数据块
当MASTER产生新的数据块时,如何放置新数据块,要考虑如下几个因素:(1)尽量放置在磁盘利用率低的数据块服务器上,这样,慢慢地各服务器的磁盘利用率就会达到平衡。(2)尽量控制在一个服务器上的“新创建”的次数。(3)由于上一小节讨论的原因,我们需要把数据块放置于不同的机架上。
MASTER在可用的数据块备份低于用户设定的数目时需要进行重复制。这种情况源于多种原因:服务器不可用,数据被破坏,磁盘被破坏,或者备份数目被修改。每个被需要重复制的数据块的优先级根据以下几项确定:第一是现在的数目距目标的距离,对于能阻塞用户程序的数据块,我们也提高它的优先级。最后, MASTER按照产生数据块的原则复制数据块,并把它们放到不同的机架内的服务器上。
MASTER周期性的平衡各服务器上的负载:它检查chunk分布和负载平衡,通过这种方式来填充一个新的服务器而不是把其他的内容统统放置到它上面带来大量的写数据。数据块放置的原则与上面讨论的相同,此外,MASTER还决定那些数据块要被移除,原则上他会清除那些空闲空间低于平均值的那些服务器。
3.4 垃圾收集
在一个文件被删除之后,GFS并不立即收回磁盘空间,而是等到垃圾收集程序在文件和数据块级的的检查中收回。
当一个文件被应用程序删除之后,MASTER会立即记录下这些变化,但文件所占用的资源却不会被立即收回,而是重新给文件命了一个隐藏的名字,并附上了删除的时间戳。在MASTER定期检查名字空间时,它删除超过三天(可以设定)的隐藏的文件。在此之前,可以以一个新的名字来读文件,还可以以前的名字恢复。当隐藏的文件在名字空间中被删除以后,它在内存中的元数据即被擦除,这就有效地切断了他和所有数据块的联系。
在一个相似的定期的名字空间检查中,MASTER确认孤儿数据块(不属于任何文件)并擦除他的元数据,在和MASTER的心跳信息交换中,每个服务器报告他所拥有的数据块,MASTER返回元数据不在内存的数据块,服务器即可以删除这些数据块。
3.5 过时数据的探测
在数据更新时如果服务器停机了,那么他所保存的数据备份就会过时。对每个数据块,MASTER设置了一个版本号来区别更新过的数据块和过时的数据块。
当MASTER授权一个新的lease时,他会增加数据块的版本号并会通知更新数据备份。MASTER和备份都会记录下当前的版本号,如果一个备份当时不可用,那么他的版本号不可能提高,当ChunkServer重新启动并向MASTER报告他的数据块集时,MASTER就会发现过时的数据。
MASTER在定期的垃圾收集程序中清除过时的备份,在此以前,处于效率考虑,在各客户及英大使,他会认为根本不存在过时的数据。作为另一个安全措施, MASTER在给客户及关于数据块的应答或是另外一个读取数据的服务器数据是都会带上版本信息,在操作前客户机和服务器会验证版本信息以确保得到的是最新的数据。
4、容错和诊断
4.1 高可靠性
4.1.1 快速恢复
不管如何终止服务,MASTER和数据块服务器都会在几秒钟内恢复状态和运行。实际上,我们不对正常终止和不正常终止进行区分,服务器进程都会被切断而终止。客户机和其他的服务器会经历一个小小的中断,然后它们的特定请求超时,重新连接重启的服务器,重新请求。
4.1.2 数据块备份
如上文所讨论的,每个数据块都会被备份到放到不同机架上的不同服务器上。对不同的名字空间,用户可以设置不同的备份级别。在数据块服务器掉线或是数据被破坏时,MASTER会按照需要来复制数据块。
4.1.3 MASTER备份
为确保可靠性,MASTER的状态、操作记录和检查点都在多台机器上进行了备份。一个操作只有在数据块服务器硬盘上刷新并被记录在MASTER和其备份的上之后才算是成功的。如果MASTER或是硬盘失败,系统监视器会发现并通过改变域名启动它的一个备份机,而客户机则仅仅是使用规范的名称来访问,并不会发现MASTER的改变。
4.2 数据完整性
每个数据块服务器都利用校验和来检验存储数据的完整性。原因:每个服务器随时都有发生崩溃的可能性,并且在两个服务器间比较数据块也是不现实的,同时,在两台服务器间拷贝数据并不能保证数据的一致性。
每个Chunk按64kB的大小分成块,每个块有32位的校验和,校验和和日志存储在一起,和用户数据分开。
在读数据时,服务器首先检查与被读内容相关部分的校验和,因此,服务器不会传播错误的数据。如果所检查的内容和校验和不符,服务器就会给数据请求者返回一个错误的信息,并把这个情况报告给MASTER。客户机就会读其他的服务器来获取数据,而MASTER则会从其他的拷贝来复制数据,等到一个新的拷贝完成时,MASTER就会通知报告错误的服务器删除出错的数据块。
附加写数据时的校验和计算优化了,因为这是主要的写操作。我们只是更新增加部分的校验和,即使末尾部分的校验和数据已被损坏而我们没有检查出来,新的校验和与数据会不相符,这种冲突在下次使用时将会被检查出来。
相反,如果是覆盖现有数据的写,在写以前,我们必须检查第一和最后一个数据块,然后才能执行写操作,最后计算和记录校验和。如果我们在覆盖以前不先检查首位数据块,计算出的校验和则会因为没被覆盖的数据而产生错误。
在空闲时间,服务器会检查不活跃的数据块的校验和,这样可以检查出不经常读的数据的错误。一旦错误被检查出来,服务器会拷贝一个正确的数据块来代替错误的。
4.3 诊断工具
广泛而细致的诊断日志以微小的代价换取了在问题隔离、诊断、性能分析方面起到了重大的作用。GFS服务器用日志来记录显著的事件(例如服务器停机和启动)和远程的应答。远程日志记录机器之间的请求和应答,通过收集不同机器上的日志记录,并对它们进行分析恢复,我们可以完整地重现活动的场景,并用此来进行错误分析。
6 测量
6.1 测试环境
一台主控机,两台主控机备份,16台数据块服务器,16台客户机。
每台机器:2块PIII1.4G处理器,2G内存,2块80G5400rpm的硬盘,1块100Mbps全双工网卡
19台服务器连接到一个HP2524交换机上,16台客户机俩接到领外一台交换机上,两台交换机通过1G的链路相连

2005年08月16日

 

Dialogue (1)

A: Good morning, Mr. Smith 早上好,史密斯先生

B: Hello, Mr. Lie. It’s good to see you. How are you? 你好,李先生。 见到你太好了, 你好吗?

A: Just fine, thanks. And you? 还好,谢谢。 你呢?

B: I’m doing very well, thank you. 我一切都好, 谢谢。

A: That’s good. See you later. 那好,回头见。

B: All right. Bye now. 好,再见。

Dialogue (2)

A: I don’t think we’ve met. My name is Tim. 我想我们以前没见过面,我叫提姆

B: Hello. I’m Scot. Nice to see you. 你好,我叫司考特,非常高兴见到你。

A: Nice meeting you, too. Where are you from? 见到你我也很高兴。你是哪国人?

B: I’m from the United States. How about you? 我是美国人,你呢?

A: Canada. 我是加拿大人。

我是加拿大人。

Dialogue (3)

A: Say, Grace, how are you doing? 我说,格雷司,你怎么样?

B: Mike! How are you? 迈克!你好吗?

A: Not bad. Where are you going? 不错。你去哪?

B: To a McDonald’s. How about you? 去马克唐纳快餐厅,你呢?

A: Oh, I just go off work. Boy, I’m so hungry I could eat a horse. 哦,我刚刚下班。我饿得能吃下一匹马!

B: Where are you working now? 你在哪里工作?

A: J&L Steel. It’s a rail pain. But I guess I shouldn’t complain. Lots of people are out of work these days. 杰爱尔钢厂。这的确是份苦活,但是我想我不该抱怨。现在许多人都失业。

B: Yeah, that’s truth. Well, I’d better let you go and get some food. 对,这是事实。那么,我最好是让你去吃点东西。

A: It was great seeing you again. Maybe we could get together sometime. 见到你可真好,也许咱们什么时候再聚一聚。

B: Sounds good. I’ll give you a call. 好主意。我给你打电话。

A: Ok. Great. Well, I’ll be seeing you. 好极了。那么再见。

好极了。那么再见。

Functions

Greetings 打招呼

  • How do you do? 您好
  • How are you? 你好
  • Good morning (afternoon, evening, day). 早上好 (中午好,晚上好,你好)
  • How nice to see you! (见到你太好了)
  • How have you been? (你近来怎样?)
  • What’s happening? (情况怎样?)
  • How are you doing? (你的情形如何?)
  • How are things? (一切都好吧?)
  • How are you getting on with…? (你的…好吗?)
  • What’s new? (有新情况吗?)
  • Long time no see. (好久没见了。)

Responding to greetings 对问候的回答

  • How do you do? 你好
  • Fine, thanks. And you? 很好,谢谢。你呢?
  • Very well, thanks. 很好,谢谢。
  • Good morning (afternoon, evening, day) 早上好 (中午好,晚上好,你好)
  • Pretty good. 很好
  • Couldn’t be better. 太好了
  • Not bad. 还可以
  • Okay. 可以
  • Nothing. 没什么新情况
  • Yeah! Long time no see. 是的,是好久没见了。

Preclosings 告别前用语

  • Well, I’m afraid I have to be going 哦,恐怕我得走了。
  • It’s been a pleasure talking with you. 我很荣幸能与你交谈。
  • I really must go now. 我真的得走了。
  • Well, it’s getting late. 噢,天已晚了。
  • I know you are busy. 我知道你很忙。
  • Nice to see you again. 再次见到你太好了
  • Thanks for coming. 谢谢你的光临
  • Maybe we could get together sometime. 也许我们什么时候能再聚一聚
  • Great seeing you. 见到你太好了。
  • I’ve really got to go. 我现在真的得走了
  • Got to go now. 现在必须得走了。

Responding to preclosings 对告别前用语的回答

  • Thanks for coming. 谢谢您的光临
  • Yes, I’ve enjoyed it. 对,我很开心
  • My pleasure, too. 这也是我的荣幸。
  • It’s good to see you. 见到你太好了。
  • Maybe wee can talk again. 也许我们能够再谈
  • It was fun. 这很有趣
  • Sounds good. 好主意
  • Same here. 我也同样
  • Ok, see you. 好吧,再见
  • See you again. 再见

Closings 告别用语

  • Until next time… 下次再见
  • Good-bye. 再见
  • Have a nice weekend. 祝你周末愉快
  • Talk to you later. 回来再谈
  • See you later. 再见
  • good-bye. 再见

Responding to closings 对告别用语的回答

  • You too. 你也一样
  • Same to you. 你也一样。
  • So long. Take care. 再见,保重。

Notes.

    打招呼几乎是公式化的。有许多正确的打招呼和回答的方法。 经常当人们说:“how are you doing?”,他们并非真有兴趣去了解一个人的情况如何。 正象打招呼是无意识那样,回答也是无意识的。 “fine”再加上 “and how are you?”是最常见的回答。有时我们不想过分谈论我们真正的健康状况和感情,我们就用一个中性的回答,如“Okay”,然后就终止话题。

    通常人们不会突然终止谈话,告别然后突然分手。结束一次谈话一般要用一点时间,这涉及要用告别前用语和告别用语。告别前用语表明谈话快要结束而告别用语则明确地结束谈话。在与不熟悉的人或与上司谈话时,我们不应该忽视告别前用语发出的信号。在非正式的场合,年长者,位高者通常发出信号来结束谈话。告别前用语还包括为某事而感谢某人,为自己某一行为找借口,或道歉。告别用语与打招呼一样,一般都没有真正的意义。