作者:人人网架构师 王志亮 人人网UGC团队博客
2010年的6月9日是一个圣战的日子,零点一到就有人开始,好戏也如约在晚上7点发生。人人网战场是SJ的公共主页:http://page.renren.com/sj
对不同人,这个日子意味着不同,滋味也不同。作为人人网技术团队,我们要保证服务能力、用户体验能够应付得了这个挑战。
某一个服务器的能力总有限,为了应付突然增长的读写量,web服务架构、内部服务架构、数据库架构等要能够轻松通过服务器调配来满足。就web服务器而言,我们增加了1倍的机器。现在再回头来看监控的数据,一切显得美好。这个期间整个服务做到了服务能力没有中断。除此之外,在这次圣战中,其中还有一项我们独有的技术起到了重要的作用:rose portal ,下面作一个介绍:
图1是sj的主页:
阅读这个条目剩下部分 »
作者:人人网技术民工 冷昊 人人网UGC团队博客
share.renren.com 已经成为人人网上的一大热门应用,优质的内容通过分享在好友间迅速传播。为了提高站外内容的传播效率,我们试图制定出一套开放内容协议(open graph protocol),任何网页只要遵守该协议,share.renren.com就能从页面上提取最有效的信息并呈现给用户。
下面是协议初稿,有任何意见,请在留言中提出,谢谢!
Protocol Element 协议元素
说明:
1. Null 表示是否允许为空
2. Mult 表示是否允许重复
3. Y 允许
4. N 禁止
作者:人人网技术经理 白伯纯 人人网UGC团队博客
人人网中间层:问题篇
人人网中间层:求解篇
之前的问题篇和求解篇描述了人人网在发展过程中遇到的问题,并且介绍了我们采用中间层来提高性能的解决方案。今天的实践篇将通过一个例子来实现一个中间层服务。
这个服务要达到的目的是快速的查询用户是否有效,数据将要使用bitset保存在内存中,每个用户一位,仅保存正整数约21亿,占用内存256M。 阅读这个条目剩下部分 »
作者:人人网UGC团队成员 刘威 人人网UGC团队博客
面对人人网海量的UGC,数据挖掘工作势在必行,能把用户最想要的信息推荐出来,是我们正在研究的课题之一。在推荐系统中,分类器是个非常重要的部分。
分类器的研究重点落在两个方面,一方面是文本关键词的提取,一方面是对已有关键词或标签的文本进行训练分类。下图为关键词提取在分类器中的位置

下文简单介绍关键词提取常用的方法。 阅读这个条目剩下部分 »
作者:人人网技术民工 冷昊 人人网UGC团队博客
书接上文。
原理篇
Nuclear系统构建于java之上,NIO组件使用Netty,数据序列化使用google的Protocol Buffers,Spring当然是用了的。下图是Nuclear系统内部的一个预览:

嗯……其实这张图对各位看官意义不大,只是罗列出了Nuclear中的各个组件及简单的层次关系。下面着重分析分区、节点增减、路由的原理。
分区
前文讲到,我们是一个分布式的Key-Value存储系统,那么key对应的数据分布在什么节点上,需要遵守一定的规则。熟悉Memecached Client的同学一定清楚一致性Hash的应用,没错,Hash Ring就是我们的不二选择。在Nuclear中,数据分布在0~264的Hash Ring上,Nuclear集群初始化的时候,根据节点数均分整个Hash Ring。如下图所示: 阅读这个条目剩下部分 »
作者:人人网技术民工 冷昊 人人网UGC团队博客
书曰:工欲善其事,必先利其器。人人网作为国内第一大SNS网站,欲存海量UGC数据,必有海量存储系统。Nuclear存储系统在高性能、高可靠、可扩展的海量数据存储需求下横空出世,待小的给列位看官慢慢道来。
缘由篇
看过《人人网使用的开源软件列表》一文的看官一定知道人人网的关系型数据库使用的是MySQL,Key-Value存储使用的是Tokyo Cabinet,话说战斗在第一线的UGC Team的兄弟们发现,MySQL虽然已经被我们用上了散库、散表大法,但是每次数据达到服务器负载临界值时,必然得经过一番迁移数据的剧痛;使用TC也会存在这个问题,且TC只在某些特定的应用场景起作用。于是乎,我们开始需找能满足高性能、高可靠、可扩展等特性,同时能符合UGC应用场景的存储系统,下表列出我们的考察对象及需求。

阅读这个条目剩下部分 »
作者:人人网技术经理 白伯纯 人人网UGC团队博客
书接上文,为了提高性能,在人人网的技术结构中,在数据库和页面之间,有中间层。中间层高性能的基础是用内存代替磁盘。
用内存代替磁盘
数据库系统的最大瓶颈在磁盘IO,大量的小数据请求不是磁盘的强项。人人网中间层服务就是利用了内存代替硬盘的方法来提高整体性能。有了这层服务以后,以前的数据库关联查询被提前计算并缓存,需要访问时直接获取。
通用的Memcached缓存方案也有些不足,数据不能自己变化,也不能部分变化。于是人人网选择了自己实现缓存的方式。
在自己实现缓存的过程中,管理内存相对容易,通信协议是比较复杂的部分,我们在这方面选择了开源的Ice通信框架(http://www.zeroc.com)来完成繁琐的工作,至今它都工作的很好。
Ice通信框架在人人网完成了两件事,通信和定位。客户端通过IceGrid组件定位到需要的服务地址,将请求发送到中间层服务,中间层服务将结果返回。客户端只需要知道一个地址就可以找到所有的服务;同时,众多服务也可以在不同的服务器之间随意迁移。在现在的人人网有超过500个Ice写成的中间层服务在运行。 阅读这个条目剩下部分 »
作者:人人网技术经理 白伯纯 人人网UGC团队博客首发
由开源软件组成的系统
与很多大型的网站一样,人人网的系统全部是由开源软件构建的。使用Nginx做前端接入,resin做容器,Memcached做通用cache,MySQL做数据库,使用Linux操作系统。
除了上述的部分外,人人网还有一个与众不同的中间层。中间层以服务的形式存在,位于MySQL和resin中间,提供高并发低成本的数据访问层。
数据库的压力
在上述结构系统中,数据库的性能往往成为系统瓶颈。人人网在发展的过程中不断重构,改变最大的就是数据库部分。大概的步骤是“优化SQL”,“业务拆分”,“垂直拆分”和“水平拆分”几个阶段,关于数据库优化的细节将来再引用到这里。 阅读这个条目剩下部分 »
作者:人人网架构师 王志亮 人人网UGC团队博客首发
小的不才,斗胆发言
多角度定义架构
定义架构的最短形式是:“架构是一种结构”,太棒了,这是一种正确的理解,但世界还没太平。若做一个比喻,架构就像一个操作系统,不同的角度有不同的理解,不同的关切者有各自的着重点,多视点的不同理解都是架构需要的,也只有通过多视点来考察才能演化出一个有效的架构。 阅读这个条目剩下部分 »
作者:人人网架构师 张洁 人人网UGC团队博客首发
MySQL
关系型数据库存储系统,我们的DBA团队很强大,每人管理上百台MySQL服务器,其他就不多说了,网上资料太多了
Tokyo Cabinet
一个key-value的存储引擎,日本人开发,国内很多公司也开始使用,我们内部很多地方也用它来代替MySQL来做存储,比如我们的搜索结果页的用户资料,就是用它来做一层MySQL外的冗余存储,目的是加快搜索结果页的显示。在key-value并需要持久 阅读这个条目剩下部分 »