from: http://www.lanceyan.com/tech/arch/consistenthashing_and_solr.html互联网创业中大部分人都是草根创业,这个时候没有强劲的服务器,也没有钱去买很昂贵的海量数据库。在这样严峻的条件下,一批又一批的创业者从创业中获得成功,这个和当前的开源技术、海量数据架构有着必不可分的关系。比如我们使用mysql、nginx等开源软件,通过架构和低成本服务器也可以搭建千万级用户访问量的系统。新浪微博、淘宝网、腾讯等大型互联网公司都使用了很多开源免费系统搭建了他们的平台。所以,用什么没关系,只要能够在合理的情况下采用合理的解决方案。那怎么搭建一个好的系统架构呢?这个话题太大,这里主要说一下数据分流的方式。比如我们的数据库服务器只能存储200个数据,突然要搞一个活动预估达到600个数据。可以采用两种方式:横向扩展或者纵向扩展。纵向扩展是升级服务器的硬件资源。但是随着机器的性能配置越高,价格越高,这个代价对于一般的小公司是承担不起的。横向扩展是采用多个廉价的机器提供服务。这样一个机器只能处理200个数据、3个机器就可以处理600个数据了,如果以后业务量增加还可以快速配置增加。在大多数情况都选择横向扩展的方式。如下图:现在有个问题了,这600个数据如何路由到对应的机器。需要考虑如果均衡分配,假设我们600个数据都是统一的自增id数据,从1~600,分成3堆可以采用 id mod 3的方式。其实在真实环境可能不是这种id是字符串。需要把字符串转变为hashcode再进行取模。目前看起来是不是解决我们的问题了,所有数据都很好的分发并且没有达到系统的负载。但如果我们的数据需要存储、需要读取就没有这么容易了。业务增多怎么办,大家按照上面的横向扩展知道需要增加一台服务器。但是就是因为增加这一台服务器带来了一些问题。看下面这个例子,一共9个数,需要放到2台机器(1、2)上。各个机器存放为:1号机器存放1、3、5、7、9 ,2号机器存放 2、4、6、8。如果扩展一台机器3如何,数据就要发生大迁移,1号机器存放1、4、7, 2号机器存放2、5、8, 3号机器存放3、6、9。如图:从图中可以看出 1号机器的3、5、9迁移出去了、2好机器的4、6迁移出去了,按照新的秩序再重新分配了一遍。数据量小的话重新分配一遍代价并不大,但如果我们拥有上亿、上T级的数据这个操作成本是相当的高,少则几个小时多则数天。并且迁移的时候原数据库机器负载比较高,那大家就有疑问了,是不是这种水平扩展的架构方式不太合理?—————————–华丽分割线—————————————一致性hash就是在这种应用背景提出来的,现在被广泛应用于分布式缓存,比如memcached。下面简单介绍下一致性hash的基本原理。最早的版本 http://dl.acm.org/citation.cfm?id=258660。国内网上有很多文章都写的比较好。如: http://blog.csdn.net/x15594/article/details/6270242下面简单举个例子来说明一致性hash。准备:1、2、3 三台机器还有待分配的9个数 1、2、3、4、5、6、7、8、9一致性hash算法架构步骤一、构造出来 2的32次方 个虚拟节点出来,因为计算机里面是01的世界,进行划分时采用2的次方数据容易分配均衡。另 2的32次方是42亿,我们就算有超大量的服务器也不可能超过42亿台吧,扩展和均衡性都保证了。二、将三台机器分别取IP进行hashcode计算(这里也可以取hostname,只要能够唯一区别各个机器就可以了),然后映射到2的32次方上去。比如1号机器算出来的hashcode并且mod (2^32)为 123(这个是虚构的),2号机器算出来的值为 2300420,3号机器算出来为 90203920。这样三台机器就映射到了这个虚拟的42亿环形结构的节点上了。三、将数据(1-9)也用同样的方法算出hashcode并对42亿取模将其配置到环形节点上。假设这几个节点算出来的值为 1:10,2:23564,3:57,4:6984,5:5689632,6:86546845,7:122,8:3300689,9:135468。可以看出 1、3、7小于123, 2、4、9 小于 2300420 大于 123, 5、6、8 大于 2300420 小于90203920。从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个Cache节点上。如果超过2^32仍然找不到Cache节点,就会保存到第一个Cache节点上。也就是1、3、7将分配到1号机器,2、4、9将分配到2号机器,5、6、8将分配到3号机器。这个时候大家可能会问,我到现在没有看见一致性hash带来任何好处,比传统的取模还增加了复杂度。现在马上来做一些关键性的处理,比如我们增加一台机器。按照原来我们需要把所有的数据重新分配到四台机器。一致性hash怎么做呢?现在4号机器加进来,他的hash值算出来取模后是12302012。 5、8 大于2300420 小于12302012 ,6 大于 12302012 小于90203920 。这样调整的只是把5、8从3号机器删除,4号机器中加入 5、8。同理,删除机器怎么做呢,假设2号机器挂掉,受影响的也只是2号机器上的数据被迁移到离它节点,上图为4号机器。大家应该明白一致性hash的基本原理了吧。不过这种算法还是有缺陷,比如在机器节点比较少、数据量大的时候,数据的分布可能不是很均衡,就会导致其中一台服务器的数据比其他机器多很多。为了解决这个问题,需要引入虚拟服务器节点的机制。如我们一共有只有三台机器,1、2、3。但是实际又不可能有这么多机器怎么解决呢?把 这些机器各自虚拟化出来3台机器,也就是 1a 1b 1c 2a 2b 2c 3a 3b 3c,这样就变成了9台机器。实际 1a 1b 1c 还是对应1。但是实际分布到环形节点就变成了9台机器。数据分布也就能够更分散一点。如图:写了这么多一致性hash,这个和分布式搜索有什么半点关系?我们现在使用solr4搭建了分布式搜索,测试了基于solrcloud的分布式平台提交20条数据居然需要几十秒,所以就废弃了solrcloud。采用自己hack solr平台,不用zookeeper做分布式一致性管理平台,自己管理数据的分发机制。既然需要自己管理数据的分发,就需要考虑到索引的创建,索引的更新。这样我们的一致性hash也就用上了。整体架构如下图:建立和更新需要维持机器的位置,能够根据数据的key找到对应的数据分发并更新。这里需要考虑的是如何高效、可靠的把数据建立、更新到索引里。备份服务器防止建立服务器挂掉,可以根据备份服务器快速恢复。读服务器主要做读写分离使用,防止写索引影响查询数据。集群管理服务器管理整个集群内的服务器状态、告警。整个集群随着业务增多还可以按照数据的类型划分,比如用户、微博等。每个类型按照上图架构搭建,就可以满足一般性能的分布式搜索。对于solr和分布式搜索的话题后续再聊。扩展阅读:java的hashmap随着数据量的增加也会出现map调整的问题,必要的时候就初始化足够大的size以防止容量不足对已有数据进行重新hash计算。疫苗:Java HashMap的死循环 http://coolshell.cn/articles/9606.html一致性哈希算法的优化—-关于如何保正在环中增加新节点时,命中率不受影响 (原拍拍同事scott)http://scottina.iteye.com/blog/650380语言实现:http://weblogs.java.net/blog/2007/11/27/consistent-hashing java 版本的例子http://blog.csdn.net/mayongzhan/archive/2009/06/25/4298834.aspx PHP 版的例子http://www.codeproject.com/KB/recipes/lib-conhash.aspx C语言版本例子
曾经我们都是被雷锋包围的人,小时候,听到最多的就是雷锋、赖宁……现在雷锋再次响起来了,靠一个口号,还能干什么啊!原文:三月里有这么一天,属于一个死去多年的人。三月五日,因为毛泽东的题词而被官方钦定为一个盛大节日。这个“节日”,在大陆中国人的生活中一直是一个坎儿,总要“跨一下”才能迈过去。雷锋,在22岁那年死于意外伤害,如果活到现在,已经是72岁高龄的老人了。他也确实老了,进京领受光荣的雷锋班班长抱怨:孩子们已经不认识雷锋了。作为一个神圣的精神符号,雷锋一直搅动着许多人的神经。当好人,做好事,他们理解的雷锋便是这样。问题在于,这样的理解绝非官方所乐见,他们总要加一个不容置疑的定语在前头:永远跟党走,把党的温暖送到千家万户。听党的话的人,才叫好人;做为党争光的事,才能叫好事。雷锋的解释权在意识形态掌控者手里,他们绝不会放任他被矮化为一个泛爱志愿者。真假难辨的“雷锋日记”以及诸多“平凡而伟大”的英雄事迹,塑造的就是一个具有高度党性原则的“毛泽东的好战士”,无条件听从党的指令,以为党献身为最高目的的“革命烈士”。雷锋显得非常纯粹,因平凡而有说服力,因忠诚而令人自惭形秽。在他面前,每个人都很纠结:既膜拜又嫉妒。我们为什么不能心无杂念,把自己锻造成为坚定的共产主义战士,毛主席的好学生?这是一道考题,给予人无限的憧憬:如果你愿意,你也能。雷锋可以无穷地复制下去。这是文宣操盘手最得意的阳谋:让你误以为够得着,你就会模仿去做。孤儿雷锋,在新政权启发下,迅速完成了革命化的进程,他接受了阶级社会和阶级斗争的概念,爱憎分明:将亲人之死怪罪于以前的社会,不幸的根源在于存在一个“剥削阶级”,他们的本质是吸血鬼,只有将他们铲除干净,才有好日子过;带给穷苦大众好日子和奔头的,是共产党和毛主席——在当时的宣传语境里,共产党其实就是毛主席的党,毛主席就是全能的神祗,他创造了万物,又被万物所感恩。感恩,然后奉献生命,就是人民中国主人翁们的天职和使命。通过否定历史和宗教,也借助血腥的祭祀,新政权把寄生麾下的人民变成了精神孤儿。他给予他们一个崭新的主:革命领袖毛主席。膜拜,服从,牺牲,信众前面只有华山一条路。一个渴望向上爬的人必然走到雷锋那一步。所以,雷锋是自我趋附与政权塑造的产物,不存在一个赤子雷锋。他所做的一切都是规定动作,不过他做得更可爱些罢了。读“雷锋日记”,我看到的是一个极度自虐和受虐者的表白,他的人生就是用来证明忠诚的。在一次次被组织确认的过程中,他获得了极大的快感。他得到了自我实现,书写那些多情的文字,一点也不会痛苦,反而充满了莫名的快乐。向组织交心是痛苦的,但交出去之后却是兴奋。因为能被信任而得到交心的机会,这才是归属感的获得。自己人,同志,获得这样的认可,意味着一个年轻人不可限量的前途。雷锋正在向风光无限好的高处攀去。写日记就是给组织看。整个社会处于“做好事表忠心”的全面竞争状态,谁做得极端谁就有机会。写日记就是自我表现,准备被伯乐“发现”。那时的英雄都有一本日记:记录自己学习毛泽东思想狠斗私字,灵魂深处爆发革命,脱离低级趣味,成为革命战士的过程。那样做,是怀有出人头地的梦想:期待出现奇迹,从而改变命运。“雷锋日记”既出,一个私密的文体便沦落为一个无耻的婊子,人们被迫泯灭自己的内心生活,把一颗扭曲的心交给了魔鬼。当时,人群被强行分成两类:地富反坏右牛鬼蛇神和贫下中农革命后代。不甘于灭亡的坏人得有“表现”,才能免于更残酷的命运;革命后代,谁能出类拔萃,引人注目,就能有机会步步高升。异常策略才能获胜,所以,大家挖空心思,制造奇迹,在为新时代制造祥瑞,人伦惨剧骇人听闻,自镇压反革命、批判胡适、反右到大跃进以后的中国大陆,基本上处于不可理喻的癔症状态。雷锋的出现毫不奇怪。他只是恰巧被看中了。他的死本是一场事故,中止了沈阳军区培养长线大英雄的计划,只得将错就错,提前让“英雄”出笼。他们费心揣摩:一个平凡的士兵应该更合上面胃口。他们押对了宝。这个恭顺、热情,一心向党的战士,得到了毛泽东们的首肯。通过题词,年轻的雷锋被纳入共产主义英雄的谱系之中,而且后来者居上,成为一尊老少皆宜的菩萨英雄。在雷锋身上,完全消灭了欲望,向上爬成为红色接班人的欲望除外。一个二十岁左右的青年,“纯洁”地生活着,令有私欲的人无地自容。他从不会有寂寞、无聊的时候,反省、学习、做好事,我们看到的就是这么一个无欲的英雄,犹如一团烈火,除了燃烧还是燃烧。他的所有缺点都是可爱前提下的瑕疵,甚至因为瑕疵的存在而更显高尚。在他心里有一个光明的世界,被毛泽东思想照耀而自足的世界。生命的摸索,性的尝试,对死亡的恐惧,这些内容一概失踪了。更不存在对未知的探求,真理就是毛主席,每个人所需要的就是相信,无须费力去寻找。一个明亮得单纯得令人窒息的世界:不存在未知,无须知道未知,一切都是已知,是信服。在这样的精神空间里,思想停止发育,人变得“单纯”,实则是愚笨和呆滞。人们那股玩命的工作热情,除了出于表现不得不之外,恐怕也是一种宣泄——压抑的精神总归要有自己的出口。反右,大跃进,疯狂的饥饿,在他身上无一丝痕迹。他永远生活得光明灿烂,还有捐不完的余钱。温柔的温暖的雷锋,抹去了专制黑暗年代的残酷底色,为其涂抹上厚厚一层胭脂,让处于痛苦和饥饿的人望梅止渴,让后来者产生伟大的错觉,以为存在过一个春风般温暖的和谐社会。雷锋和他的缔造者,虚构了一种梦幻般的同志式人际关系。这就是为什么有不少过来人不愿意推倒偶像。雷锋存在的前提是,懒汉辈出,人人不能自立,政府完全失职。在他死后50年后,当局高调重振学雷锋运动,是企图用“雷锋精神”替代信仰缺失,安慰感觉冰冷的人群,让他们重新回到感恩的戏剧情境中去,舍不得离开即将倾覆的泰坦尼克号巨轮。你可以通过行政指令逼迫学生学雷锋,也会有轰轰烈烈的喧闹效果,但最终会激起强烈的厌恶感,他们不可能认同一个虚假的偶像。我读“雷锋日记”时,体验到非常可怕的荒谬感。强行推行学雷锋,必然造成青少年人格分裂,强化整个社会的伪饰作假风气。解决政权合法性危机,正途是还政于民,真心建设公民社会,而非回到愚昧的感恩社会。执政者要下决心剥离祖国和政权的畸形捆绑关系,从自我神化和强迫国民畏惧自己的状态中解脱出来,你只是一届政府,不是祖国的化身,更不可能是上帝。政治不文明,则社会无道德。即使退一万步,雷锋式的“做好事”绝不是行善。爱人之善发自内心,鼓励人向善的宗教信仰是其源泉,他不为外在目的而生。心端正了,无道德社会才有可能逐步转向道德社会。毫无疑问,雷锋是黑暗专制时代的病态样本,是一个主体性丧失的悲剧人物。在这个甘于做驯服工具和螺丝钉的人身上,不会存在什么道德富矿。在薄熙来的“唱红打黑”破产之后,彻底抛弃那个年代的“政治遗产”,切断与毛泽东时代脐带联系,已经成为考验当权者有无勇气前行的试金石。一个人人渴慕的新新中国,容不得任何一尊愚民之神。来源:FT中文网链接:http://www.ftchinese.com/story/001043439