二楞子's profile疯癫二楞子PhotosBlogListsMore Tools Help

Blog


    10年资料-分区表

    修复了N次分区表,多个恢复软件查找了无数次,最后结论:160G的数据全部玩完,只有几个零星的文档找回之后数据能够正常显示。

    10年来收集保存的文档、手册、相片……

    仅以此为戒。

    高端货

    最近两天玩了两个高端玩意。不一样,就是不一样啊~

    23042009

    型号是P17H~今天下班也看到外面在展出~

    23042009(001)

    分辨率不错~2G内存~CPU一般~显卡肯定不行。就我这大手,操作起来还是有点困难呢。

    23042009(002)

    和我移动硬盘的对比照。。。记得广告是插在裤子屁股后面的袋子里的。

    23042009(004)

    ###########air来了###########

    23042009(005)

    传说中的air,终于玩了一把~还是屏幕很爽~键盘按起来不咋安逸~左边一个电源接口,右边一大一小2USB接口。

    23042009(006)

    23042009(007) 还是要和硬盘 对比一下。23042009(008)

    23042009(009) 电源~很小,很特别~和电脑的接口处貌似带了磁性的~

    25042009

    收工。

    软件工程师简历、面试(转)

    ######################纯碎转过来喽一眼

    简历:

    (作者简介: 王忻,Google 工程师。北京出生,五岁时跟随父母移居美国。中学期间跳了三级,十五岁进入了加州理工大学,加入 Google 前曾在微软等公司工作。)
      最近三年作为 Google(谷歌)的软件工程师,我每周会帮人事部门审查简历,决定要不要给他们面试。Google 这几年的发展让很多许多优秀的工程师都前来申请。到目前为止,我已经看了上千份简历,有些简历留下的印象比别的好很多。尤其是最近亲戚朋友常常问我如何修改他们的简历,所以我积累了一些常见的错误避免的提议,在此跟大家交流一下。
      1.谈到你做过的技术时,应该提到用的程序语言、你的个人贡献和产品细节。
      有时我看到有人把过去的经验在简历上一笔带过,比如说:
      • 在三人小组里,为电子邮件软件写了些 features。
      这是远远不够的,看简历的人希望了解你做的工作的难度和对本公司有多少联系,所以你最好写的具体一些。譬如:
      • 用 C++ 语言写了网络电子邮件的自动 backups。在三人小组里,专门负责设计和写储存服务器。从设计开始, 一年后把这个功能 feature 的用户推到了三千。
      2.多讲事实, 少用形容词。
      看简历的人读你的简历时,需要做判断,所以在简历里需要事实和数目。如果你写“迅速的提高了软件的操作效率”,看简历的人很难判断你成就的难度。但如果你写“在3个星期内,把软件的操作效率提高了40%” 就好多了。
      有些谦虚的朋友们不愿意把话说满,所以你也可以用这个办法。你如果说自己“突出”或“在项目上常常被请去救火”,听起来难免会有点骄傲。但你也可以用不能否认的事实来说明你的观点,如“《纽约日报》评这个产品为‘突出’”,或“加入了三个原本已落后于计划的项目小组,但经过努力和组员一起把它们都按时完成了。”
      3.你获得的奖、商业的荣誉或表扬、受用户欢迎的产品和你做过的有难度的业余项目都该包括在简历里。
      我有位朋友在硅谷一个著名的硬件公司做了六年,她设计的 IP phone(网络电话)为公司赚了上亿的收入,被公司与商业报道多次评了奖。我有一次在旧金山的高速公路上驾车时,看到路边有她产品的广告牌;还有一次我去上海度假时,竟然发现上海公路边上也有!
      不久,这位朋友决定换工作,请我看看她的简历。我惊讶的发现,她居然轻描淡写的写了一句-- "1998 – 2004:网络电话产品的硬件工程师组长" 和她的职责。
      "产品赢的奖呢?它为公司赚的钱呢?" 我追问到。
      "那些也该写吗?" 她说。
      当然该写。
      有人问,业余时间做的项目可不可以写?我觉得只要你的项目有代表性能说明对你的能力,都该包括。
      4.分清主次,删掉相比之下不起眼的成绩,以免冲淡更加突出的成绩。
      有朋友问,写简历是不是写的越多越好?譬如:
      在甲公司做暑假实习生——
      * 改善电子游戏的数值分类算法, 减少了内存要求 10%。
      * 用 Java 写了 3000 行用户界面程序。
      * 每周做两小时的人工测试。
      你在申请软件工程师的职位时,我觉得前两点比较相关,第三点其实就不必写了。有时我看到有的简历里会提到,"按时完成了任务,产品符合原计划规格"。但读简历的人通常会认为这是理所当然的,而你把这些声明出来反而减弱简历的效果。
      写一份简历不容易,但写好了也会带来成就感 (和好工作!)。 Google (谷歌)在中国广召各方面的人才,你不妨可以给我们投个简历!我们不但在信息检索方面招雇工程师,还有计算机图形、用户界面、硬件、Windows、质量保证员和系统管理员等方面。更多信息,请您访问这里。
      谢谢阅读!大家感兴趣的话,下次我可以介绍“如何预备软件工程师的面试”。

    #####################################

    面试:

     (作者简介: 王忻,Google 工程师。北京出生,五岁时跟随父母移居美国。中学期间跳了三级,十五岁进入了加州理工大学,加入 Google 前曾在微软等公司工作。)
      六月份的时候,我曾经在黑板报上介绍过“如何写一份好的工程师简历”, 今天想跟大家来谈谈如何准备软件工程师的面试?假设,现在您的杀手简历 (killer resume)已经吸引了某大公司的注意并约你面试。那么接下来该如何准备呢?
      我 在 Google(以前是微软)工作期间面试了不下 300人,其中某些应聘者确实表现非凡,但有些却显得准备不足。当然许多面试准备不足的人最后依然获得了录用通知,因为他们本身确实才华出众。但如果应聘 者能提前准备妥当,那么面试过程将更为保险和轻松。以下所列出的就是我根据多年经验总结得出的建议:
      1.使用相同的工具(如铅笔和纸张)和时间限制(例如半个小时)模拟面试训练
      Google 和微软都会让应聘者在白板上手工解答编程问题,但通常大部分的应聘者都是习惯于在电脑上利用编程工具系统编写程序。因此面试的时候,某些应聘者离开了熟悉 的电脑光标,站在白板前感觉手足无措不知该如何起行。又或者他们不习惯在编程之时旁边有人观看,这会让他们感到紧张而无法正常思考。
      在现实生活中,如果你想要横渡英吉利海峡,自然不能总是在室内游泳池练习。你必须投身于大海在波涛之中训练,在准备面试的时候也是如此。:)
      在 面试开始之前你最好向招聘单位询问面试形式和面试问题。如果招聘单位让你在某个房间考试且仅提供没有汇编程序的编辑器,那么就应该在家中按照这种情景进行 练习。如果招聘公司单位让你在白板上回答问题并会安排考官在旁监督,那么你就要找一位软件工程师来扮演考官配合你练习。即使找来的考官经验不如你也没有关 系,他们依然能帮助你消除在他人面前出错所带来的紧张感,这样可以让你适应有人在旁边盯着看的面试氛围。
      如果你恰巧认识我并希望由我来帮你联系,那我的条件就是必须请我吃饭:如果你已经工作了就吃日本寿司大餐;如果你还是学生,那么吃比萨饼也可以。:)
      2.在面试过程中不要对细小错误耿耿于怀
      我 曾不止一次的在面试过程中碰到这种情况:当应聘者知道编程问题后,他马上就想到了最佳的方案、确定了边界条件,然后开始编写程序。但在编写过程中,应聘者 犯了诸如首先检查是不是操作顺序错误或忘记设定某变量等无关大局的小错误,当我指出其错误之后,应聘者立刻变得十分紧张,这种焦虑情绪影响了他在后面环节 的正常发挥。
      其实这种恐惧心理完全不必要。一名优秀的程序员在编程过程中出现错误也是很正常的,就像是小提琴手在演奏高难度的巴赫交响乐时也会偶尔失误。音乐会的听众可能会觉察到这些错误,但是听众绝对不会因为这种细小失误就把出色的小提琴手看作是门外汉。
      即便应聘者彻底搞砸了某个编程问题,面试考官也可能会提出不同的问题并会容忍应聘者在某个问题上的失误。再退一步说,就算某次面试彻底失败,你也有机会在其它面试上补救。
      我 的一位同事(一个项目的技术负责人)最近面试了一个人,在开始面试时他觉得面试者的交流方式存在问题,因此开始表现的相当不友好。但经过了整个面试过程 后,面试者证明了自身的能力,而我的那位同事也成了那位面试者最坚定的支持者。在过去的一年中,我从未见过这位同事如此强烈的支持哪位面试者。
      所以,因此就算面试进展不顺,也务必坚持到底不要放弃。
      3.在面试过程中不要失礼
      这似乎是不用说的问题,但在面试过程中我确实碰到过影响很不好的失礼行为。曾有一位前来应聘软件工程师的人看到我就说:“哇,我真不敢相信你这么年轻!你看上去好小!!我觉得你才 18 岁!”
      面试者的这种言行实在要不得。
      面试者也要注意不要说出诸如此类的话:“哇,你真的就是考官吗?你看上去好老!”“哇,你真的是来面试我的,你看上去好胖!”(相信应该不会有人说这样的话)。
      在 我的另外一次面试中,应聘者的手机在面试开始 15 分钟之后就响了,她没有理会,手机连续响了 20 秒,这样不免会对面试造成影响。5 分钟之后,她的手机又响了,她依然没有理会;5分钟之后,手机第三次响起。最后她终于抓过手提包在里面翻出了手机。我想:“是时候关掉手机了,她在进来之 前就应该把手机关掉。”但是她在手提包中拿出手机之后却旁若无人的打起电话来,而且就在面试过程中间!
      这种情况唯一可接受的理由就是他有什么非常紧急的事,但是即便情况如此,那么他也应该在面试开始之时就讲清楚,让面试官有所准备。
      4.不要在面试中喧宾夺主
      我曾经面试过几个应聘者,他们好像铁了心肠一定要告诉我他们最近的“超级项目”。当我开始发话他们就立刻打断:“我想让你了解我们近期处理的超级项目,10年之前当这个项目开始之时还默默无闻……”,然后接下来的5分钟时间都在那里滔滔不绝唾沫横飞。
      有时应聘者好像打定主意要给每个考官详细描述其引以为豪的项目,然后一整天都在那里翻来覆去的说这个项目。
      记住:面试官在面试过程中有具体的问题需要询问。但是如果应聘者喧宾夺主,那么考官就可能无法获得充分的信息来做出判断,同时这种行为也会让考官觉得应聘者很难共事。
      如果你确实想谈论自己的项目,那么就应询问面试官:“我觉得最近的某某项目能充分体现我的能力,我能不能用 10分钟的时间来描述一下具体情况?”这样就会给面试官空间来调整面试过程,由此也避免毫无征兆就让面试离题万里。
      5.在回答需要具体答案的问题之时,记得首先要有总括性的发言
      有 时我会问一个答案可以很简练的问题,例如:“在你的那个成功项目中总共有多少人参与?”但应聘者往往会就此打开话匣:“恩,张三参与了这个项目,他负责 UI部分,当然我也会给他一些指导。李四也在项目中,她在宾州远程工作,负责后端服务器。两年之后我们又有新人王五加入……”
      在应聘者滔滔不绝的讲了三分钟之后,我还是不知道这个项目到底有多少人参与。
      因此首先要简练的回答问题,然后再展开描述:“在我接手项目时有三个人,但当我离开项目时人数已经增加到12人。”
      当然如果能简练的回答问题,然后征询意见之后再展开论述那就更好了:“在我接手项目时有三个人,但当我离开项目时人数已经增加到 12 人。我可以讲一下各人在项目中的具体分工吗?”
      6.(不是特别重要)在面试中要衣着得体,舒适的商务便装是最佳的选择
      人们有时候会为衣着犯愁。但是最重要的是要让自己感觉舒适。如果需要具体的建议,那么我建议穿衬衫甚至T恤衫。对于某些公司(例如 Google),西装革履显然是太隆重了。
      这 条建议不必太看中,因为面试官不会管应聘者穿什么。最好应该询问人事招聘部门穿什么合适,因为不同国家有不同习俗,就算美国东海岸和西海岸的公司着装文化 也会有差别。像 Google 这样的公司在着装方面更加随意,因此如果你穿着“三件套”的经典西服去 Google 面试,考官可能会有异样的感觉。因此如果你真的具备软件工程的本领,穿什么其实并不重要。某个应聘者曾经穿着皱巴巴脏兮兮的T恤就跑来面试,他的T恤衫上 还有着许多破洞。但最后他还是拿到了录取通知(当然我绝不建议如此穿着)。
      最后的一个小故事
      最后我想讲一场极为尴尬的面试。在看完之后,我希望你能这样想:无论你的面试如何糟糕,你至少要比这位应聘者幸运。
      以前我还在微软的时候,我们通常会为应聘者准备一些饮料,某位暂称其为 Jeff 的应聘者要了一听百事可乐。我们走进面试房间后,他就在桌前坐下了。接下来我们简要的谈了谈他的工作经历,然后他开始在白板上解答编程问题,此时他还没有打开他的可乐。
      我们俩站在白板前,然后杰夫开始在上面写程序。在写程序之时他沉浸在对整体构架的思考中,下意识的退了一步来查看整个白板。在后退时他不小心碰到了桌子,放在桌上的百事可乐掉到了地上。
      因为可乐还没有打开,因此当可乐罐落地的时候,可乐罐炸开了。
      可乐罐在地上打转,泡沫喷的到处都是。你可以想象当时的场景,可乐喷到了墙上、书架还有我电脑的键盘上。我俩楞在那里,手都半伸着(根本来不及抓到可乐罐),眼睁睁的看着可乐弄得到处都是。
      我们花了 5 分钟的时间用纸巾来清理现场(虽然我的书本自那天之后都粘页了,而墙壁也不再是干净的了)。
      随后我们重新开始白板测试。杰夫此时已非常紧张(换了谁都会紧张吧?)。他写了几行程序,然后擦掉,然后再写。他是用自己的手擦拭白板而不是用板刷。他急得额头冒汗,然后他又用刚刚擦过白板的手擦汗。在面试过程结束之时,他的脸上布满了红色、绿色和蓝色的颜料。
      我说:“你的手上粘了很多颜料,我带你去卫生间洗洗吧,”然后我把他领到洗手间让他从镜中看到了自己的尊容。

    E1通信的基础知识--转

        今天被同事问到一个E1有多少话路,时隙的意思,发现自己有些描述不清楚,颇有外公当年说的那句话:“翻开书就了然,背着书就茫然。”找了一些基本的东西,贴过来保留。

    ##################################

    E1简介:

       ① 一条E1是2.048M的链路,用PCM编码。
       ② 一个E1的帧长为256个bit,分为32个时隙,一个时隙为8个bit。
       ③ 每秒有8k个E1的帧通过接口,即8K*256=2048kbps。
       ④ 每个时隙在E1帧中占8bit,8*8k=64k,即一条E1中含有32个64K。

    E1帧结构

    E1分为有成帧,成复帧与不成帧三种方式,在成帧的E1中第0时隙用于传输帧同步数据,其余31个时隙可以用于传输有效数据;在成复帧的E1中,除了第0时隙外,第16时隙是用于传输信令的,只有第1到15,第17到第31共30个时隙可用于传输有效数据;而在不成帧的E1中,所有32个时隙都可用于传输有效数据。

    E1信道的帧结构简述

    在E1信道中,8bit组成一个时隙(TS),由32个时隙组成了一个帧(F),16个帧组成一个复帧(MF)。在一个帧中,TS0 主要用于传送帧定位信号(FAS)、CRC-4(循环冗余校验)和对端告警指示,TS16主要传送随路信令(CAS)、复帧定位信号和复帧对端告警指示,TS1至TS15和TS17至TS31共30个时隙传送话音或数据等信息。我们称TS1至TS15和TS17至TS31为“净荷”,TS0和TS16为“开销”。如果采用带外公共信道信令(CCS),TS16就失去了传送信令的用途,该时隙也可用来传送信息信号,这时帧结构的净荷为TS1至TS31,开销只有TS0了。

    由PCM编码介绍E1:

    由PCM编码中E1的时隙特征可知,E1共分32个时隙TS0-TS31。 每个时隙为64K,其中TS0为被帧同步码,Si、Sa4、Sa5、sa6、Sa7、A比特占用,若系统运用了CRC校验,则Si比特位置改传CRC校验码。TS16为信令时隙,当使用到信令(共路信令或随路信令)时,该时隙用来传输信令,用户不可用来传输数据。所以2M的PCM码型有

    ① PCM30:PCM30用户可用时隙为30个,TS1-TS15,TS17-TS31。TS16传送信令,无CRC校验。 

    ② PCM31:PCM30用户可用时隙为31个,TS1-TS15,TS16-TS31。TS16不传送信令,无CRC校验。

    ③ PCM30C:PCM30用户可用时隙为30个,TS1-TS15,TS17-TS31。TS16传送信令,有CRC校验。

    ④ PCM31C:PCM30用户可用时隙为31个,TS1-TS15,TS16-TS31。TS16不传送信令,有CRC校验。

    CE1,就是把2M的传输分成了30个64K的时隙,一般写成N*64,你可以利用其中的几个时隙,也就是只利用n个64K,必须接在ce1/pri上。

    CE1----最多可有31个信道承载数据 timeslots 1----31 timeslots 0 传同步。

    E1接口:

    G.703非平衡的75 ohm,平衡的120 ohm2种接口

    使用E1的三种方法:
    1.将整个2M用作一条链路,如DDN 2M;
    2.将2M用作若干个64k及其组合,如128K,256K等,这就是CE1;
    3.在用作语音交换机的数字中继时,这也是E1最本来的用法,是把一条E1作为32个64K来用,但是时隙0和时隙15是用作signaling即信令的,所以一条E1可以传30路话音。PRI就是其中的最常用的一种接入方式,标准叫PRA信令。

    用2611等的广域网接口卡,经V.35-G.703转换器接E1线。这样的成本应该比E1卡低的。目前DDN的2M速率线路通常是经HDSL线路拉至用户侧。E1可由传输设备出的光纤拉至用户侧的光端机提供E1服务。

    E1的使用注意事项:

    E1接口对接时,双方的E1不能有信号丢失/帧失步/复帧失步/滑码告警,但是双方在E1接口参数上必须完全一致,因为个别特性参数的不一致,不会在指示灯或者告警台上有任何告警,但是会造成数据通道的不通/误码/滑码/失步等情况。这些特性参数主要有;阻抗/ 帧结构/CRC4校验,阻有75ohm和120ohm两种,帧结构有PCM31/PCM30/不成帧三种;在新桥节点机中将PCM31和PCM30分别描述为CCS和CAS,对接时要告诉网管人员选择CCS,是否进行CRC校验可以灵活选择,关键要双方一致,这样采可保证物理层的正常。

    E1常见问题

    1. E1 与 CE1是由谁控制,电信还是互连的两侧的用户设备?用户侧肯定要求支持他们,电信又是如何分别实现的。
      答:首先由电信决定,电信可提供E1和CE1两种线路,但一般用户的E1线路都是CE1,除非你特别要只用E1,然后才由你的设备所决定,CE1可以当E1用,但E1却不可以作CE1。
    2. CE1 是32个时隙都可用是吧?
      答:CE1的0和16时隙不用,0是传送同步号,16传送控制命令,实际能用的只有30个时隙1-15,16-30
    3. E1/CE1/PRI又是如何区分的和通常说的2M的关系。和DDN的2M又如何关联啊?
      答:E1 和CE1 都是E1线路标准,PRI是ISDN主干线咱,30B+D,DDN的2M是透明线路你可以他上面跑任何协议。
      E1和CE1的区别,当然可不可分时隙了。
    4. E1/CE1/PRI与信令、时隙的关系
      答:E1,CE1,都是32时隙,30时隙,0、16分别传送同步信号和控制信今,PRI采用30B+D ,30B传数据,D信道传送信令, E1都是CAS结构,叫带内信令,PRI信令与数据分开传送,即带外信令。
    5. CE1可否接E1。
      答:CE1 和E1 当然可以互联。但CE1必需当E1用,即不可分时隙使用。
    6. 为实现利用CE1实现一点对多点互连,此时中心肯定是2M了,各分支速率是N*64K<2M,分支物理上怎么接呢? 电信如何控制电路的上下和分开不同地点呢?
      答:在你设备上划分时隙,然到在电信的节点上也划分一样同样的时隙顺序,电信 只需要按照你提供的时隙顺序和分支地点,将每个对应的时隙用DDN线路传到对应 分支点就行了。
    7. CE1端口能否直接连接E1电缆,与对端路由器的E1端口连通
      答:不行
    8. Cisco 7000系列上的ME1与Cisco 2600/3600上的E1、 CE1有什么区别?
      答:Cisco 7000上的ME1可配置为E1、 CE1, 而Cisco 2600/3600上的E1、CE1仅支持自己的功能。
    9. 非平衡与平衡到底有何区别?
      答: 主要是电气上的区别,平衡是指两条输出端信号全部输出,是120欧姆 ;非平衡的两条输出端信号只有一条输出,而另一条则接地。是75欧姆
      非平衡:该电缆在路由器端为DB-15(公)连接器,在网络端是BNC头
      平衡:该电缆在路由器端为DB-15(公)连接器,在网络端是RJ-45连接器

      补充-光端机用法:

      光纤---光端机--同轴线---G703转v35转换器--同步串口

      BNC-DB15,BNC-RJ45 --- CE1

      CE1/PRI Cables

      Cisco Systems makes four cables for the CE1/PRI modules. All four have DB-15 connectors on the CE1/PRI end and either BNC, DB-15, Twinax, or RJ-45 connectors on the network end. 

      下列各图显示了 CE1/PRI 的接口线缆:

      图1. E1 Interface Cable for 75-Ohm, Unbalanced Connections with BNC Connectors

      图2. E1 Interface Cable for 120-Ohm, Balanced Connections with DB-15 Connectors

      图3. E1 Interface Cable for 120-Ohm, Balanced Connections with Twinax Connectors

      图4. E1 Interface Cable for 120-Ohm, Balanced Connections with an RJ-45 Connector

    ##################################

    文完。。。概念性的东西还是需要经常记,在实际中多了才不会忘三不知时被问一句,恼火。

    mysql查看状态及简单优化--postfix搭建ing顺道

    使用show status命令
    含义如下:
    aborted_clients 客户端非法中断连接次数
    aborted_connects 连接mysql失败次数
    com_xxx xxx命令执行次数,有很多条
    connections 连接mysql的数量
    Created_tmp_disk_tables 在磁盘上创建的临时表
    Created_tmp_tables 在内存里创建的临时表
    Created_tmp_files 临时文件数
    Key_read_requests The number of requests to read a key block from the cache
    Key_reads The number of physical reads of a key block from disk
    Max_used_connections 同时使用的连接数
    Open_tables 开放的表
    Open_files 开放的文件
    Opened_tables 打开的表
    Questions 提交到server的查询数
    Sort_merge_passes 如果这个值很大,应该增加my.cnf中的sort_buffer值
    Uptime 服务器已经工作的秒数
    提升性能的建议:
    1.如果opened_tables太大,应该把my.cnf中的table_cache变大
    2.如果Key_reads太大,则应该把my.cnf中key_buffer_size变大.可以用Key_reads/Key_read_requests计算出cache失败率
    3.如果Handler_read_rnd太大,则你写的SQL语句里很多查询都是要扫描整个表,而没有发挥索引的键的作用
    4.如果Threads_created太大,就要增加my.cnf中thread_cache_size的值.可以用Threads_created/Connections计算cache命中率
    5.如果Created_tmp_disk_tables太大,就要增加my.cnf中tmp_table_size的值,用基于内存的临时表代替基于磁盘的

    RHEL4+Kickstart+NFS+DHCP+PXE全自动无人安装--试验完成

    环境:HP580DL*11台,服务器及客户端:RHEL4.6

    因为是DVD版的ISO,mount没有原文复杂,我直接解压到/data/system下。

    按照原文流程走下去是没有任何问题的,只用稍微改一下IP地址,网段啥的,配置出来直接可以使用。

    但是原文最后说:“准备一台客户端,然后更改启动方式为通过带PXE自启动模块的网卡启动,客户端在开启之后会主动向DHCP服务器获取地址,并且从TFTP服务器上获得安装配置以及信息;客户端所做的工作只是开机,剩下的工作由ks.cfg文件控制自动完成。”

    这个我这边第一台安装的时候是有点问题的,启动的时候需要选择eth0还是eth1,选择网卡之后后面的所有配置、安装全部不用管了,直接见到:

    localhost login:

    不知道是不是双网卡哪儿需要改动一下,或者是都要这样。

    #######################################

    原帖,CU上的精华,(http://linux.chinaunix.net/bbs/thread-1008703-1-1.html),原帖后面还有其他几个版本的配置文件,先转一下原文:

    实验环境:C/S结构,服务器采用的操作系统为RHEL 4.0,客户端预装RHEL 4.0。
    服务器上的配置如下:
    第一步:配置安装树:
    在虚拟机中添加新的硬盘,并且实现开机之后的自动挂载。
    这个步骤在以前已经总结过,所以在这里我只给出完成之后的结果:
    我在虚拟机中添加的为SCSI硬盘,分区格式化之后的文件为/dev/sda1,编辑/etc/fstab文件,将该分区自动挂载于/installing文件夹下,并且在该文件夹下建立目录/var/ftp/pub,那么配置的安装树就在/installing/var/ftp/pub目录下。
    挂载第一张光盘:
    [root@server1 ~]# mount /media/cdrom
    [root@server1 cdrom]# alias cp=cp                使cp命令在执行的时候直接覆盖已经存在内容而不询问
    [root@server1 cdrom]# cp -dpR * /installing/var/ftp/pub/        拷贝第一张光盘内容到目标
    挂载第二张光盘:
    [root@server1 cdrom]# cp -dpR * /installing/var/ftp/pub/RedHat/RPMS        将所有的安装包集中到一起
    按照同样的方法挂载并拷贝第三张和第四张光盘的内容
    重启动系统进行检测。
    第二步:配置kickstart无人值守安装脚本:
    需要安装kickstart工具包:
    [root@server1 ~]# cd /installing/var/ftp/pub/RedHat/RPMS/
    [root@server1 RPMS]# ls *kickstart*
    system-config-kickstart-2.5.16-2.noarch.rpm
    [root@server1 RPMS]# rpm -ihv system-config-kickstart-2.5.16-2.noarch.rpm --aid
    warning: system-config-kickstart-2.5.16-2.noarch.rpm: V3 DSA signature: NOKEY, key ID db42a60e
    Preparing...                ########################################### [100%]
         1:system-config-kickstart########################################### [100%]
    进入图形界面运行system-config-kickstart命令按照提示进行无人值守脚本配置
    *选择的安装方式是通过NFS网络文件系统安装;
    *选择的分区方法是不管客户机磁盘多大,都分三个必须分区,并指定分区的大小,剩余空间备用;
    *选择的数据包不能包含图形界面开发工具或者开发工具,否则安装过程中会报错
    将生成的ks.cfg文件拷贝到安装树所在路径下/installing/var/ftp/pub
    第三步:配置服务器的服务:
    1.配置DHCP服务:
    从安装树中安装DHCP服务的软件包:
    [root@server1 ~]# cd /installing/var/ftp/pub/RedHat/RPMS/
    [root@server1 RPMS]# ls *dhcp*
    dhcp-3.0.1-12_EL.i386.rpm        dhcpv6-0.10-8.i386.rpm
    dhcp-devel-3.0.1-12_EL.i386.rpm  dhcpv6_client-0.10-8.i386.rpm
    [root@server1 RPMS]# rpm -ihv dhcp-3.0.1-12_EL.i386.rpm dhcp-devel-3.0.1-12_EL.i386.rpm –aid
    配置DHCP服务:
    [root@server1 ~]# cp /usr/share/doc/dhcp-3.0.1/dhcpd.conf.sample /etc/dhcpd.conf
    [root@server1 ~]# vi /etc/dhcpd.conf
    我的服务器IP地址为192.168.1.170,所以该配置文件的内容如下:
    红色的地方为我修改或者需要注意的地方
    ddns-update-style interim;
    ignore client-updates;
    subnet 192.168.1.0 netmask 255.255.255.0 {
    # --- default gateway
            option routers                  192.168.1.170;
            option subnet-mask              255.255.255.0;
            option nis-domain               "RHCE";
            option domain-name              "example.com";
            option domain-name-servers      192.168.1.170;
            option time-offset              -18000; # Eastern Standard Time
    #       option ntp-servers              192.168.1.170;
    #       option netbios-name-servers     192.168.1.170;
    # --- Selects point-to-point node (default is hybrid). Don't change this unless
    # -- you understand Netbios very well
    #       option netbios-node-type 2;
            range dynamic-bootp 192.168.1.128 192.168.1.254;
            default-lease-time 21600;
            max-lease-time 43200;
            filename "/pxelinux.0";
            # we want the nameserver to appear at a fixed address
            host ns {
                    next-server marvin.redhat.com;
                    hardware ethernet 12:34:56:78:AB:CD;
                    fixed-address 207.175.42.254;
    保存并且退出,其中NTP服务器、NIS服务器、以及NETBIOS服务器并不是必须,但是一定要注意后面手动添加的一行:filename "/pxelinux.0";
    完成之后启动服务:
    # service dhcpd restart       
    在客户端启动之后通过查看文件/var/lib/dhcp/dhcpd.leases可以得知客户端是否正常获得IP地址
    2.配置DNS服务:
    按照刚才DHCP配置文件中的内容去配置DNS即可,这个步骤不是必须;
    3.配置TFTP服务:
    这种安装的原理是客户端启动之后通过TFTP服务器获得配置文件信息和安装信息,因此需要开启TFTP服务。
    # vi /etc/xi        net.d/tftp
    TFTP服务为非独立服务,更改其中的内容如下:
    # default: off
    # description: The tftp server serves files using the trivial file transfer \
    #       protocol.  The tftp protocol is often used to boot diskless \
    #       workstations, download configuration files to network-aware printers, \
    #       and to start the installation process for some operating systems.
    service tftp
    {
            disable = no
            socket_type             = dgram
            protocol                = udp
            wait                    = yes
            user                    = root
            server                  = /usr/sbin/in.tftpd
            server_args             = -s /tftpboot
            per_source              = 11
            cps                     = 100 2
            flags                   = IPv4
    }
    之后重启TFTP服务:/etc/rc.d/init.d/xinetd restart或者干脆chkconfig tftp on即可
    4.配置NFS服务:
    # vi /etc/exports
    添加安装树的路径:
    /installing/var/ftp/pub    192.1681.0/24(ro,async)
    保存退出
    # service portmap restart
    # service nfs restart
    # exportfs –rv        
    # showmount –e
    # chkconfig nfs on
    出现下面内容即可:
    /installing/var/ftp/pub 192.168.1.0/24
    5.配置支持PXE启动:
    # mkdir /tftp                ————>若该文件夹已经存在则不用建立
    # cp /usr/lib/syslinux/pxelinux.0 /tftpboot
    把Linux第一张安装光盘上/image/pxeboot/initrd.img和vmlinux 以及isolinux/*.msg拷贝到/tftpboot目录下
    # cd /tftpboot
    # mkdir pxelinux.cfg
    # cd pxelinux.cfg
    # vi default
    配置文件default文件的内容如下:
    default
    prompt 1
    timeout 30
    display boot.msg
    F1 boot.msg
    F2 options.msg
    F3 general.msg
    F4 param.msg
    F5 rescue.msg
    F7 snake.msg
    label local
    localboot 0
    label linux
    kernel vmlinuz
    append initrd=initrd.img devfs=nomount ramdisk_size=9216
    label text
    kernel vmlinuz
    append initrd=initrd.img text devfs=nomount ramdisk_size=9216
    label expert
    kernel vmlinuz
    append expert initrd=initrd.img devfs=nomount ramdisk_size=9216
    label ks
    kernel vmlinuz
    append ks initrd=initrd.img devfs=nomount ramdisk_size=9216
    label nofb
    kernel vmlinuz
    append initrd=initrd.img devfs=nomount nofb ramdisk_size=9216
    label lowres
    kernel vmlinuz
    append initrd=initrd.img lowres devfs=nomount ramdisk_size=9216
    kernel vmlinuz
    如果我们执行的是远程手动安装,这个配置文件就足够了。但是我们执行的是远程无人值守安装,所以还需要对该配置文件进行一定修改,主要在配置文件中添加内容,指定ks.cfg配置文件的位置。
    因此经过编辑,最终配置文件的内容如下:
    default linux
    prompt 1
    timeout 30
    display boot.msg
    F1 boot.msg
    F2 options.msg
    F3 general.msg
    F4 param.msg
    F5 rescue.msg
    F7 snake.msg
    label local
    localboot 0
    label linux
    kernel vmlinuz
    append ks=nfs:192.168.1.170:/installing/var/ftp/pub/ks.cfg  initrd=initrd.img  devfs=nomount 
    ramdisk_size=9216
    label text
    kernel vmlinuz
    append initrd=initrd.img text devfs=nomount ramdisk_size=9216
    label expert
    kernel vmlinuz
    append expert initrd=initrd.img devfs=nomount ramdisk_size=9216
    label ks
    kernel vmlinuz
    append ks initrd=initrd.img devfs=nomount ramdisk_size=9216
    label nofb
    kernel vmlinuz
    append initrd=initrd.img devfs=nomount nofb ramdisk_size=9216
    label lowres
    kernel vmlinuz
    append initrd=initrd.img lowres devfs=nomount ramdisk_size=9216
    kernel vmlinuz
    添加的为红色标注的部分,并且要注意,必须添加在这个位置。而且存储ks.cfg的目录必须是通过NFS共享出来的目录。
    完成所有的服务配置之后进行检查。
    准备一台客户端,然后更改启动方式为通过带PXE自启动模块的网卡启动,客户端在开启之后会主动向DHCP服务器获取地址,并且从TFTP服务器上获得安装配置以及信息;客户端所做的工作只是开机,剩下的工作由ks.cfg文件控制自动完成。

    #######################################

    感谢jerrywjl帅哥。

    openvpn的小问题

    昨天建账号,遇到了:

    failed to update database
    TXT_DB error number 2

    怪异,开始以为是sshd升级造成的,准备重新编译,但是觉得又不像,可能是配置问题,搜之,

    grid-ca-sign命令
    grid-ca-sign命令一般是安装ca中心的用户用来签署证书的命令,一般命令是
        "grid-ca-sign -in usercert_request.pem -out usercert.pem"
    在GT中,一般由globus用户签署证书,不会出现错误。但当同一个普通用户申请的多次申请的证书需要被签署的时候,会出现如下错误:
    ========== ERROR MESSAGES FROM OPENSSL ==========
    Using configuration from /home/globus/.globus/simpleCA//grid-ca-ssl.conf
    DEBUG[load_index]: unique_subject = "yes"
    Check that the request matches the signature
    Signature ok
    The Subject's Distinguished Name is as follows
    organizationName      :PRINTABLE:'Grid'
    organizationalUnitName:PRINTABLE:'GlobusTest'
    organizationalUnitName:PRINTABLE:'simpleCA-x1.nust.edu'
    organizationalUnitName:PRINTABLE:'nust.edu'
    commonName            :PRINTABLE:'icewind'
    Certificate is to be certified until May 17 14:18:23 2006 GMT (365 days)
    failed to update database
    TXT_DB error number 2
    =================================================
    造成错误的原因是该用户的证书已经被签署过,在ca中心的TXT_DB中已经存在,重新签署时出现update database 错误。
    如果该用户的证书确实被丢失需要重新签发,那么修改的方法是,编辑 openvpn/keys/index.txt 文件,找到与待签署的certificate subject (Subject's Distinguished Name) 相同的那一行,删除之即可。

    F5负载均衡器简明配置手册(转)

          今天在值班的时候突然接到电话,说要更改F5的一个配置,结果登陆到F5的web界面上,突然觉得这些东西都超级陌生了,呵呵,技术这个东西看来确实是需要经常的练习的啊,虽然没有要求我们专业的维护,但是对于一个运维人员来说,基本的操作应该要会的吧,找到一篇简单的基于ssh的说明,温故一下。

    F5负载均衡器简明配置手册

    负载均衡器通常称为四层交换机或七层交换机。四层交换机主要分析IP层及TCP/UDP层,实现四层流量负载均衡。七层交换机除了支持四层负载均衡以外,还有分析应用层的信息,如HTTP协议URI或Cookie信息。
    一、F5配置步骤:
    1、F5组网规划
    (1)组网拓朴图(具体到网络设备物理端口的分配和连接,服务器网卡的分配与连接)
    (2)IP地址的分配(具体到网络设备和服务器网卡的IP地址的分配)
    (3)F5上业务的VIP、成员池、节点、负载均衡算法、策略保持方法的确定
    2、F5配置前的准备工作
    (1)版本检查
    f5-portal-1:~# b version
    Kernel:
    BIG-IP Kernel 4.5PTF-07 Build18
    (2)时间检查--如不正确,请到单用户模式下进行修改
    f5-portal-1:~# date
    Thu May 20 15:05:10 CST 2004
    (3)申请license--现场用的F5都需要自己到F5网站上申请license
    3、F5 的通用配置
    (1)在安全要求允许的情况下,在setup菜单中可以打开telnet及ftp功能,便于以后方便维护
    (2)配置vlan unique_mac选项,此选项是保证F5上不同的vlan 的MAC地址不一样。在缺省情况下,F5的各个vlan的MAC地址是一样的,建议在配置时,把此项统一选择上。可用命令ifconfig –a来较验
    具体是system/Advanced Properties/vlan unique_mac
    (3)配置snat any_ip选项选项,此选项为了保证内网的机器做了snat后,可以对ping的数据流作转换。Ping是第三层的数据包,缺省情况下F5是不对ping的数据包作转换,也就是internal vlan的主机无法ping external vlan的机器。(注意:还可以采用telnet来验证。)
    具体是system/Advanced Properties/snat any_ip
    4、F5 的初始化配置
    建议在对F5进行初始时都用命令行方式来进行初始化(用Web页面初始化的方式有时会有问题)。登录到命令行上,运行config或setup命令可以进行初始化配置。初次运行时会提示一些license的信息。
    default:~# config
    5、F5双机切换监控配置(有F5双机时需要)
    (1)在web页面中选择相应的vlan,在arm failsafe选择则可。Timeout为从F5收不到包的时间起,经过多长时间就发生切换。此配置不能同步,需要在F5的主备机上同时配置。每个vlan都可以配置vlan arm failsafe。
    具体在Network下
    (2)在web页面中选择system,在redundant properties中把gateway failsafe选择则可。Router是需要监控的地址。此配置不能同步,需要在F5的主备机上同时配置。一套F5上只能配置一个gateway failsafe
    具体在system/redundant properties/gateway failsafe
    6、F5 MAC masquerade配置
    Mac Masquerading是F5的Shared IP Address (Floating)的MAC地址,F5如果不配置此项,则shared IP Address的MAC地址与每台F5的vlan self IP Address的MAC地址是一样的。
    一般服务器是以shared IP Address为网关,在两台F5上都配置了Mac Masquerade(相同的MAC地址),这样当F5发生切换后,服务器上shared IP address的MAC不变,保证了业务的不中断
    具体在Network下
    7、F5的pool配置
    (1)在配置工具Web页面的导航面板中选择“Pools”中的“Pools”标签,点击“ADD”按钮添加服务器池(Pool)。
    (2)在池属性(Pool Properties)中的“Load Balancing Method”表格中选择负载均衡策略,通常采用默认策略:“Round Robin”
    (3)在“Resouces”表格中的“Member Address”文本框输入成员IP地址,在“Service”文本框中输入服务端口,点击“>>”添加到“Current Members”当前成员列表中。
    (4)添加所有组成员,点击“Done”完成配置。
    (5)在“Pools”中的“Pool Name”列选中特定池,然后池属性页面中选择“Persistence”标签。
    (6)在“Persistence Type”表格中选定会话保持类型。点击“Apply”应用配置。
    8、F5的virtual server配置
    (1)在配置工具Web页面的导航面板中选择“Virtual Servers”中的“Virtual Servers”标签,点击“ADD”按钮添加虚拟服务器。
    (2)在“Add Virtual Server”窗口的“Address”文本框中输入虚拟服务器IP地址,并在“Service”文本框中输入服务端口号或在下拉框中选择现有的服务名称,点击“Next”执行下一步。
    (3)在“Add Virtual Server”窗口的“Configure Basic Properties”页面中点击“Next”执行下一步。 在“Add Virtual Server”窗口的“Select Physical Resources”页面中点击单选按钮“Pool”,并在下拉框中选择虚拟服务器对应的负载均衡池。
    (4)按“Done”完成创建虚拟服务器。
    9、F5的monitor的配置
    (1)在配置工具Web页面的导航面板中选择“Monitor”中的“Monitors”标签,点击“ADD”按钮添加监控
    (2)根据需要选择相关关联类型:“Node Associations”标签、Node Address Associations”标签、Service Associations”标签。
    (3)被选关联标签中,在“Choose Monitor”表格中选择监控名称,点击“>>”按钮添加到“Monitor Rule”监控规格文本框中。监控规则可以为一条或多条。
    (4)选择监控规则后,在对应节点的“Associate Current Monitor Rule”复选框中选中。如果欲删除监控关联,则选中对应节点的“Delete Existing Assocation”复选框。
    (5)点击“Apply”关联监控
    10、F5的SNAT配置
    (1)在配置工具Web页面的导航面板中选择“NATs”中的“SNATs”标签,点击“ADD”按钮添加SNAT地址。
    (2)在“Add SNAT”窗口中“Translation Address”的“IP”文本框中输入SNAT IP地址,并在“Origin List”的“Origin Address”文本框中输入节点IP地址或在“Origin VLAN”下拉框中选择VLAN名称,点击“>>”加入“Current List”列表。
    (3)按“Done”完成添加SNAT IP地址。
    11、F5主备机同步及切换校验
    具体在system/Redundant Properties/synchonize Config...
    12、业务的校验
    F5主备机切换的校验
    F5主备机业务运行的校验
    其中1~6是基本配置,7~10业务配置,11~12校验
    二、F5负载均衡器的维护
    1、F5节点及应用的检查
    通过“System -> Network Map”页面查看节点及应用状态
    绿色:节点或虚拟服务器为“UP”
    红色:节点或虚拟服务器状态为“Down”
    灰色:节点或虚拟服务器被禁用
    2、日志的检查
    (1)当天日志:从web上查看logs中的system log、bigip log、monitor log,看日志中是否有异常。
    (2)7天内的日志
    系统日志文件 - /var/log/messages消息, 系统消息
    BIG-IP 日志文件 - /var/log/bigip
    “External” BIG-IP events
    Monitor 日志文件 - /var/log/bigd
    “Internal” BIG-IP Events
    3DNS 日志文件 - /var/log/3dns
    3DNS Information
    用gzcat、more、vi命令打开
    3、F5流量的检查
    (1)业务上的基本维护主要是在F5上查看F5分发到各节点的connect是否负载均衡,一般不应有数量级的差别
    (2)通过WEB->pool-> pool statistics中查看connection项中的total和current项,不应有明显的数量级的差别
    (3)F5 qkview命令
    执行qkview,执行完成后将输出信息保存在文件“/var/tmp/-tech.out”中,供高级技术支持用
    (4)F5 tcpdump命令
    TCPDUMP是Unix系统常用的报文分析工具,TCPDUMP经常用于故障定位,如会话保持失效、SNAT通信问题等
    tcpdump [ -adeflnNOpqRStvxX ] [ -c count ] [ -F file ]
    [ -i interface ] [ -m module ] [ -r file ]
    [ -s snaplen ] [ -T type ] [ -w file ]
    [ -E algo:secret ] [ expression ]

    openvpn小bug

    今天终于又一次证实了openvpn的一个小bug,不知道算不算bug,也还没来得及慢慢去研究文档。

    现象:openvpn拨上之后连接,取地址完全正常,能连接到内网服务器,但是只要一进行有包交换的动作,VPN马上开始闪断,Windows下面的客户端会会绿黄交替。表明:VPN断了。

    开始一直以为是服务端,客户端,服务器,网络哪儿有问题,但是随着机器的渐渐增多,发现了这个问题出现在IBMR51、IBMT60、(但是笔记本用无线网卡的话是可以连接,不会有任何的中断)以及公司新购置的DELL 740上面,已经大概知道:千M网卡的问题

    DELL 740解决办法:安装独立网卡。--问题结局。

    昨天同事新购置了IBMT61,今天安装了Openvpn,果然,一开始做操作,马上黄了。

    结论:千M网卡在用openvpn-2.0.7.tar.gz这个openvpn,客户端在OpenVpn Gui v1.0.3的时候会出现以上状况--未有更好的解决办法。

    有高手知道问题原因的和能解决的请赐教MSN:sio1201@hotmail.com,或在此留言。多谢。

    介绍一篇关于session的好文章,写的很详细(收藏)

    目录:
    一、术语session
    二、HTTP协议与状态保持
    三、理解cookie机制
    四、理解session机制
    五、理解javax.servlet.http.HttpSession
    六、HttpSession常见问题
    七、跨应用程序的session共享
    八、总结
    参考文档

    一、术语session
    在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的。

    session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间 ①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差别只能靠上下文来推断②。

    然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义, “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者 “一个POP3 session”③。

    而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session 里”⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。

    鉴于这种混乱已不可改变,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。
    在本文中,使用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表达含义⑤,使用具体的“HttpSession”来表达含义⑥

    二、HTTP协议与状态保持
    HTTP 协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样。

    然而聪明(或者贪心?)的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、 cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。

    让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:
    1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
    2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。
    3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。

    由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。

    三、理解cookie机制
    cookie机制的基本原理就如上面的例子一样简单,但是还有几个问题需要解决:“会员卡”如何分发;“会员卡”的内容;以及客户如何使用“会员卡”。

    正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。

    而cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。

    cookie的内容主要包括:名字,值,过期时间,路径和域。
    其中域可以指定某一个域比如.google.com,相当于总店招牌,比如宝洁公司,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com,可以用飘柔来做比。
    路径就是跟在域名后面的URL路径,比如/或者/foo等等,可以用某飘柔专柜做比。
    路径与域合在一起就构成了cookie的作用范围。
    如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。

    存储在硬盘上的cookie 可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按 Ctrl-N(或者从文件菜单)打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于 Mozilla Firefox0.8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。

    下面就是一个goolge设置cookie的响应头的例子
    HTTP/1.1 302 Found
    Location: http://www.google.com/intl/zh-CN/
    Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
    Content-Type: text/html

    这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分

    浏览器在再次访问goolge的资源时自动向外发送cookie

    使用Firefox可以很容易的观察现有的cookie的值
    使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。

    IE也可以设置在接受cookie前询问

    这是一个询问接受cookie的对话框。

    四、理解session机制
    session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

    当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。

    保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。

    由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
    另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
    这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。
    为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

    另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单
    <form name="testform" action="/xxx">
    <input type="text">
    </form>
    在被传递给客户端之前将被改写成
    <form name="testform" action="/xxx">
    <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
    <input type="text">
    </form>
    这种技术现在已较少应用,笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。
    实际上这种技术可以简单的用对action应用URL重写来代替。

    在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。

    恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

    五、理解javax.servlet.http.HttpSession
    HttpSession是Java平台对session机制的实现规范,因为它仅仅是个接口,具体到每个web应用服务器的提供商,除了对规范支持之外,仍然会有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作为例子来演示。

    首先,Weblogic Server提供了一系列的参数来控制它的HttpSession的实现,包括使用cookie的开关选项,使用URL重写的开关选项,session持久化的设置,session失效时间的设置,以及针对cookie的各种设置,比如设置cookie的名字、路径、域, cookie的生存时间等。

    一般情况下,session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存到硬盘上,当服务器进程重新启动或这些信息将能够被再次使用, Weblogic Server支持的持久性方式包括文件、数据库、客户端cookie保存和复制。

    复制严格说来不算持久化保存,因为session实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进程中,这样即使某个服务器进程停止工作也仍然可以从其他进程中取得session。

    cookie生存时间的设置则会影响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解。

    cookie的路径对于web应用程序来说是一个非常重要的选项,Weblogic Server对这个选项的默认处理方式使得它与其他服务器有明显的区别。后面我们会专题讨论。

    关于session的设置参考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869

    六、HttpSession常见问题
    (在本小节中session的含义为⑤和⑥的混合)

    1、session在何时被创建
    一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。

    由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。

    2、session何时被删除
    综合前面的讨论,session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)

    3、如何做到在浏览器关闭时删除session
    严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。

    4、有个HttpSessionListener是怎么回事
    你可以创建这样的listener去监控session的创建和销毁事件,使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销毁动作触发listener,而不是相反。类似的与HttpSession有关的listener还有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。

    5、存放在session中的对象必须是可序列化的吗
    不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果 session中有不可序列化的对象,在session销毁时会有一个Exception,很奇怪。

    6、如何才能正确的应付客户端禁止cookie的可能性
    对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL,具体做法参见[6]
    http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770

    7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session
    参见第三小节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。

    8、如何防止用户打开两个浏览器窗口操作导致的session混乱
    这个问题与防止表单多次提交是类似的,可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端,同时保存在session里,客户端提交表单时必须把这个id也返回服务器,程序首先比较返回的id与保存在session里的值是否一致,如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口,一般不设置这个id,或者使用单独的id,以防主窗口无法操作,建议不要再window.open打开的窗口里做修改操作,这样就可以不用设置。

    9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setValue
    做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变,需要向其他服务器进程复制新的session值。

    10、为什么session不见了
    排除session正常失效的因素之外,服务器本身的可能性应该是微乎其微的,虽然笔者在iPlanet6SP1加若干补丁的Solaris版本上倒也遇到过;浏览器插件的可能性次之,笔者也遇到过3721插件造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题。
    出现这一问题的大部分原因都是程序的错误,最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨论这个问题。

    七、跨应用程序的session共享

    常常有这样的情况,一个大项目被分割成若干小项目开发,为了能够互不干扰,要求每个小项目作为一个单独的web应用程序开发,可是到了最后突然发现某几个小项目之间需要共享一些信息,或者想使用session来实现SSO(single sign on),在session中保存login的用户信息,最自然的要求是应用程序间能够访问彼此的session。

    然而按照Servlet规范,session的作用范围应该仅仅限于当前应用程序下,不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范,但是实现的细节却可能各有不同,因此解决跨应用程序session共享的方法也各不相同。

    首先来看一下Tomcat是如何实现web应用程序之间session的隔离的,从 Tomcat设置的cookie路径来看,它对不同的应用程序设置的cookie路径是不同的,这样不同的应用程序所用的session id是不同的,因此即使在同一个浏览器窗口里访问不同的应用程序,发送给服务器的session id也可以是不同的。

    根据这个特性,我们可以推测Tomcat中session的内存结构大致如下。

    笔者以前用过的iPlanet也采用的是同样的方式,估计SunONE与iPlanet之间不会有太大的差别。对于这种方式的服务器,解决的思路很简单,实际实行起来也不难。要么让所有的应用程序共享一个session id,要么让应用程序能够获得其他应用程序的session id。

    iPlanet中有一种很简单的方法来实现共享一个session id,那就是把各个应用程序的cookie路径都设为/(实际上应该是/NASApp,对于应用程序来讲它的作用相当于根)。
    <session-info>
    <path>/NASApp</path>
    </session-info>

    需要注意的是,操作共享的session应该遵循一些编程约定,比如在session attribute名字的前面加上应用程序的前缀,使得 setAttribute("name", "neo")变成setAttribute("app1.name", "neo"),以防止命名空间冲突,导致互相覆盖。

    在Tomcat中则没有这么方便的选择。在Tomcat版本3上,我们还可以有一些手段来共享session。对于版本4以上的Tomcat,目前笔者尚未发现简单的办法。只能借助于第三方的力量,比如使用文件、数据库、JMS或者客户端cookie,URL参数或者隐藏字段等手段。

    我们再看一下Weblogic Server是如何处理session的。 

    从截屏画面上可以看到Weblogic Server对所有的应用程序设置的cookie的路径都是/,这是不是意味着在Weblogic Server中默认的就可以共享session了呢?然而一个小实验即可证明即使不同的应用程序使用的是同一个session,各个应用程序仍然只能访问自己所设置的那些属性。这说明Weblogic Server中的session的内存结构可能如下

    对于这样一种结构,在 session机制本身上来解决session共享的问题应该是不可能的了。除了借助于第三方的力量,比如使用文件、数据库、JMS或者客户端 cookie,URL参数或者隐藏字段等手段,还有一种较为方便的做法,就是把一个应用程序的session放到ServletContext中,这样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下,

    应用程序A
    context.setAttribute("appA", session);

    应用程序B
    contextA = context.getContext("/appA");
    HttpSession sessionA = (HttpSession)contextA.getAttribute("appA");

    值得注意的是这种用法不可移植,因为根据ServletContext的JavaDoc,应用服务器可以处于安全的原因对于context.getContext("/appA");返回空值,以上做法在Weblogic Server 8.1中通过。

    那么Weblogic Server为什么要把所有的应用程序的cookie路径都设为/呢?原来是为了SSO,凡是共享这个session的应用程序都可以共享认证的信息。一个简单的实验就可以证明这一点,修改首先登录的那个应用程序的描述符weblogic.xml,把cookie路径修改为/appA 访问另外一个应用程序会重新要求登录,即使是反过来,先访问cookie路径为/的应用程序,再访问修改过路径的这个,虽然不再提示登录,但是登录的用户信息也会丢失。注意做这个实验时认证方式应该使用FORM,因为浏览器和web服务器对basic认证方式有其他的处理方式,第二次请求的认证不是通过 session来实现的。具体请参看[7] secion 14.8 Authorization,你可以修改所附的示例程序来做这些试验。

    八、总结
    session机制本身并不复杂,然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器,服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析。
    摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答。

    IP地址子网掩码位数换算方法

    记得之前很长一段时间都不会算这玩意儿,很实用的文章,备用。多给自己出点题,多算2次就OK了。

    IP地址子网掩码:
    子网位    /主机位         子网掩码           子网最大数       /主机最大数
    2         /22         /10 | 255.192.0.0           2           /4194302
    3         /21         /11 | 255.224.0.0           6           /2097150
    4         /20         /12 | 255.240.0.0           14          /1048574
    5         /19         /13 | 255.248.0.0           30          /524286
    6         /18         /14 | 255.252.0.0           62          /262142
    7         /17         /15 | 255.254.0.0           126         /131070
    8         /16         /16 | 255.255.0.0           254         /65536
    9         /15         /17 | 255.255.128.0         510         /32766
    10        /14         /18 | 255.255.192.0         1022        /16382
    11        /13         /19 | 255.255.224.0         2046        /8190
    12        /12         /20 | 255.255.240.0         4094        /4094
    13        /11         /21 | 255.255.248.0         8190        /2046
    14        /10         /22 | 255.255.252.0         16382       /1022
    15        /9          /23 | 255.255.254.0         32766       /510
    16        /8          /24 | 255.255.255.0         65536       /254
    17        /7          /25 | 255.255.255.128       131070      /126
    18        /6          /26 | 255.255.255.192       262142      /62
    19        /5          /27 | 255.255.255.224       524286      /30
    20        /4          /28 | 255.255.255.240       1048574     /14
    21        /3          /29 | 255.255.255.248       2097150     /6
    22        /2          /30 | 255.255.255.252       4194302     /2

    子网掩码的快速算法     

    大家都应该知道2的0次方到10次方是多少把?也给大家说一下,分别是:
      1 2 4 8 16 32 64 128 256 512 1024。
      如果你希望每个子网中只有5个ip地址可以给机器用,那么你就最少需要准备给每个子网7个ip地址,因为需要加上两头的不可用的网络和广播ip,所以你需要选比7多的最近的那位,也就是8,就是说选每个子网8个ip。好,到这一步,你就可以算掩码了,这个方法就是:最后一位掩码就是256减去你每个子网所需要的ip地址的数量,那么这个例子就是256-8=248,那么算出这个,你就可以知道那些ip是不能用的了,看:0-7,8-15,16-23,24-31依此类推,写在上面的0、7、8、15、16、23、24、31(依此类推)都是不能用的,你应该用某两个数字之间的IP,那个就是一个子网可用的IP,怎么了?是不是不相信?太简单了。
      我再试验一下,就拿200台机器分成4个子网来做例子吧。
      200台机器,4个子网,那么就是每个子网50台机器,设定为192.168.10.0,C类的IP,大子网掩码应为255.255.255.0,对巴,但是我们要分子网,所以按照上面的,我们用32个IP一个子网内不够,应该每个子网用64个IP(其中 62位可用,足够了吧),然后用我的办法:子网掩码应该是256-64=192,那么总的子网掩码应该为:255.255.255.192。不相信?算算:0-63,64-127,128-191,192-255,这样你就可以把四个区域分别设定到四个子网的机器上了,是不是很简单?不需要软件算了吧。

    /24就是255.255.255.0~子网掩码哦。

    一个10进制的255~就是2进制的8个1

    三个255.255.255`就是24个1~所以写24

    比如我ip是:218.77.26.114/255.255.255.192应该怎么换算成缩略子网掩码方式 

    255.255.255.192 换算成二进制:
    11111111.11111111.11111111.11000000

    前三组都是8bit, 第四组 192 -> 11000000 表示2bit (左起11) 用做subnet(子网)
    那末这个子网掩码中共有8+8+8+2 = 26 bit 是用作网络标识。

    结果:
    218.77.26.144/255.255.255.192 => 218.77.26.144/26

    HA-http 配置、测试通过(存档自留)

    HA-http 测试

    2台HP585
    第一块网卡接交换机,第二块网卡为直连
    ha:192.168.1.70
    ha-1:
    eth0:192.168.1.71
    eth1:10.25.0.1
    ha-2:
    eth0:192.168.1.72
    eth1:10.25.0.2

    环境:
    RH4.6
    ipvsadm-1.24.tar.gz
    libnet.tar                           下载地址:http://www.packetfactory.net/libnet/  稳定版本是:1.1.2.1
    e2fsprogs                            4.6系统自带
    heartbeat-2.0.2.tar.gz   http://linux-ha.org/download/heartbeat-2.0.2.tar.gz

    配置过程:
    make install完3个包之后
    cp ha.cf haresources authkeys /etc/ha.d/
    cp /contrib/ipfail /usr/lib/heartbeat/
    groupadd -g 694 haclient
    useradd -u 694 -g haclient hacluster

    主要配置文件
    vi /etc/hosts
    vi /etc/sysconfig/network
    vi /var/www/html/index.html
    vi /etc/ha.d/ha.cf
    vi /etc/ha.d/haresources
    vi /etc/ha.d/authkeys
    开始:

    vi /etc/hosts
    127.0.0.1       localhost.localdomain   localhost
    192.168.1.71    HA-1
    192.168.1.72    HA-2

    vi /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=HA-1(2)

    vi /var/www/html/index.html

    vi /etc/ha.d/ha.cf
    logfile /var/log/ha-log
    logfacility     local0
    keepalive 2
    deadtime 30
    warntime 10
    initdead 120
    udpport 694
    baud    19200
    serial  /dev/ttyS0      # Linux
    bcast   eth1            # Linux
    mcast eth0 225.0.0.1 694 1 0
    auto_failback on
    node    HA-1
    node    HA-2
    ping_group group1 192.168.1.71 192.168.1.72
    respawn root /usr/lib/heartbeat/ipfail
    apiauth ipfail gid=root uid=root
    (ha.cf里面都有很详细的注释,也可以只要以上信息)

    vi /etc/ha.d/haresources
    HA-1 IPaddr::192.168.1.70/24/eth0 httpd

    vi /etc/ha.d/authkeys
    auth 1
    1 crc
    #2 sha1 HI!
    #3 md5 Hello!

    chmod 600 /etc/ha.dauthkeys  

    2台服务器配置保持一致

    /etc/init.d/heartbeat start
    如果成功启动:
    Starting High-Availability services:
    [  OK  ]
    否则会给出错误信息。依照着找错误便OK了。
    RH4.6自带apache。
    将heartbeat服务加入自启动。
    将配置文件复制到第二台服务器,并启动服务。

    然后访问:http://192.168.1.70,等到网页,内容显示的是192.168.1.71/var/www/html/index.html下面的内容,
    网卡显示:
    eth0:0    Link encap:Ethernet  HWaddr 00:16:35:7C:72:8B 
              inet addr:192.168.1.70  Bcast:192.168.1.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              Interrupt:201
    poweroff掉192.168.1.71,刷新网页,内容显示的是192.168.1.72/var/www/html/index.html下面的内容,
    网卡显示:
    eth0:0    Link encap:Ethernet  HWaddr 00:16:35:7C:83:C3 
              inet addr:192.168.1.70  Bcast:192.168.1.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              Interrupt:201          
    重新启动192.168.1.71,服务器启动之后刷新网页,apache切回192.168.1.71/var/www/html/index.html下面的内容。
    Ha配置、测试完毕。

    QQ2009preview小用

        今天找了一下最新版本的QQ,因为昨天有人在某个群里炫了一把QQ2009,所以目标十分明确,直接google,马上便有N多下载点,随便down了一下下来,qq2009preview_chs.exe(在IT168的迅雷下载链接),下载下来了只有6.69M了,貌似比以前的很多版本都要小,难怪还是preview版。直接setup,一路下来,安装也多快的,文件夹下面看到少了很多东西,OK,废话不说,直接启动,自己的号是会员,能直接登录,老婆的号不是会员,也没申请啥,也直接登录,昏,看来是RP爆发了(N多同事和同学都没法登陆)。

        呵呵,发现QQ2009越来越像MSN了,不管功能还是界面,连以前保存每个帐号的目录也由他程序的根目录变到现在我的文档下面的QQ Files目录下了,这个好得多了呢,不但减少了程序目录的大小(贴的图太多了),还可以控制很多东西呢,2009的preview版本现在看来好像没有其他游戏和其他很多扩展功能,设置和界面也挺清爽的。就不贴图上来了,网上N堆,自己瞅吧:)大家自己琢磨吧,都是N年的Q人了。

        转给无法登陆的朋友:(同事测试通过)

    办法如下:

    1.下载QQ2009 Preview

    官方下载地址:简体中文版本
    官方下载地址:繁体中文版本

    2.再下载Bin.rar,该压缩包里包含2个文件(62.4 KB ),均是从官方TM2008 Preview4.提取,网上说还要安装TM2008 Preview4,完全没必要,只需这2个文件即可!

    官方下载地址:Bin.rar简体中文版本
    官方下载地址:Bin.rar繁体中文版本

    3.安装QQ2009 Preview版,然后解压Bin.rar,把里面的vi.dat和QQ.exe复制到QQ2009\Bin目录下,然后用QQ.exe登陆即可...

    说明:QQ2007II 正式版接下来正式对外的是QQ2008系列的版本。最新的QQ2008 贺岁版预计是在1月底左右发布,和QQ2009 Preview的发布并没有什么直接关联。
    QQ2009 Preview是QQ2008系列版本之后的一个技术预览版本,目前仅仅提供了部分功能的预览,限量邀请部分用户参与内部测试。我们会在后续QQ2009的多个技术预览版中不断完善相关功能,并持续小范围的邀请用户参与内测。

    YouTube架构学习

    YouTube发展迅速,每天超过1亿的视频点击量,但只有很少人在维护站点和确保伸缩性。
    平台
    Apache
    Python
    Linux(SuSe)
    MySQL
    psyco,一个动态的Python到C的编译器
    lighttpd代替Apache做视频查看
    状态
    支持每天超过1亿的视频点击量
    成立于2005年2月
    于2006年3月达到每天3千万的视频点击量
    于2006年7月达到每天1亿的视频点击量
    2个系统管理员,2个伸缩性软件架构师
    2个软件开发工程师,2个网络工程师,1个DBA
    处理飞速增长的流量
    代码

      while (true)       {         identify_and_fix_bottlenecks();        drink();         sleep();         notice_new_bottleneck();      


    每天运行该循环多次
    Web服务器
    1,NetScaler用于负载均衡和静态内容缓存
    2,使用mod_fast_cgi运行Apache
    3,使用一个Python应用服务器来处理请求的路由
    4,应用服务器与多个数据库和其他信息源交互来获取数据和格式化html页面
    5,一般可以通过添加更多的机器来在Web层提高伸缩性
    6,Python的Web层代码通常不是性能瓶颈,大部分时间阻塞在RPC
    7,Python允许快速而灵活的开发和部署
    8,通常每个页面服务少于100毫秒的时间
    9,使用psyco(一个类似于JIT编译器的动态的Python到C的编译器)来优化内部循环
    10,对于像加密等密集型CPU活动,使用C扩展
    11,对于一些开销昂贵的块使用预先生成并缓存的html
    12,数据库里使用行级缓存
    13,缓存完整的Python对象
    14,有些数据被计算出来并发送给各个程序,所以这些值缓存在本地内存中。这是个使用不当的策略。应用服务器里最快的缓存将预先计算的值发送给所有服务器也花不了多少时间。只需弄一个代理来监听更改,预计算,然后发送。
    视频服务
    1,花费包括带宽,硬件和能源消耗
    2,每个视频由一个迷你集群来host,每个视频被超过一台机器持有
    3,使用一个集群意味着:
    -更多的硬盘来持有内容意味着更快的速度
    -failover。如果一台机器出故障了,另外的机器可以继续服务
    -在线备份
    4,使用lighttpd作为Web服务器来提供视频服务:
    -Apache开销太大
    -使用epoll来等待多个fds
    -从单进程配置转变为多进程配置来处理更多的连接
    5,大部分流行的内容移到CDN:
    -CDN在多个地方备份内容,这样内容离用户更近的机会就会更高
    -CDN机器经常内存不足,因为内容太流行以致很少有内容进出内存的颠簸
    6,不太流行的内容(每天1-20浏览次数)在许多colo站点使用YouTube服务器
    -长尾效应。一个视频可以有多个播放,但是许多视频正在播放。随机硬盘块被访问
    -在这种情况下缓存不会很好,所以花钱在更多的缓存上可能没太大意义。
    -调节RAID控制并注意其他低级问题
    -调节每台机器上的内存,不要太多也不要太少
    视频服务关键点
    1,保持简单和廉价
    2,保持简单网络路径,在内容和用户间不要有太多设备
    3,使用常用硬件,昂贵的硬件很难找到帮助文档
    4,使用简单而常见的工具,使用构建在Linux里或之上的大部分工具
    5,很好的处理随机查找(SATA,tweaks)
    缩略图服务
    1,做到高效令人惊奇的难
    2,每个视频大概4张缩略图,所以缩略图比视频多很多
    3,缩略图仅仅host在几个机器上
    4,持有一些小东西所遇到的问题:
    -OS级别的大量的硬盘查找和inode和页面缓存问题
    -单目录文件限制,特别是Ext3,后来移到多分层的结构。内核2.6的最近改进可能让Ext3允许大目录,但在一个文件系统里存储大量文件不是个好主意
    -每秒大量的请求,因为Web页面可能在页面上显示60个缩略图
    -在这种高负载下Apache表现的非常糟糕
    -在Apache前端使用squid,这种方式工作了一段时间,但是由于负载继续增加而以失败告终。它让每秒300个请求变为20个
    -尝试使用lighttpd但是由于使用单线程它陷于困境。遇到多进程的问题,因为它们各自保持自己单独的缓存
    -如此多的图片以致一台新机器只能接管24小时
    -重启机器需要6-10小时来缓存
    5,为了解决所有这些问题YouTube开始使用Google的BigTable,一个分布式数据存储:
    -避免小文件问题,因为它将文件收集到一起
    -快,错误容忍
    -更低的延迟,因为它使用分布式多级缓存,该缓存与多个不同collocation站点工作
    -更多信息参考Google ArchitectureGoogleTalk ArchitectureBigTable
    数据库
    1,早期
    -使用MySQL来存储元数据,如用户,tags和描述
    -使用一整个10硬盘的RAID 10来存储数据
    -依赖于信用卡所以YouTube租用硬件
    -YouTube经过一个常见的革命:单服务器,然后单master和多read slaves,然后数据库分区,然后sharding方式
    -痛苦与备份延迟。master数据库是多线程的并且运行在一个大机器上所以它可以处理许多工作,slaves是单线程的并且通常运行在小一些的服务器上并且备份是异步的,所以slaves会远远落后于master
    -更新引起缓存失效,硬盘的慢I/O导致慢备份
    -使用备份架构需要花费大量的money来获得增加的写性能
    -YouTube的一个解决方案是通过把数据分成两个集群来将传输分出优先次序:一个视频查看池和一个一般的集群
    2,后期
    -数据库分区
    -分成shards,不同的用户指定到不同的shards
    -扩散读写
    -更好的缓存位置意味着更少的IO
    -导致硬件减少30%
    -备份延迟降低到0
    -现在可以任意提升数据库的伸缩性
    数据中心策略
    1,依赖于信用卡,所以最初只能使用受管主机提供商
    2,受管主机提供商不能提供伸缩性,不能控制硬件或使用良好的网络协议
    3,YouTube改为使用colocation arrangement。现在YouTube可以自定义所有东西并且协定自己的契约
    4,使用5到6个数据中心加CDN
    5,视频来自任意的数据中心,不是最近的匹配或其他什么。如果一个视频足够流行则移到CDN
    6,依赖于视频带宽而不是真正的延迟。可以来自任何colo
    7,图片延迟很严重,特别是当一个页面有60张图片时
    8,使用BigTable将图片备份到不同的数据中心,代码查看谁是最近的
    学到的东西
    1,Stall for time。创造性和风险性的技巧让你在短期内解决问题而同时你会发现长期的解决方案
    2,Proioritize。找出你的服务中核心的东西并对你的资源分出优先级别
    3,Pick your battles。别怕将你的核心服务分出去。YouTube使用CDN来分布它们最流行的内容。创建自己的网络将花费太多时间和太多money
    4,Keep it simple!简单允许你更快的重新架构来回应问题
    5,Shard。Sharding帮助隔离存储,CPU,内存和IO,不仅仅是获得更多的写性能
    6,Constant iteration on bottlenecks:
    -软件:DB,缓存
    -OS:硬盘I/O
    -硬件:内存,RAID
    7,You succeed as a team。拥有一个跨越条律的了解整个系统并知道系统内部是什么样的团队,如安装打印机,安装机器,安装网络等等的人。With a good team all things are possible。(hideto/javaeye)

    ==========================================

        流媒体网络视频、在线听歌,现在技术上貌似已经完全成熟了,从用户角度上来看,在线听歌,看flash、播放视频,速度比以前不知道提升了多少倍了(即使他们服务器没在中国),从商业上,在美国租用服务器、带宽、或者是CDN很多东西并不是现在我们能比的,所以他能做很多这边没法完成的投资来完成跟多的事,从技术上来看,CDN是必不可少的东西,然后再是自己架构及程序开发的能力了吧,跟myspace和我们不一样,他们不能大把大把的砸钱去不停的提升机器的性能,毕竟是已盈利为目的吧?所以只能不断的修改代码,都已经达到瓶颈是RPC了,那么就不是写代码能再度提升很高性能的时候了吧。是否应该更多的注重其他方面的东西了呢?毕竟听歌我只用腾讯、视频只看土豆,中国硕大的市场还没开发,可惜了。而且记得去年10月份的时候YouTube香港和YouTube台湾在中国都无法访问,有点被封杀的感觉。

        感觉好多东西自己看了有点懂,但是又表达不出来很有条理性的东西。缺啥呢?

    通过了解MySpace的六次重构经历,来认识分布式系统到底该如何创建.

    领导发到邮件里让大家阅读,今天早上才有机会把它好好看一遍:

    ==============================

    这是我在网上无意中看到的一篇文章,介绍了myspace的六次重构,对于做海量用户系统的朋友来说,应该能从中受到很多启发.
    在每个里程碑,站点负担都会超过底层系统部分组件的最大载荷,特别是数据库和存储系统。接着,功能出现问题,用户失声尖叫。最后,技术团队必须为此修订系统策略。

    虽然自2005年早期,站点账户数超过7百万后,系统架构到目前为止保持了相对稳定,但MySpace仍然在为SQL Server支持的同时连接数等方面继续攻坚,Benedetto说,"我们已经尽可能把事情做到最好"。

    里程碑一:50万账户

    按Benedetto 的说法,MySpace最初的系统很小,只有两台Web服务器和一个数据库服务器。那时使用的是Dell双CPU、4G内存的系统。

    单个数据库就意味着所有数据都存储在一个地方,再由两台Web服务器分担处理用户请求的工作量。但就像MySpace后来的几次底层系统修订时的情况一样,三服务器架构很快不堪重负。此后一个时期内,MySpace基本是通过添置更多Web服务器来对付用户暴增问题的。

    但到在2004年早期,MySpace用户数增长到50万后,数据库服务器也已开始汗流浃背。

    但和Web服务器不同,增加数据库可没那么简单。如果一个站点由多个数据库支持,设计者必须考虑的是,如何在保证数据一致性的前提下,让多个数据库分担压力。

    在第二代架构中,MySpace运行在3个SQL Server数据库服务器上——一个为主,所有的新数据都向它提交,然后由它复制到其他两个;另两个全力向用户供给数据,用以在博客和个人资料栏显示。这种方式在一段时间内效果很好——只要增加数据库服务器,加大硬盘,就可以应对用户数和访问量的增加。

    里程碑二:1-2百万账户

    MySpace注册数到达1百万至2百万区间后,数据库服务器开始受制于I/O容量——即它们存取数据的速度。而当时才是2004年中,距离上次数据库系统调整不过数月。用户的提交请求被阻塞,就像千人乐迷要挤进只能容纳几百人的夜总会,站点开始遭遇"主要矛盾",Benedetto说,这意味着MySpace永远都会轻度落后于用户需求。

    "有人花5分钟都无法完成留言,因此用户总是抱怨说网站已经完蛋了。"他补充道。

    这一次的数据库架构按照垂直分割模式设计,不同的数据库服务于站点的不同功能,如登录、用户资料和博客。于是,站点的扩展性问题看似又可以告一段落了,可以歇一阵子。

    垂直分割策略利于多个数据库分担访问压力,当用户要求增加新功能时,MySpace将投入新的数据库予以支持它。账户到达2百万后,MySpace还从存储设备与数据库服务器直接交互的方式切换到SAN(Storage Area Network,存储区域网络)——用高带宽、专门设计的网络将大量磁盘存储设备连接在一起,而数据库连接到SAN。这项措施极大提升了系统性能、正常运行时间和可靠性,Benedetto说。

    里程碑三:3百万账户

    当用户继续增加到3百万后,垂直分割策略也开始难以为继。尽管站点的各个应用被设计得高度独立,但有些信息必须共享。在这个架构里,每个数据库必须有各自的用户表副本——MySpace授权用户的电子花名册。这就意味着一个用户注册时,该条账户记录必须在9个不同数据库上分别创建。但在个别情况下,如果其中某台数据库服务器临时不可到达,对应事务就会失败,从而造成账户非完全创建,最终导致此用户的该项服务无效。

    另外一个问题是,个别应用如博客增长太快,那么专门为它服务的数据库就有巨大压力。

    2004年中,MySpace面临Web开发者称之为"向上扩展"对"向外扩展"(译者注:Scale Up和Scale Out,也称硬件扩展和软件扩展)的抉择——要么扩展到更大更强、也更昂贵的服务器上,要么部署大量相对便宜的服务器来分担数据库压力。一般来说,大型站点倾向于向外扩展,因为这将让它们得以保留通过增加服务器以提升系统能力的后路。

    但成功地向外扩展架构必须解决复杂的分布式计算问题,大型站点如Google、Yahoo和Amazon.com,都必须自行研发大量相关技术。以Google为例,它构建了自己的分布式文件系统。

    另外,向外扩展策略还需要大量重写原来软件,以保证系统能在分布式服务器上运行。"搞不好,开发人员的所有工作都将白费",Benedetto说。

    因此,MySpace首先将重点放在了向上扩展上,花费了大约1个半月时间研究升级到32CPU服务器以管理更大数据库的问题。Benedetto说,"那时候,这个方案看似可能解决一切问题。"如稳定性,更棒的是对现有软件几乎没有改动要求。

    糟糕的是,高端服务器极其昂贵,是购置同样处理能力和内存速度的多台服务器总和的很多倍。而且,站点架构师预测,从长期来看,即便是巨型数据库,最后也会不堪重负,Benedetto说,"换句话讲,只要增长趋势存在,我们最后无论如何都要走上向外扩展的道路。"

    因此,MySpace最终将目光移到分布式计算架构——它在物理上分布的众多服务器,整体必须逻辑上等同于单台机器。拿数据库来说,就不能再像过去那样将应用拆分,再以不同数据库分别支持,而必须将整个站点看作一个应用。现在,数据库模型里只有一个用户表,支持博客、个人资料和其他核心功能的数据都存储在相同数据库。

    既然所有的核心数据逻辑上都组织到一个数据库,那么MySpace必须找到新的办法以分担负荷——显然,运行在普通硬件上的单个数据库服务器是无能为力的。这次,不再按站点功能和应用分割数据库,MySpace开始将它的用户按每百万一组分割,然后将各组的全部数据分别存入独立的SQL Server实例。目前,MySpace的每台数据库服务器实际运行两个SQL Server实例,也就是说每台服务器服务大约2百万用户。Benedetto指出,以后还可以按照这种模式以更小粒度划分架构,从而优化负荷分担。

    当然,还是有一个特殊数据库保存了所有账户的名称和密码。用户登录后,保存了他们其他数据的数据库再接管服务。特殊数据库的用户表虽然庞大,但它只负责用户登录,功能单一,所以负荷还是比较容易控制的。

    里程碑四:9百万到1千7百万账户

    2005年早期,账户达到9百万后,MySpace开始用Microsoft的C#编写ASP.NET程序。C#是C语言的最新派生语言,吸收了C++和Java的优点,依托于Microsoft .NET框架(Microsoft为软件组件化和分布式计算而设计的模型架构)。ASP.NET则由编写Web站点脚本的ASP技术演化而来,是Microsoft目前主推的Web站点编程环境。

    可以说是立竿见影, MySpace马上就发现ASP.NET程序运行更有效率,与ColdFusion相比,完成同样任务需消耗的处理器能力更小。据技术总监Whitcomb说,新代码需要150台服务器完成的工作,如果用ColdFusion则需要246台。Benedetto还指出,性能上升的另一个原因可能是在变换软件平台,并用新语言重写代码的过程中,程序员复审并优化了一些功能流程。

    最终,MySpace开始大规模迁移到ASP.NET。即便剩余的少部分ColdFusion代码,也从Cold-Fusion服务器搬到了ASP.NET,因为他们得到了BlueDragon.NET(乔治亚州阿尔法利塔New Atlanta Communications公司的产品,它能将ColdFusion代码自动重新编译到Microsoft平台)的帮助。

    账户达到1千万时,MySpace再次遭遇存储瓶颈问题。SAN的引入解决了早期一些性能问题,但站点目前的要求已经开始周期性超越SAN的I/O容量——即它从磁盘存储系统读写数据的极限速度。

    原因之一是每数据库1百万账户的分割策略,通常情况下的确可以将压力均分到各台服务器,但现实并非一成不变。比如第七台账户数据库上线后,仅仅7天就被塞满了,主要原因是佛罗里达一个乐队的歌迷疯狂注册。

    某个数据库可能因为任何原因,在任何时候遭遇主要负荷,这时,SAN中绑定到该数据库的磁盘存储设备簇就可能过载。"SAN让磁盘I/O能力大幅提升了,但将它们绑定到特定数据库的做法是错误的。"Benedetto说。

    最初,MySpace通过定期重新分配SAN中数据,以让其更为均衡的方法基本解决了这个问题,但这是一个人工过程,"大概需要两个人全职工作。"Benedetto说。

    长期解决方案是迁移到虚拟存储体系上,这样,整个SAN被当作一个巨型存储池,不再要求每个磁盘为特定应用服务。MySpace目前采用了一种新型SAN设备——来自加利福尼亚州弗里蒙特的3PARdata。

    在3PAR的系统里,仍能在逻辑上按容量划分数据存储,但它不再被绑定到特定磁盘或磁盘簇,而是散布于大量磁盘。这就使均分数据访问负荷成为可能。当数据库需要写入一组数据时,任何空闲磁盘都可以马上完成这项工作,而不再像以前那样阻塞在可能已经过载的磁盘阵列处。而且,因为多个磁盘都有数据副本,读取数据时,也不会使SAN的任何组件过载。

    当2005年春天账户数达到1千7百万时,MySpace又启用了新的策略以减轻存储系统压力,即增加数据缓存层——位于Web服务器和数据库服务器之间,其唯一职能是在内存中建立被频繁请求数据对象的副本,如此一来,不访问数据库也可以向Web应用供给数据。换句话说,100个用户请求同一份资料,以前需要查询数据库100次,而现在只需1次,其余都可从缓存数据中获得。当然如果页面变化,缓存的数据必须从内存擦除,然后重新从数据库获取——但在此之前,数据库的压力已经大大减轻,整个站点的性能得到提升。

    缓存区还为那些不需要记入数据库的数据提供了驿站,比如为跟踪用户会话而创建的临时文件——Benedetto坦言他需要在这方面补课,"我是数据库存储狂热分子,因此我总是想着将万事万物都存到数据库。"但将像会话跟踪这类的数据也存到数据库,站点将陷入泥沼。

    增加缓存服务器是"一开始就应该做的事情,但我们成长太快,以致于没有时间坐下来好好研究这件事情。"Benedetto补充道。

    里程碑五:2千6百万账户

    2005年中期,服务账户数达到2千6百万时,MySpace切换到了还处于beta测试的SQL Server 2005。转换何太急?主流看法是2005版支持64位处理器。但Benedetto说,"这不是主要原因,尽管这也很重要;主要还是因为我们对内存的渴求。"支持64位的数据库可以管理更多内存。

    更多内存就意味着更高的性能和更大的容量。原来运行32位版本的SQL Server服务器,能同时使用的内存最多只有4G。切换到64位,就好像加粗了输水管的直径。升级到SQL Server 2005和64位Windows Server 2003后,MySpace每台服务器配备了32G内存,后于2006年再次将配置标准提升到64G。

    意外错误

    如果没有对系统架构的历次修改与升级,MySpace根本不可能走到今天。但是,为什么系统还经常吃撑着了?很多用户抱怨的"意外错误"是怎么引起的呢?

    原因之一是MySpace对Microsoft的Web技术的应用已经进入连Microsoft自己也才刚刚开始探索的领域。比如11月,超出SQL Server最大同时连接数,MySpace系统崩溃。Benedetto说,这类可能引发系统崩溃的情况大概三天才会出现一次,但仍然过于频繁了,以致惹人恼怒。一旦数据库罢工,"无论这种情况什么时候发生,未缓存的数据都不能从SQL Server获得,那么你就必然看到一个'意外错误'提示。"他解释说。

    去年夏天,MySpace的Windows 2003多次自动停止服务。后来发现是操作系统一个内置功能惹的祸——预防分布式拒绝服务攻击(黑客使用很多客户机向服务器发起大量连接请求,以致服务器瘫痪)。MySpace和其他很多顶级大站点一样,肯定会经常遭受攻击,但它应该从网络级而不是依靠Windows本身的功能来解决问题——否则,大量MySpace合法用户连接时也会引起服务器反击。

    "我们花了大约一个月时间寻找Windows 2003服务器自动停止的原因。"Benedetto说。最后,通过Microsoft的帮助,他们才知道该怎么通知服务器:"别开枪,是友军。"

    紧接着是在去年7月某个周日晚上,MySpace总部所在地洛杉矶停电,造成整个系统停运12小时。大型Web站点通常要在地理上分布配置多个数据中心以预防单点故障。本来,MySpace还有其他两个数据中心以应对突发事件,但Web服务器都依赖于部署在洛杉矶的SAN。没有洛杉矶的SAN,Web服务器除了恳求你耐心等待,不能提供任何服务。

    Benedetto说,主数据中心的可靠性通过下列措施保证:可接入两张不同电网,另有后备电源和一台储备有30天燃料的发电机。但在这次事故中,不仅两张电网失效,而且在切换到备份电源的过程中,操作员烧掉了主动力线路。

    2007年中,MySpace在另两个后备站点上也建设了SAN。这对分担负荷大有帮助——正常情况下,每个SAN都能负担三分之一的数据访问量。而在紧急情况下,任何一个站点都可以独立支撑整个服务,Benedetto说。

    MySpace仍然在为提高稳定性奋斗,虽然很多用户表示了足够信任且能原谅偶现的错误页面。

    "作为开发人员,我憎恶Bug,它太气人了。"Dan Tanner这个31岁的德克萨斯软件工程师说,他通过MySpace重新联系到了高中和大学同学。"不过,MySpace对我们的用处很大,因此我们可以原谅偶发的故障和错误。" Tanner说,如果站点某天出现故障甚至崩溃,恢复以后他还是会继续使用。

    这就是为什么Drew在论坛里咆哮时,大部分用户都告诉他应该保持平静,如果等几分钟,问题就会解决的原因。Drew无法平静,他写道,"我已经两次给MySpace发邮件,而它说一小时前还是正常的,现在出了点问题……完全是一堆废话。"另一个用户回复说,"毕竟它是免费的。"Benedetto坦承100%的可靠性不是他的目标。"它不是银行,而是一个免费的服务。"他说。

    换句话说,MySpace的偶发故障可能造成某人最后更新的个人资料丢失,但并不意味着网站弄丢了用户的钱财。"关键是要认识到,与保证站点性能相比,丢失少许数据的故障是可接受的。"Benedetto说。所以,MySpace甘冒丢失2分钟到2小时内任意点数据的危险,在SQL Server配置里延长了"checkpoint"操作——它将待更新数据永久记录到磁盘——的间隔时间,因为这样做可以加快数据库的运行。

    Benedetto说,同样,开发人员还经常在几个小时内就完成构思、编码、测试和发布全过程。这有引入Bug的风险,但这样做可以更快实现新功能。而且,因为进行大规模真实测试不具可行性,他们的测试通常是在仅以部分活跃用户为对象,且用户对软件新功能和改进不知就里的情况下进行的。因为事实上不可能做真实的加载测试,他们做的测试通常都是针对站点。

    "我们犯过大量错误,"Benedetto说,"但到头来,我认为我们做对的还是比做错的多。"

    MySpace Tech Roster

    January 16, 2007

    By David F. Carr

    我的一些思考:
    看完这篇文章首先很惊讶myspace居然是基于.net平台的系统,windows2003+asp.net+IIS+SQLSERVER,虽然我是一个纯粹的MS技术者,但是对于MS的WEB应用总是有点疑虑,我的担心大概是来自于到处都在鼓吹的LAMP,我并不敌视开源,但是我承认,它给我带来了很大的压力.看了这篇文章,我有点庆幸也有点笑自己之前的迂腐,其实对于技术来说,优劣只在于开发者本身,myspace的六次重构,很好的说明了这一点.
    我们常常讲分布式系统,这个概念很大,简单点说,就是把系统给拆分开来,把本来一台服务器做的事,分到两台服务器来做.如果只在一台服务器上部署两个程序来执行之前一个程序做的事,我认为那不叫分布式,也是完全没必要的,分布式的原则是"后分布"(lazy distribute),因为这本身是件损耗性能的工作,如果不能通过它来获得明显的性能提升,那为什么还要分布式?
    myspace的六次重构基本都是围绕数据库来进行的,做了这么多年的WEB应用,我早就知道了数据库对于一个网站来说是多么的重要.在程序没有额外的问题的基础上,随着流量的增大,最先出现问题的,往往就是数据库.症状通常为,数据库查询/更新变的非常非常的慢,经常超时等.
    这个时候,我们能做的事非常有限,无非是调整下SQLServer的内存大小,给服务器加内存换速度更快的硬盘等.如果要认真的解决这个问题,对于一般的开发者来说,都会自然的想到拆库.海量的数据查询对于SQL来说本就是不该存在的,无论你的数据库优化的多么好,比如你用的Oracle,数据吞吐量很大,难道查询100W的记录会比SQL查询1W条更快吗?拆库又分本地数据库分多个表和多个服务器分多个库,执行顺序为由前到後,当数据库的压力由海量查询变成磁盘IO之后,就需要更多的数据库服务器了.
    除了硬件手段,更常用的是采用缓存.myspace直到第四次改版的后期才开始正式的引入缓存策略,这确实是个失误,如果从最开始就考虑到缓存的作用的话,那么数据库服务器至少不会膨胀的那么快,也可以有更多的时间来思考更好的架构.当然,正如Benedetto所说,这是件一开始就该考虑的事,但是myspace成长的太快了.
    不是谁都有机会来为一个流量在世界上排名前10的网站来设计架构,因此myspace的后面的若干次重构,对于普通的开发者已经很难接触了,我认为,在第三个里程碑时,也就是通过服务器的横向扩展来实现的分布式,已经足够支持巨型网站的应用了.myspace是个交互型特别强的网站,用户执行的请求数会远大于一般的网站,这也是它巨大的数据库压力的来源.
    最后总结一下WEB系统分布式的要点:
    1.不到需要,绝对不要分布
    2.分布式应该围绕数据库展开
    3.分布式系统本身具有很强的扩展性,系统性能的提升和硬件的增加是线性关系.
    感想写的比较乱,基本想到什么写的什么,各位看官各取所需即是.

    ======================================

    mysql、sqlserver和oracle的各自的优劣并不是哪个人,几句话能说得出来的。为了自己方便,留个印子,想到哪儿说道哪儿。且不说他们的免费收费、价格高低(虽然这个是老板很在乎的),单从技术角度讲,sqlserver是不能跨平台的软肋让他很受局限,现在我们几百台服务器也就只有10台SDC(访问日志分析系统)是用的windows,其他的全部都是linux的,所以,我们无缘sqlserver;mysql没有事务功能(貌似新出的版本在往这个方向走),但是他的速度挺快,有数据量的瓶颈(听说腾迅都还在用mysql,所以数据量是个瓶颈这个和上面那个兄台想法一样:对于技术来说,优劣只在于开发者本身),现在,mysql和盘阵已经逐渐从我们的系统里面干掉,几乎全部都用上oracle+EMC了,这也是因为业务量变得很大了,但是最重要的是东家有钱和我们的技术还很薄弱,oracle,我觉得一个很理性但是不人性的系统,因为只是按照文档在上面做了2次stream,和一个话单系统,所以,都还不是真正懂得他的很多细节上的东西,PL\sql,分布式,连乱七八糟的基础都是连门都还没去敲。

    跑题了。分布式系统,我们经历了从myspace的第一个阶段直接到最后阶段的更新(诸多原因掺杂),2web+2app+1DB+1SAN,当业务量到达一定量、技术还无法跟上的时候,我们便变成了web群+app群+DB群+EMC+分析+统计……我觉得可以说是一个网站最后的必经之路,因为无论技术在好,1个孙悟空也搞不定81个妖怪吧。

    Fedora(华为2008-02-26自杀插曲)

    昨天晚上下班时找了台DELL的740,装了Fedora,感觉DELL的机器还是不错的。

    早上来开机,遇到了不少问题,慢慢解决ing。

    1、分辨率800x600,重新安装驱动了看看能解决否。

    2、鼠标箭头无法显示,so:

    2.1.vi /etc/X11/xorg.conf
    2.2.Section Device块区域里面添加:Option "HWCursor"  "false"
    2.3.reboot

    3、中文输入法,so:

    3.1.google拼音,但是,没有看到linux版本滴,可惜。

    3.2.顺便google一把,找到了http://www.fcitx.org/main/,down下来之后开始安装。

    3.3.文档区有详细的说明,but,安装啥都完成,启动起来之后确没有办法使用,伤了一下心,算了,language切换成中文,然后直接自带的,哎。

    4、mercury-messenger,QQ,MAIL,Session,……一大堆东西慢慢装。

    插曲:突然有第一时间的消息,离我们不远的成都天府软件园B7栋华为公司有员工跳楼身亡

    然后很快就有很多图片和消息传播过来了,哎,看来这个世界还真是郁闷呢。

    1                 2

    讨论还在继续,偶也继续。

    5、分辨率。

    linux的X界面装好了之后很多有只能最高开到800X600,可以在“显示”里面的硬件里面把你显示器的牌子型号选上了之后,重启X界面,OK,呵呵,分辨率一堆一堆的来。

    6、貌似暂时没有其他的东西了,可以干活了,米西米西的。

    NFS几出郁闷的问题

    最近遇到了几个郁闷的问题。

    第一次,NFS无法mount,老是提示:

    failed, reason given by server: Permission denied

    然后到处google,有人说export,有的说权限777,但是其他的都很符合规则,弄了大半天,郁闷了,直接

    /etc/init.d/nfs stop

    /etc/init.d/portmap restart

    /etc/init.d/nfs start

    操。直接mount上了,郁闷,为啥呢?服务不稳定,不可科学啊,nfs是很稳定的东西吧,so,下次遇到问题的时候,大家不妨restart一把。

    第二次,就是刚才,同事让帮忙把一个nfs server的东西mount到另一个nfs server上去,呵呵:

    [root@localhost /]# /etc/init.d/nfs start
    Starting NFS services:                                     [  OK  ]
    Starting NFS quotas:                                       [  OK  ]
    Starting NFS daemon:                                       [  OK  ]
    Starting NFS mountd:                                       [  OK  ]
    Starting RPC idmapd: Error: RPC MTAB does not exist.

    直接“RPC MTAB does not exist”,goog吧,

    看了http://blog.sina.com.cn/s/blog_4a8d7b4901007smj.htmlhttp://linux.chinaunix.net/bbs/thread-899823-1-1.html

    两位仁兄的东西,然后自己一气得调整,

    Jan 31 10:43:51 localhost kernel: nfsd: unexporting all filesystems
    Jan 31 10:43:51 localhost kernel: RPC: failed to contact portmap (errno -5).

    很多错误都找到了,但是最后一次restart的时候还是:Error: RPC MTAB does not exist.

    怪了,靠,直接另外一台机器上去mount试一把:

    [root@openfiler data]# mount -t nfs -o rw ××××××××:/data/ back/

    不报错,进去操作,啥都OK,同事的大数据跑了2把,没发现问题,又被郁闷了。。哎。。玄妙啊玄妙。回去看看基础,鸟哥私房菜,最近发现的,牛人啊:http://linux.vbird.org/linux_server/0330nfs.php#before(NFS的基础的东西)

     

    哦,还有新学的个东西:sqlldr:

    TERMINATED BY X '09' // 以十六进制格式 '09' 表示的

    linux过滤文本

    查找目录下的所有文件中是否含有某个字符串
    find .|xargs grep -ri "IBM"
    查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名
    find .|xargs grep -ri "IBM" -l

    1.正则表达式
      (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/、*、?等)组成。
      (2)基本元字符集及其含义
          ^ :只匹配行首。   如^a 匹配以a开头的行abc,a2e,a12,aaa,......
          $ :只匹配行尾。   如^a 匹配以a结尾的行bca,12a,aaa,.......
          * :匹配0个或多个此单字符。 如(a)* 匹配 空,a,aa,aaa,....
          [] :只匹配[]内字符。可以是一个单字符,也可以是字符序列,用","将里面要匹配的不同字符串分开。也可以使用-来表示[]内字符序列的范围,如[1-5]表示[12345]
          \ :只用来屏蔽一个元字符的特殊含义。 如\*,\',\",\|,\+,\^,\. 等
          .:(点)只匹配任意单字符。
          pattern\{n\}:只用来匹配前面pattern出现的次数.n为次数。如a\{2\}匹配aa.
          pattern\{n,\}:含义同上,但次数最少为n.如a\{2,\}匹配aa,aaa,aaaa,.....
          pattern\{n,m\}:含义同上,但次数在n和m之间。如a\{2,4\}匹配aa,aaa,aaaa三个
      (3)举例说明:
          ^$ :匹配空行
          ^.$ :匹配包含一个字符的行
        \*\.pas :匹配以*.pas结尾的所有字符或文件
        [0123456789]或[0-9] :假定要匹配任意一个数字
        [a-z] :任意小写字母
        [A-Za-z] :任意大小写字母
        [S,s] :匹配大小写S
        [0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} :匹配IP地址 [0-9]\{3\}三个0-9组成的字符串;\. :匹配点(注意这里点是特殊的字符,所以要用"\"来屏蔽其含义)
    2.find介绍
      (1)查找具有某些特征文件的命令,可遍历当前目录甚至于整个文件系统来查看某些文件或目录,其遍历大的文件系统时一般放在后台执行。
      (2)find命令的一般形式
          find pathname -options [-print -exec -ok]
          -pathname :find命令所查找的目录路径。如用"."来表示当前的目录,用/来表示系统根目录
          -print :find命令将匹配的文件输出到标准输出
          -exec: find命令对匹配的文件执行该参数所给出的shell命令,相应的命令形式为
            'command'{} \; (注意{}和\之间的空格)
          -ok 和 -exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
        options有如下几种:
        -name :按照文件名查找文件
        -perm :按照文件权限来查找文件
        -user :按照文件属主来查找文件
        -group :按照文件所属的组来查找文件
        -mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime 和-ctime选项,但它们都和-mtime选项相似。
        -size n[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计。
        -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在
        -newer file1 !file2查找更改时间比文件file1新但比文件file2旧的文件
        -depth 先查找指定目录有无匹配文件,若无则再在子目录中查找
        -type 查找某一类型的文件,如
          b :块设备文件
          d:目录
          e:字符设备文件
          p;管道文件
          l:符号链接文件
          f:普通文件
      (3)find命令举例
          find -name "*.txt" -print 查找txt结尾的文件并输出到屏幕上
          find /cmd ".sh" -print 查找/cmd目录下所有sh文件,并输出
          find . -perm 755 -print 查找当前目录下权限为755的文件,并输出
          find `pwd` -user root -print 查找当前目录下属主为root的文件,并输出
          find ./ -group sunwill -print 查找当前目录下所属主是sunwill的文件
          find /var -mtime -5 -print 查找/var目录下更改时间为5天内的所有文件
          find /var -mtime +5 -print 查找/var目录下更改时间为5天以前的所有文件
          find /var -newer "myfile1" ! -newer "myfile2" -print 查找/var目录下比myfile1新,但是比myfile2旧的所有文件。
          find /var -type d -print 查找/var目录下所有目录
          find /var -type l -print 查找/var目录下所有的符号链接文件。
          find . -size +1000000c -print 查找当前目录下大于1000000字节的文件
          find / -name "con.file" -depth -print 查找根目录下有无"con.file",若无则在其子目录中查找
          find . -type f -exec ls -l {} \; 查找当前目录下是否有普通文件,若有则执行ls -l
        (4)xargs命令
          在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec。不幸的是,有些系统对能够传递给exec的命令长度有限制,这样find命令运行几分钟之后就算出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs的用处所在,特别是与find命令一起使用,exec会发起多个进程,而xargs会多个,只有一个
          find ./ -perm -7 -print | xargs chmod o-w 查找权限为7的文件并传递给chmod处理
    3.grep介绍
      (1)grep 的一般格式为 grep [options] 基本正则表达式 [文件]
          字符串参数最好采用是双引号括,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串
          -c:只输出匹配行的记数
          -i:不区分大小写(只适用于单个字符)
          -h:查询多个文件时不显示文件名
          -H:只显示文件名
          -l:查询多文件时只输出包含匹配字符的文件名
          -n:只显示匹配行及其行号
          -s:不显示不存在或无匹配文本的错误信息。
          -v:显示不包含匹配文本的所有行。
      (2)举例说明:
          grep ^[^210] myfile 匹配myfile中以非2、1、0开头的行
          grep "[5-8][6-9][0-3]" myfile 匹配myfile中第一位为5|6|7|8,第二位6|7|8|9,第三位为0|1|2|3的三个字符的行
          grep "4\{2,4\}" myfile 匹配myfile中含有44,444或4444的行
          grep "\?" myfile匹配myfile中含有任意字符的行
      (3)grep命令类名
          [[:upper:]]   表示[A-Z]
          [[:alnum:]]   表示[0-9a-zA-Z]
          [[:lower:]]   表示[a-z]
          [[:space:]]   表示空格或者tab键
          [[:digit:]]   表示[0-9]
          [[:alpha:]]   表示[a-zA-Z]
        如:grep "5[[:digit:]][[:digit:]]" myfile 匹配myfile中含有5开头接下去两位都是数字的行。
    4.awk介绍
    可以从文件或字符串中基于指定规则浏览和抽取信息,是一种自解释的变成语言。
    (1)awk命令行方式 awk [-F filed-spearator] 'command' input-files
        awk脚本:所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。awk脚本是由各种操作和模式组成。
        模式部分决定动作语句何时触发及触发事件。(BEGIN,END)
        动作对数据进行处理,放在{}内指明(print)
    (2)分隔符、域和记录
        awk执行时,其浏览域标记为$1,$2,...$n.这种方法成为域标识。$0为所有域。
    (3)举例说明:
          awk '{print $0}' test.txt |tee test.out 输出test.txt中所有行$0表示所有域
          awk -F : '{print $1} test.txt |tee test.out'   同上。。只是分隔符为":"
          awk 'BEGIN {print "IPDate\n"}{print $1 "\t" $4} END{print "end-of-report"}' test.txt
          开始时打印“IPDate”结束时打印“end-of-report”中间打印主体信息,比如总共匹配三条信息,则输出如下:  
    IPDate
    1 first
    2 second
    3 third
    end-of-report
      (4)匹配操作符 ~ 匹配,!~ 不匹配
          cat test.txt |awk '$0~/210.34.0.13/' 匹配test.txt中为210.34.0.13的行
          awk '$0!~/210.34.0.13' test.txt     匹配test.txt中不是210.34.0.13的行
          awk '{if($1=="210.34.0.13") print $0}' test.txt 匹配 test.txt中第一个域为210.34.0.13的行。
    5.sed介绍
        sed不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。
        sed是一种很重要的文本过滤工具,使用一行命令或者使用管道与grep与awk相结合。是一种非交互性文本流编辑。
        (1)调用sed的三种方式
          使用sed命令行格式为:sed [options] sed命令 输入文件
          使用sed脚本文件格式为:sed[options] -f sed脚本文件 输入文件
          sed脚本文件[options] 输入文件
          --不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中接受输入,一般是键盘或重定向结果。
        (2)sed 命令的options如下
            -n:不打印
            -c:下一命令是编辑命令
            -f:如果正在调用sed脚本文件
        (3)sed在文件中查询文本的方式
              --使用行号,可以是一个简单的数字,或是一个行号的范围
              --使用正则表达式
        (4)读取文本的方式
              x       x为一行号
              x,y       表示行号范围从x到y
              /pattern/     查询包含模式的行
              /pattern/pattern/ 查询包含两个模式的行
              pattern/,x   在给定的行号上查询包含模式的行
              x,/pattern/   通过行号和模式查询匹配行
              x,y!       查询不包含指定行号x和y的行
          (5)基本sed编辑命令
                p   打印匹配行
                d   删除匹配行
                =   显示文件行号
                a\   在定位行号后附加新文本信息
                i\   在定位行号后插入新文本信息
                c\   用新文本替换定位文本
                s     使用替换模式替换相应模式
                r     从另一个文件中读文件
                w   写文本到一个文件
                q     第一个模式匹配完成后推出或立即退出
                l     显示与八禁止ASCII代码等价的控制字符
                {}   在定位行执行的命令组
                n     从另一个文件中读文本下一行,并附加在下一行
                g     将模式2粘贴到/pattern n/
                y     传送字符
        (6)举例说明:
              sed -n '2p' test.txt 打印第二行的信息(注意:-n是不打印不匹配的信息,若没加-n,则打印文件的所有信息而不是匹配信息)
              sed -n '1,4p' test.txt 打印第一行到第四行的信息
              sed -n '/los/p' test.txt模式匹配los,并打印出来
              sed -n '2,/los/p' test.txt 从第二行开始。。知道匹配第一个los
              sed -n '/^$/p' test.txt 匹配空行
              sed -n -e '/^$/p' -e '/^$/=' test.txt 打印空行及行号
              sed -n '/good/a\morning' test.txt 在匹配到的good后面附加morning
              sed -n '/good/i\morning' test.txt 在匹配到的good前面插入morning
              sed -n '/good/c\morning' test.txt 将匹配到的good替换成morning
              sed '1,2d' test.txt 删除第1和2行
              sed 's/good/good morning/g' test.txt 匹配good并替换成goodmorning
              send 's/good/& hello /p' test.txt 匹配到good就在其后面加上hello
              send 's/good/ hello &/p' test.txt 匹配到good就在其前面加上hello
    6.合并与分割(sort,uniq,join,cut,paste,split)
        (1)sot命令
            sort [options] files 许多不同的域按不同的列顺序排序
              -c 测试文件是否已经排序
              -m 合并两个排序文件
              -u 删除所有同样行
              -o 存储sort结果的输出文件名
              -t 域分隔符,用非空格或tab开始排序
              +n :n 为列号,使用此列号开始排序
              -n 指定排序是域上的数字分类项
              -r 比较求逆
            sort -c test.txt 测试文件是否分类过
            sort -u test.txt 排序并合并一样的行
            sort -r test.txt 以相反的顺序排列
            sort -t "/" +2 test.txt 以"/"分隔,第二个域开始分类
          (2)uniq命令
              uniq [options ] files 从一个文本文件中去除或禁止重复行
              -u 只显示不重复行
              -d 只显示有重复数据行,每种重复行只显示其中一行
              -c 打印每一重复行出现次数
              -f :n为数字,前n个域被忽略
              uniq -f 2 test.txt 忽略前2个域
          (3)join 命令
              join [options] file1 file2 用来将来自两个分类文本文件的行连在一起
              -an,n为一数字,用于连接时从文件n中显示不匹配行
              -onm ,连接域,n为文件号,m为域号
              -jnm,n为文件号,m为域号,使用其他域作连接域
              -t ,域分隔符。用来设置非空格或tab键的域分隔符。
            (4)split命令
              split -output_file_size intput_filename output_filename
              用来将大文件分割成小文件。
                -b n,每个分割文件的大小n
                -C n,每个分割文件一行最多n字节
                -l n,每个分割文件的行数
                -n,同-l n
                split -10 test.txt 将test.txt分割成10行的小文件
            (5)cut 命令
              cut -c n1-n2 filename 显示每行从开头算起 n1 到 n2 的文字。
              cut -c 3-5 test.txt 显示test.txt中每行从第3到第5个字符

    dW 中国 2007 年 TOP 10 最受欢迎的文章和教程

    IBM的网站上看到的。贴回来。


    2007

    2006

    AIX and UNIX

    Information Mgmt

    Rational

    WebSphere

    Java

    Linux

    Open Source

    SOA and Web services

    Web development

    XML

    Ajax

    2007 AIX and UNIX TOP 10 !

    2007年即将结束,在这里为您总结和这一年中 AIX and UNIX 专区最热门的教程,文章,让您对这一年本专区发布的内容有一个总体的了解,当然也希望您能找到原来还没有阅读过的好内容。

    2007 Information Management TOP 10 !

    Information Management 专区在过去的一年里发表了很多 DB2 和其他信息管理软件的技术文章、教程、专栏和专题。我们今年又整理出 2007 年最受读者欢迎的内容,您可以从中了解到当前的 DB2 开发者最关心的内容、学习最新的 DB2 信息管理软件技术。

    2007 Rational TOP 10 !

    developerWorks 中国网站 Rational 专区在 2007 年上半年里发表了很多和 Rational 相关的技术文章、教程、多媒体课堂和专栏。我们特地整理出 2007 上半年最受读者欢迎的内容,希望通过这个排行榜,您可以了解最新的 Rational 的技术热点,学习在如何应用开发中应用 Rational 开发工具,及相关技术的技巧和最佳实践。

    2007 WebSphere TOP 10 !

    为了引导大家学习 WebSphere 技术,我们邀请 IBM 及各方专家撰写了大量文章、教程、多媒体课件,并整理了许多技术资源专栏。这里集中了 WebSphere 专区最新最热门的 TOP 资源。

    2007 Java TOP 10 !

    2007 年仍然是 Java 技术繁荣的一年,developerWorks 网站的 Java 专区也仍然是最受欢迎的技术专区之一。回顾下 2007 一年中 Java 专区的读者们都在关注于哪些技术热点。我们为大家精心准备的 Java 2007 TOP 10!将为大家呈送上最热门、最经典的文章、教程和系列专栏。

    2007 Linux TOP 10 !

    2007 年到目前为止 Linux 专区发表了大量技术文章和教程。这里,我们特地整理出了其中最受读者欢迎的内容,希望通过这个排行榜,您可以了解有关 Linux 的技术热点,学习相关的开发技巧和最佳实践。

    2007 Open source TOP 10!

    2007 年到目前为止 Open source 专区发表了大量和 Eclipse,PHP,Apache Geronimo,Apache Derby 等流行开源软件项目相关的技术文章、教程和系列专栏。这里,我们特地整理出了其中最受读者欢迎的内容,希望通过这个排行榜,您可以了解这些流行开源软件项目的技术热点,学习相关的开发技巧和最佳实践。

    2007 SOA and Web services TOP 10 !

    SOA 的时代已经来临!SOA 已成为 IT 基础架构发展的必然趋势。在这里,我们将为大家呈送上最热门、最经典的文章、教程、多媒体课堂和系列专栏。

    2007 Web development TOP 10 !

    通过 2007 TOP 10 这个排行榜您可以找到 developerWorks Web 开发技术专区最新最热门的文章、教程和系列专栏。

    2007 XML TOP 10 !

    developerWorks 中国网站 XML 专区在 2007 年上半年里发表了很多和 XML 相关的技术文章、教程、多媒体课堂和专栏。我们特地整理出其中最受读者欢迎的内容,希望通过这个排行榜,您可以了解最新的 XML 的技术热点,学习在如何应用开发中应用 XML 技术的技巧和最佳实践。

    2007 Ajax TOP 10 !

    developerWorks 中国网站 Ajax 技术资源中心在 2007 年上半年里发表了很多和 Ajax 相关的技术文章、教程、多媒体课堂和专栏。我们特地整理出 2007 上半年最受读者欢迎的内容,希望通过这个排行榜,您可以了解最新的 Ajax 技术热点,及与 Ajax 开发相关技术的技巧、最佳实践方面的技术文章与教程。

    查看带宽使用情况

    安装软件ifstat (软件缺点为不能对packet进行查看),简单步骤:

    1、从ifstat站点下载安装程序ifstat-1.1.tar.gz

    (上面的地址好像不能用了,从CU上面下载的:

    wget http://down1.chinaunix.net/distfiles/ifstat-1.1.tar.gz .)

    2、安装

    # tar zxvf ifstat-1.1.tar.gz
    # cd ifstat-1.1
    # ./configure
    # make
    # make install

    安装完成后运行  ifstat 即可,即可开始刷屏:

    ifstat
           eth0                eth1      
     KB/s in  KB/s out   KB/s in  KB/s out
        0.34      0.29      0.00      0.00
        0.00      0.11      0.00      0.00
        0.06      0.11      0.00      0.00
        0.19      0.16      0.00      0.00
        0.13      0.11      0.00      0.00
        0.14      0.11      0.00      0.00