我为什么依然相信Bitcoin?

2011年6月20日,一个像偷袭珍珠港一样臭名昭著的日子,Bitcoin最大的交易网站MT.GOX受到黑客破解和攻击,将这种虚拟货币对美元的汇率从18美元打到了0.01美元,随后,MT.GOX承认,它的用户数据库被盗,大量用户名、密码和邮箱暴露在网络上,接下来,情况急转直下:

1、MT.GOX被黑客攻陷之后,宣布停止运营。尽管MG不安全不等于bitcoin本身不安全,但Bitcoin最大的交易市场关闭了,也就是说,虚拟世界与现实世界货币交换的主要通道堵死了。Bitcoin没有了参考价,其它小的交易市场价格也就缺少了风向标。头羊已死,羊群四散。这就是比特币面临的主要困境。

2、挖矿难度空前增加,这是致命的。随着越来越多的人加入挖矿大军,挖矿的难度系数空前增加。以全球最大的deepbit.net矿场为例,从6月4到6月20日,挖矿难度已经从607,153,增加到849,607。更可怕的是,6月25日,这一难度已经增加到1,379,223!

3、产能下降,挖矿有入不敷出的趋势。随着挖矿难度的增加,挖矿效率几何级数降低。笔者在6月4日,安装一台矿机,显卡是:6990×2,运算能力是1400Mh/s,这台机器运行之后,初期每天产量是3btc,随后下降到2.6btc,6月25日起,这一数字下降到了0.89BTC! 产能至少下挫了70%!令人气结。

4、比特币热度开始消散。跟5月底6月初,人们趋之若鹜相比,现在讨论Bitcoin的人明显减少,比特币的声誉也一落千丈。对于Bitcoin这个游戏来说,依赖于用户的信心,如果信心下跌,那么它的价值也就下降。

目睹了以上种种不利局面,Bitcoin还有希望吗?

我的回答是:有!

计算机专家会从比特币算法、安全性等方面来论述这种虚拟货币存在的合理性。但我是从哲学角度来看这一问题的。

Bitcoin是人类社会产生的一种反规训手段。

规训这一词,来自福柯的《规训与惩罚》。福柯研究人类社会的发展后,敏锐地发现,人类社会的管理从公开严厉的惩罚,慢慢向更加精巧细致的方向发展。以前是游街示众、公开处决,用这种赤裸裸的暴力形式,恐吓市民们顺服。后来,社会文明了,不再把血淋淋的刑罚当众展示,而是换了一种升级版的管理方式。通过校规、制度、打卡、监控等手段,让人们心里慢慢形成规矩。这好比,一所监狱,以前用高墙铁丝网围住,后来科技进步了,换成了一种杀伤力极大的电磁墙,墙看上去并不存在,但只要穿过去就立仆,问题在于,这面电磁墙并不是每时每刻都通电的。对于犯人们来说,有形的高墙固然可怕,但是能人们还是可以越狱。但无形的墙,几乎是不能穿越的。尽管它不一定通电,但穿过的代价可能就是死亡。用这样的办法,这面墙就竖在人们心里。惩罚变成了规训。

英国哲学家边沁,1785年设计了一种新型监狱Panopticon,一般翻译成“全景观察屋”。这种监狱,四围全是一个个透明的囚室,在中间设置一个观察屋,屋里的看守可以看见每个囚室内的情况,囚室里却看不到看守,也不知道看守是否在盯着自己。边沁相信,依靠这样的设计,就可以用很少的看守来看管很多犯人。因为犯人吃不准看守是不是在盯着自己,他的行为就会自我约束。不要以为这是哲学家的空想,边沁一辈子推销自己这套设计方案,由于议会反对,才没有实施。不过他的理想在200年以后实现了,阿根廷就建了这样一所监狱。

福柯深受“全景观察屋”的启发,他进一步发现,边沁所设想的治理结构,在人类社会已经普遍实施。学校、军队、工厂、公司,凡是有人的地方,都可以用这种精巧的办法来控制。不是惩罚,而是对于惩罚的恐惧约束了人们的行为,不是外部监控,而是内在的审查,让人们俯首贴耳。

边沁和福柯精准地预言了现代监控社会的产生,如今借助电子手段,个体已经无处藏身。摄像头、银行、电话线、光纤、电波组成了一个密不透风的大网。监控无处不在,又让人感觉不、出来。除非你成为重点关注的目标,你照常可以出门、会客、开车、乘机、转账、通话、博客、微博……,但一旦监控者认为必要,这张大网就可以瞬间收紧。在失去自由之前,你是自由的,在被剥夺权利之前,你拥有法律赋予的权利。

在现代社会里,信息和资金的流动,比人和物的流动还要重要。一旦信息和金融处于监控之下,社会将真的变成铁板一块。近在眼前的例子是,全球范围内,监控的大网都在收紧。当阿桑奇的wikileak威胁到美国利益的时候,美国政府立即给paypal施压,终止了wikileak的帐号,从而切断了同情者给wikileak捐款的渠道。

每一种控制力量都会产生它的反作用力。Bitcoin就是反抗社会监控的产物。Bitcoin的诞生,使得突破全球资本主义的密集监控成为可能。Bitcoin基于P2P协议,不用通过第三方,资金的流动匿名且不受监控。这为西方世界的社会变革提供了新的突破口。

目前,wikileak已经开始接收Bitcoin捐赠,这是一个良好的开端。Bitcoin的应用,当然不局限于捐款赞助,它还将更多地用于劳务交换,想象一下,当人们用BTC购买孕育新思想的书籍,购买服务器,雇佣美工设计网站,招募程序员开发iOS应用的时候,Bitcoin的春天才刚刚开始,而目前不过是冻雷惊笋的时刻,要坚定信心,要耐心等待。

彩虹,只显现给那些在暴风雨中没有丧失心智、没有沉沉睡去的人。

ThinkPad系统安装记录

最近的一段时间很久没写东西了,一方面是在倒腾新买的电脑( Lenovo ThinkPad W520 37U ),一方面是在学习 Python 。下面来说说自己的 ThinkPad 系统安装历程。

买来的 Thinkpad 的硬盘有500G,不用来折腾安装操作系统实在是有些浪费。下面就来说说怎样安装系统。买来的电脑中自带的是 Windows 7 Professional 英文版的,无奈Professional版的不支持直接在系统总更改语言包,貌似只有 企业版( Enterprise )和旗舰版( Ultimate )支持更换语言。尝试了N遍以后决定重装系统。

重装系统的时候一开始考虑要安装一下系统:

Windows XP SP3 2bit Windows 7 Ultimate 64bit Ubuntu 11.04 amd64 Mac OS X Lion

于是就是安装文件的下载了,考虑到自己的电脑是联想出版的,所以首先考虑的是看下网上是否有联想 OEM 版的系统下载,然后刻录成安装光盘。

以下为收集的系统下载链接:

联想 Windows XP SP3 32位(联想官方下载链接) 联想.OEM.win7.64位.旗舰版.DIY(网友自己制作的版本,电驴链接) Ubuntu 11.04(Ubuntu官网链接) Mac OS X Lion(正式版还没有发布,先不安装)

安装顺序需要先确定好,为了能使系统正常的引导和顺利的安装,所以安装顺序必须是 […]

博客,几年之痒?

我们常说夫妻之间有七年之痒,这个大家都知道,在经历了一段风风雨雨后,没有了热恋时的激情,婚姻进入了平淡期,也就到达了这七年之限的瓶颈。我还没有结婚,自然不会知道这七年之痒的滋味。但是类比于我熟知的博客,似乎也时不时地能感受到这一阵阵的“瘙痒”。

博客,何痒之有?几年之痒?

我不知道在座的各位看客有没有博客,无论是否独立博客,如果有,博龄又是多久了呢?今天看到毕扬同学的日志,正在纪念他的博客五周年,五周年啊,一个不长不短的日子,但是在博客界,可算是一个高龄的博客了,由衷地佩服他的毅力和精神,居然已经默默耕耘了那么久。

再来看看我自己的博客,根据本站侧边栏记录的网站统计信息,网站已经运行1029天,相当于近三年吧。想当年我也信誓旦旦地号称过要“每日一博”,也确实从09年4月一直到去年年底,我基本上都是每天一篇日志。后来有一个资深的博主和我聊天,他对我说,曾经他对博客也有着这样不灭的激情,但久而久之,总有一天,激情淡了,工作忙了,写博的频率也就低了。当初,我还奋力维护着我对博客的热情。而现在呢?

今年4、5月份以来,我的博客更新频率越来越低,技术文章越来越少,点击量与日俱减,评论数量也直线下降。这是相当让人沮丧的,没了动力,更新自然也就少了,长此以往,恶性循环。难道这就是博客的七年之痒?

回想当初写博客的初衷,没有奢望每天会有过千的访问量,没有幻想每天有几十甚至上百条的评论,如果以这样的平淡之心写博,我想写博客可以更好地坚持下去,一旦掺杂了功利、虚荣等因素在其中,博客就不再是一个载体,而是一个工具,当你觉得这个工具没有利用价值之时,也就是博客的七年之痒之时。

博客,平淡才是真,管它几年之痒!

GNU/Linux下有多少是GNU的?

一个葡萄牙的学生写了一篇文章 《How much GNU is there in GNU/Linux?》 – GNU/Linux下有多少是GNU的。他的这篇文章主要分布了今年4月份的Ubuntu Natty的Linux分发包。其主要是用代码行来做的分析,其给了两个饼图。

第一个饼图如下,其指明了各种主流的开源项目组的分布情况。可见GNU只占了8%,当然,GNome也是GNU的,加起来也只有13%,只占整个分发包很少的比重。

第二个图,作者把GNU的部分拿了出来,再进行了分析:

在下面这个图中,我们可以看到主要是四大块——gcc, gdb, binutils 和 glibc,所以,作者说,这些东西都不是最终用户需要的,不是每一个用户都是需要搞开发的。所以,如果去除这些,再去除Gnome(这个桌面UI也不是很力),那么GNU的东西几乎没有了。

所以,作者以此来挑战Richard Stallman提到的 GNU/Linux的这个说法。好像更为好的说法应该叫——

GNU/KDE/java/xorg/Linux

我对这篇文章有下述一些感觉:

以代码行来衡量重要性,非常的不准确。比尔盖茨说过——“用代码行数来衡量编程的进度,就如同用航空器零件的重量来衡量航空飞机的制造进度一样”(参看《最佳编程语录》),所以,用这个数据来并不一定正确。如果用Linux的各种包的依赖性可能会更好一点。 至少我知道,离开了glibc,可能整个操作系统都会不举。Linux下,绝大多数软件都是gcc/gdb编程和调试出来的(当然,LLVM和Clang正在挑战着gcc编译器),而且大多数软件都在用着GPL的许可证(虽然开源世界的许可证是如此的混乱) 辩证地,我们不能否定GNU的历史价值,同时我们似乎也在看到GNU好像有点萎靡。

老实说,其实叫什么不重要,是GNU/Linux也好,是Ubuntu 也好,还是Android也好,无所谓。Linux的各种分发包中都存在着全世界黑客文化的和开源文化的结晶,每当我看到这样的分布图时(例如:是谁写的Linux?),我心中都有一种说不出来的豪情,这难道不真是一种壮举吗?(Unix黑客文化的真正延伸)。

不管这种方式的软件有没有市场,能不能得到“最终用户”的认可,但这已成为了软件开发的一种精神——那种不分彼此,相互协作的精神,不是吗?

(全文完)

相关文章 2009年06月30日 — Ksplice Uptrack — Ubuntu更新不用重启 2009年04月13日 — Ubuntu的并行启动 2011年07月18日 — 程序员技术练级攻略 2011年05月19日 — 在Web上运行Linux 2011年05月04日 — 狗日的开源软件许可证 2011年04月27日 — Linux 2.6.39-rc3的一个插曲 […]

挖矿去,挖矿去!

《看天下》专栏

【导语】天生不受监管和控制的虚拟货币Bitcoin,被称为“人类有史以来最危险的项目”,它的蔓延与流行,催生出一个新的行当--“Bitcoin矿工”。

夜幕下的张江高科像电影《黑客帝国》的场景,灯火迷离,人头晃动,一只黑猫在室外桌下蹿来蹿去,骤然急停,目光与我相撞,顿觉电光火石,令我不敢直视。习习晚风中,我和Virushuo已经对坐谈了一个多小时。

我们谈论的话题只有一个:Bitcoin(比特币)。那是什么东西?一个幽灵,一个无政府的幽灵在欧洲大地游荡。

Bitcoin是一个P2P开源项目,它可能是人类有史以来最危险的发明,因为这个项目如果成功的话,将会动摇当今统治世界的三大力量之一的金融(根据Negri和Hdart的帝国理论,其余两大力量是军事和媒体)。在现实社会中使用货币,无论是刷卡还是付现金,买卖双方之间都离不开银行。更不存在一种东西叫网络货币,我们在网上交易,无论是用Paypal还是支付宝,都不可能绕过第三方中间机构,而不被追踪到。但这一切可能都将终结,历史也许会翻开新的一页,因为Bitcoin来了。

Bitcoin是一种基于点对点网络的匿名数字货币,由计算机按照公开的算法分布运算产生,汇款通道不受中央控制,货币转帐是由网络节点进行集体管理,交易各方可以隐藏自己的真实身份。xiaolai在博客中说:“用大白话简单地讲,Bitcoin就是一种电子货币——只不过,这种崭新的电子货币不受任何政府、任何银行的控制。”

尽管迄今为止全部公开资料显示,这种货币的发明者是一个貌似是日本人的程序员中本聪(Satoshi Nakamoto),但几乎所有的人都不相信这是一个真身份,Virushuo推测,真正的发明者很可能是俄罗斯人。这不仅因为俄罗斯盛产精通数学、计算机和经济学的天才,而Bitcoin的精妙算法显然离不开这三种能力的综合,而且因为目前网络上讨论Bitcoin最活跃的语种是俄语。

“黑帮,只有黑帮才需要这样一种虚拟货币!”Virushuo眼里显出黑猫一样的光亮,“也只有黑帮才能用暴力推行这种货币。”

在他的描述下,我眼前出现了一个与传统警匪片截然不同的画面。在一个废弃的码头,两伙黑帮相遇,一方拿出一个提箱,另一方拿出一台笔记本电脑。一方开箱、用匕首沾着白粉品尝,另一方打开电脑,连上Bitcoin客户端,填入一串收款地址和金额,然后点击发送……

当然,Bitcoin不仅是黑帮可以用,广大善良无辜的群总也可以用。目前,可以用它来购买服务器空间,也可以用来购买别人的服务,例如雇佣程序员来写一段代码。

这么好的东西,我怎么才能得到呢?最原始、最有效的办法就是“挖矿”。这是一种形象的说法,实际上就是在电脑下载一个客户端,利用CPU或者显卡GPU的能力,来参与到Bitcoin网络的计算中,并获得一定的报酬。不是所有的电脑都适合挖矿,你需要升级硬件,其中,主要是显卡。

Virushuo用1500元购买了一块二手的ATI5870显卡,这款显卡经测评挖矿效率很高,他还更换了机箱与电源,由于温度太高,噪音太大,他用半导体制冷片做了一个机箱内的空调。这样一台DIY的挖矿机,功率全开,每天可以挖到0.6个Bitcoin,按照市场上的参考价,这大约可以兑换4-5美元。也就是说,如果行情不跌的话,至多2个月就可以收回在显卡上的投资。xiaolai的挖矿经历证实了这种说法。他说:“我现在2个显卡(6970)一天大约1个多一点点,大约3个月可以回收显卡的成本。”

事实上,随着参与人数的增多,显卡变得越来越贵,挖矿变得越来越难。计算机算法保证了Bitcoin的稀缺性,在未来100年之内,全系统的Bitcoin总数不会超过2100万个。而现在国外,已经有24台机器48张显卡组成的计算阵列横空出世,照这个趋势发展下去,个人挖矿连电费都可能赚不回来。

不过Virushuo对此持乐观态度,他认为,不要指望通过挖矿发财,Bitcoin是迄今为止人类最大胆的试验,我们不应当错过这个好玩的游戏。

那么,什么是比特币(Bitcoin)?Bitcoin是一次计算机极客的试验,也是一次暴富的机会,是一词费电的豪赌。

但它更可能是一个巨大的老鼠仓,一次超级投机,荷兰郁金香、英国北海石油、大陆君子兰的网络版,乌合之众的狂欢,小市民的破产诱饵,世界经济的定时炸弹,人类理性的破坏剂,也是智商和财商的试金石。

挖矿去,走,一起挖矿去!

构建大型网站(百万级访问量)的技术准备

对互联网有了解的人都有自己的想法,有人就把想法付诸实现,做个网站然后开始运营。其实从纯网站技术上来说,因为开源模式的发展,现在建一个小网站已经很简单也很便宜。当访问量到达一定数量级的时候成本就开始飙升了,问题也开始显现了。因为带宽的增加、硬件的扩展、人员的扩张所带来的成本提高是显而易见的,而还有相当大的一部分成本是因为代码重构、架构重构,甚至底层开发语言更换引起的,最惨的就是数据丢失,辛辛苦苦好几年,一夜回到创业前。

减少成本就是增加利润。很多事情,我们在一开始就可以避免,先打好基础,往后可以省很多精力,少操很多心。

假设你是一个参与创业的技术人员,当前一穷二白,什么都要自己做,自己出钱,初期几十万的资金,做一个应用不是特别复杂的网站,那么就要注意以下几点:

一、开发语言

一般来说,技术人员(程序员)创业都是根据自己技术背景选择自己最熟悉的语言,不过考虑到不可能永远是您一个人写程序,这点还得仔细想想。无论用什么语言,最终代码质量是看管理,所以我们还是从纯语言层面来说实际一点。现在流行的java、php、.net、python、ruby都有自己的优劣,python和ruby,现在人员还是相对难招一些,性能优化也会费些力气,.net平台买不起windows server。java、php用的还是最多。对于初期,应用几乎都是靠前端支撑的网站来说,php的优势稍大一些,入门简单、设计模式简单、写起来快、性能足够等,不过不注重设计模式也是它的劣势,容易变得松散,隐藏bug稍多、难以维护。java的优势在于整套管理流程已经有很多成熟工具来辅助,强类型也能避免一些弱智BUG,大多数JAVA程序员比较注重设计模式,别管实不实际,代码格式看起来还是不错的。这也是个劣势,初学者可能太注重模式而很难解决实际需求。

前端不只是html、css这类。整个负责跟用户交互的部分都是前端,包括处理程序。这类程序还是建议用php,主要原因就是开发迅速、从业人员广泛。至于后端例如行为分析、银行接口、异步消息处理等,随便用什么程序,那个只能是根据不同业务需求来选择不同语言了。

二、代码版本管理

如果开发人员之间的网络速度差不多,就SVN;比较分散例如跨国,就hg。大多数人还是svn的.

假设选了svn,那么有几点考虑。一是采用什么树结构。初期可能只有一条主干,往后就需要建立分支,例如一条开发分支,一条上线分支,再往后,可能要每个小组一个分支。建议一开始人少时选择两条分支,开发和线上,每个功能本地测试无误后提交到开发分支,最后统一测试,可以上线时合并到上线分支。如果喜欢把svn当做移动硬盘用,写一点就commit一次也无所谓,就是合并的时候头大一些,这些人可以自己建个分支甚至建立个本地代码仓库,随便往自己的分支提交,测试完毕后再提交到开发分支上。

部署,可以手工部署也可以自动部署。手工部署相对简单,一般是直接在服务器上svn update,或者找个新目录svn checkout,再把web root给ln -s过去。应用越复杂,部署越复杂,没有什么统一标准,只要别再用ftp上传那种形式就好,一是上传时文件引用不一致错误率增加,二是很容易出现开发人员的版本跟线上版本不一致,导致本来想改个错字结果变成回滚的杯具。如果有多台服务器还是建议自动部署,更换代码的机器从当前服务池中临时撤出,更新完毕后再重新加入。

不管项目多小,养成使用版本管理的好习惯,最起码还可以当做你的备份,我的 http://zhiyi.us 虽然就是一个wordpress,可还是svn了,只改动一两句css那也是劳动成果。

三、服务器硬件

别羡慕大客户和有钱人,看看机房散户区,一台服务器孤独的支撑的网站数不清。如果资金稍微充足,建议至少三台的标准配置,分别用作web处理、数据库、备份。web服务器至少要8G内存,双sata raid1,如果经济稍微宽松,或静态文件或图片多,则15k sas raid1+0。数据库至少16G内存,15k sas raid 1+0。备份服务器最好跟数据库服务器同等配置。硬件可以自己买品牌的底板,也就是机箱配主板和硬盘盒,CPU内存硬盘都自己配,也可以上整套品牌,也可以兼容机。三台机器,市场行情6、7万也就配齐了。

web服务器可以既跑程序又当内存缓存,数据库服务器则只跑主数据库(假如是MySQL的话),备份服务器干的活就相对多一些,web配置、缓存配置、数据库配置都要跟前两台一致,这样WEB和数据库任意一台出问题,把备份服务器换个ip就切换上去了。备份策略,可以drbd,可以rsync,或者其他的很多很多的开源备份方案可选择。rsync最简单,放cron里自己跑就行。备份和切换,建议多做测试,选最安全最适合业务的,并且尽可能异地备份。

四、机房

三种机房尽量不要选:联通访问特别慢的电信机房、电信访问特别慢的联通机房、电信联通访问特别慢的移动或铁通机房。那网通机房呢?亲,网通联通N久以前合并改叫联通了。多多寻找,实地参观,多多测试,多方打探,北京、上海、广州等各个主节点城市,还是有很多优质机房的,找个网络质量好,管理严格的机房,特别是管理要严格,千万别网站无法访问了,打个电话过去才知道别人维护时把你网线碰掉了,这比DOS都头疼。自己扯了几根光纤就称为机房的,看您抗风险程度和心理素质了。机房可以说是非常重要,直接关系到网站访问速度,网站访问速度直接关系到用户体验,我可以翻墙看风景,但买个网游vpn才能打开你这个还不怎么知名的网站就有难度了。或许您网站的ajax很出色,可是document怎么也不ready,一些代码永远绝缘于用户。

五、架构

初期架构一般比较简单,web负载均衡+数据库主从+缓存+分布式存储+队列。大方向上也确实就这几样东西,细节上也无数文章都重复过了,按照将来会有N多WEB,N多主从关系,N多缓存,N多xxx设计就行,基本方案都是现成的,只是您比其他人厉害之处就在于设计上考虑到缓存失效时的雪崩效应、主从同步的数据一致性和时间差、队列的稳定性和失败后的重试策略、文件存储的效率和备份方式等等意外情况。缓存总有一天会失效,数据库复制总有一天会断掉,队列总有一天会写不进去,电源总有一天会烧坏。根据墨菲定律,如果不考虑这些,网站早晚会成为茶几。

六、服务器软件

Linux、nginx、php、mysql,几乎是标配,我们除了看名字,还得选版本。Linux发行版众多,只要没特殊要求,就选个用的人最多的,社区最活跃的,配置最方便的,软件包最全最新的,例如debian、ubuntu。至于RHEL之类的嘛,你用只能在RHEL上才能运行的软件么?剩下的nginx、php、mysql、activemq、其他的等等,除非你改过这些软件或你的程序真的不兼容新版本,否则尽量版本越新越好,版本新,意味着新特性增多、BUG减少、性能增加。总有些道听途说的人跟你说老的版本稳定。所谓稳定,是相对于特殊业务来说的,而就一个php写的网站,大多数人都没改过任何服务器软件源代码,绝大多数情况是能平稳的升级到新版本的。类似于jdk5到jdk6,python2到python3这类变动比较大的升级还是比较少见的。看看ChangeLog,看看升级说明,结合自己情况评估一下,越早升级越好,别人家都用php6写程序了这边还php4的逛游呢。优秀的开源程序升级还是很负责任的,看好文档,别怕。

七、数据库

几乎所有操作最后都要落到数据库身上,它又最难扩展(存储也挺难)。对于mysql,什么样的表用myisam,什么样的表用innodb,在开发之前要确定。复制策略、分片策略,也要确定。表引擎方面,一般,更新不多、不需要事务的表可以用myisam,需要行锁定、事务支持的,用innodb。myisam的锁表不一定是性能低下的根源,innodb也不一定全是行锁,具体细节要多看相关的文档,熟悉了引擎特性才能用的更好。现代WEB应用越来越复杂了,我们设计表结构时常常设计很多冗余,虽然不符合传统范式,但为了速度考虑还是值得的,要求高的情况下甚至要杜绝联合查询。编程时得多注意数据一致性。

复制策略方面,多主多从结构也最好一开始就设计好,代码直接按照多主多从来编写,用一些小技巧来避免复制延时问题,并且还要解决多数据库数据是否一致,可以自己写或者找现成的运维工具。

分片策略。总会有那么几个表数据量超大,这时分片必不可免。分片有很多策略,从简单的分区到根据热度自动调整,依照具体业务选择一个适合自己的。避免自增ID作为主键,不利于分片。

用存储过程是比较难扩展的,这种情形多发生于传统C/S,特别是OA系统转换过来的开发人员。低成本网站不是一两台小型机跑一个数据库处理所有业务的模式,是机海作战。方便水平扩展比那点预分析时间和网络传输流量要重要的多的多。

NoSQL。这只是一个概念。实际应用中,网站有着越来越多的密集写操作、上亿的简单关系数据读取、热备等,这都不是传统关系数据库所擅长的,于是就产生了很多非关系型数据库,比如Redis/TC&TT/MongoDB/Memcachedb等,在测试中,这些几乎都达到了每秒至少一万次的写操作,内存型的甚至5万以上。例如MongoDB,几句配置就可以组建一个复制+自动分片+failover的环境,文档化的存储也简化了传统设计库结构再开发的模式。很多业务是可以用这类数据库来替代mysql的。

八、缓存

数据库很脆弱,一定要有缓存在前面挡着,其实我们优化速度,几乎就是优化缓存,能用缓存的地方,就不要再跑到后端数据库那折腾。缓存有持久化缓存、内存缓存,生成静态页面是最容易理解的持久化缓存了,还有很多比如varnish的分块缓存、前面提到的memcachedb等,内存缓存,memcached首当其冲。缓存更新可用被动更新和主动更新。被动更新的好处是设计简单,缓存空了就自动去数据库取数据再把缓存填上,但容易引发雪崩效应,一旦缓存大面积失效,数据库的压力直线上升很可能挂掉。主动缓存可避免这点但是可能引发程序取不到数据的问题。这两者之间如何配合,程序设计要多动脑筋。

九、队列

用户一个操作很可能引发一系列资源和功能的调动,这些调动如果同时发生,压力无法控制,用户体验也不好,可以把这样一些操作放入队列,由另几个模块去异步执行,例如发送邮件,发送手机短信。开源队列服务器很多,性能要求不高用数据库当做队列也可以,只要保证程序读写队列的接口不变,底层队列服务可随时更换就可以,类似Zend Framework里的Zend_Queue类,java.util.Queue接口等。

十、文件存储

除了结构化数据,我们经常要存放其他的数据,像图片之类的。这类数据数量繁多、访问量大。典型的就是图片,从用户头像到用户上传的照片,还要生成不同的缩略图尺寸。存储的分布几乎跟数据库扩展一样艰难。不使用专业存储的情况下,基本都是靠自己的NAS。这就涉及到结构。拿图片存储举例,图片是非常容易产生热点的,有些图片上传后就不再有人看,有些可能每天被访问数十万次,而且大量小文件的异步备份也很耗费时间。

为了将来图片走cdn做准备,一开始最好就将图片的域名分开,且不用主域名。很多网站都将cookie设置到了.domain.ltd,如果图片也在这个域名下,很可能因为cookie而造成缓存失效,并且占多余流量,还可能因为浏览器并发线程限制造成访问缓慢。

如果用普通的文件系统存储图片,有一个简单的方法。计算文件的hash值,比如md5,以结果第一位作为第一级目录,这样第一级有16个目录。从0到F,可以把这个字母作为域名,0.yourimg.com到f.yourimg.com(客户端dns压力会增大),还可以扩展到最多16个NAS集群上。第二级可用年月例如,201011,第三级用日,第四级可选,根据上传量,比如am/pm,甚至小时。最终的目录结构可能会是 e/201008/25/am/e43ae391c839d82801920cf.jpg。rsync备份时可以用脚本只同步某年某日某时的文件,避免计算大量文件带来的开销。当然最好是能用专门的分布式文件系统或更专业点的存储解决方案。

原文出处:http://zhiyi.us/

Related posts:

MySQL数据库表结构导出工具 EverNote的系统架构 我的WordPress所使用的Ping […]

如何成为一名黑客

看了《黑客与画家》,于是在网上找到了这篇如何成为黑客的教材。记录下来于大家一起学习。本文由:The Duck Typist 翻译。英文原文在这里:http://catb.org/~esr/faqs/hacker-howto.html

如何成为一名 Hacker

Eric Steven Raymond

Thyrsus Enterprises

Copyright © 2001 Eric S. Raymond <esr@thyrsus.com>

Wang Dingwei <gastlygem(at)gmail.com> 基于 Barret 的翻译更正而成。转载请注明出处。

版本更新历史 版本 1.43 2011-02-07 esr 2011 年以后 Python 比 Perl 更流行了 版本 1.42 2010-10-22 esr 添加了“历史回顾” 版本 1.40 2008-11-03 esr 链接修正 版本 1.39 2008-08-14 esr 链接修正 版本 1.38 2008-01-08 esr 取消将 […]

获取客户端真实IP方法

在讨论获取客户端IP 地址前,我们首先下弄明白的是以下三个的具体含义:REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR

REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。 HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。

$_SERVER[‘REMOTE_ADDR’]; //访问端(有可能是用户,有可能是代理的)IP $_SERVER[‘HTTP_CLIENT_IP’];   //代理端的(有可能存在,可伪造) $_SERVER[‘HTTP_X_FORWARDED_FOR’]; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)

一、没有使用代理服务器的情况:

REMOTE_ADDR = 您的 IP HTTP_CLIENT_IP = 没数值或不显示 HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 最后一个代理服务器 IP HTTP_CLIENT_IP = 代理服务器 IP HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies

REMOTE_ADDR = 最后一个代理服务器 IP HTTP_CLIENT_IP = 代理服务器 IP HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, […]

EverNote的系统架构

我们就先初略的从Evernote 服务的物理构造说起,这里我不会详细的介绍每一个组件。有意思的点会在接下来的文章中详述。

我们先从图片的左上角开始说起,所有的服务器状态截止为2011年5月17日。

网络:几乎所有的Evernote流量都是通过https://www.evernote.com:443 传输的。包括所有的“网络”的活动,还包括基于Thrift的客户端同步服务API 。他每天可以处理1.5亿的HTTPS请求,峰值为250Mbps的流量。(对于我们半夜运营的团队来说,最不幸的是,每天的峰值时间发生在太平洋时间每天的6:30左右)

我们通过主要网络供应商(NTT)和次要供应商(Level 3)使用BGP(边界网关协议)来完全独立的分配流量,在一月份我们的SSL流量达到了老的负载均衡设备的极限后我们就新上了通过Vyatta防火墙过滤的A10 负载均衡,我们很容易的使用一台AX 2500设备来转移服务器故障。但我们准备测试其N +1群集配置以备未来的增长。

碎片:Evernote服务的核心是一组称为“碎片”的服务器组。每一台“碎片”用来保存和处理10万Evernote注册用户的所有数据和流量(Web和API)因为我们有超过900万用户,将有大约有90台“碎片”。

设备上,“碎片”被部署为一对有两个四核英特尔处理器,很多内存和镜像RAID配的置希捷企业级硬盘的SuperMicro盒子。在每个盒子中我们运行了 Debian的 主机管理两个 Xen的 虚拟机。盒子上的主虚拟机运行核心应用程序 Debian + Java 6 + Tomcat + Hibernate + Ehcache +  Stripes + GWT + MySQL (for metadata)/ (元数据)+ hierarchical local file systems (for file data)/本地文件系统层次结构(数据文件)。

盒子上主虚拟机中的所有用户数据使用 DRBD技术 将同步复制到不同盒子的备份虚拟机上。这就意味着每一种用户数据会存在于两台物理服务器中,并有四份拷贝,并且每晚都会备份。如果我们的一台服务器存在问题,我们可以使用Heartbeat在最短的时间内将服务从注虚拟机切换到另一台盒子的备虚拟机上。

因为每个用户的数据汇总在一个虚拟服务器,我可以在没有与外部依赖的情况下独立运行“碎片”, 因此,一台“碎片”出现了问题并不会影响其他“碎片”。

为了连接用户和负载均衡设备,我们在浮躁均衡设备上花了大量的工作来通过UR L或Cookies来寻找对应的“碎片”。

用户信息保存:绝大多数的用户数据存储在单层的NoteStore碎片中,同时他们共享一个主“UserStore”帐户数据库(MySQL)。数据中包含少量的信息,如:用户名、MD5处理过的密码和“碎片”服务器的ID。这些数据足够的小,以至于可以在内存中储存。但是我们还会使用RAID镜像、DRBD复制确保数据备份的高度冗余。

高级图片处理:为了让你在笔记中可以搜索图片,我们每天使用28台8核服务器处理新图片。在忙的时候,一天可以处理130万到140万张图片。目前服务器Linux和Windows一起在使用,但是我们已经计划化把我们把所有的服务器在本月底换成debian系统来解决先前一些很老的问题。

这些服务器运行了我们研发团队自行开发的“先进的图像识别”程序。这个程序清每幅图片,识别文字形区域,然后和“识别引擎”进行匹配,这种识别引擎,比如我们的专业团队制作开发手写识别引擎,其中包括授权给我们商业合作伙伴的技术。

其他服务:我们所有的服务器都位于California,Santa Clara 的两个数据中心,除了我们核心服务的设备以外,我们也有小的服务器群组来处理小的任务,小的服务器群组只要小的服务器群组只要一到两个“盒子”或虚拟机。例如,我们的

SMTP邮件网关服务器就是由两台装有Postfix和一个基于Dwarf 的Java邮件处理程序的debian服务器。我们的@myen Twitter gateway 是一个简单的基于twitter4j的内部服务程序。

我们公司的网站使用的是Apache,公司的博客使用的是WordPress系统,我们大部份使用的拓扑结构交换机来自于惠普 ,我们使用Puppet来进行配置管理,使用Zabbix、Opsview和AlertSite来进行监测性能。我们每晚通过一个千兆的使用比较软件将数据备份到另一个数据中心。

等等,为什么?我知道这个文章留下了明显的问题,比如为什么我们在许多地方选择了X而没有选择Y,为什么我们使用自己的服务器群组而不实用云提供商?为什么我们还在使用一些旧的技术(Java,SQL,local storage等)而不是新的神奇的技术。

这些问题我们会在未来几个月在后面的文章中进行详述,尽情大家期待!

本有由标点符翻译,原文链接(英文):http://blog.evernote.com/tech/2011/05/17/architectural-digest/

[…]

Facebook的系统架构

根据我现有的阅读和谈话,我所理解的今天Facebook的架构如下:

 

Web 前端是由 PHP 写的。Facebook 的 HipHop [1] 会把PHP转成 C++ 并用 g++编译,这样就可以为模板和Web逻贺业务层提供高的性能。 业务逻辑以Service的形式存在,其使用Thrift [2]。这些Service根据需求的不同由PHP,C++或Java实现(也可以用到了其它的一些语言……) 用Java写的Services没有用到任何一个企业级的应用服务器,但用到了Facebook自己的定制的应用服务器。看上去好像是重新发明轮子,但是这些Services只被暴露给Thrift使用(绝大所数是这样),Tomcat太重量级了,即使是Jetty也可能太过了点,其附加值对Facebook所需要的没有意义。 持久化由MySQL, Memcached [3], Facebook 的 Cassandra [4], Hadoop 的 HBase [5] 完成。Memcached 使用了MySQL的内存Cache。Facebook 工程师承认他们的Cassandra 使用正在减少,因为他们更喜欢HBase,因为它的更简单的一致性模型,以到其MapReduce能力。 离线处理使用Hadoop 和 Hive。 日志,点击,feeds数据使用Scribe [6],把其聚合并存在 HDFS,其使用Scribe-HDFS [7],因而允许使用MapReduce进行扩展分析。 BigPipe [8] 是他们的定制技术,用来加速页面显示。 Varnish Cache [9]用作HTTP代理。他们用这个的原因是高速和有效率。 [10]. 用来搞定用户上传的十亿张照片的存储,其由Haystack处理,Facebook自己开发了一个Ad-Hoc存储方案,其主要做了一些低层优化和“仅追加”写技术 [11]. Facebook Messages 使用了自己的架构,其明显地构建在了一个动态集群的基础架构上。业务逻辑和持久化被封装在一个所谓的’Cell’。每个‘Cell’都处理一部分用户,新的‘Cell’可以因为访问热度被添加[12]。 持久化归档使用HBase [13]。 Facebook Messages 的搜索引擎由存储在HBase中的一个倒置索引的构建。 [14] […]

Category

Archives