人人网技术架构介绍人人网·黄晶Guideline人人网架构发展NuclearRose架构发展2006Let’sGetitstartedResinProMySQLInnoDB主从结构单Storage+Squid架构发展2007突飞猛进LVSResinWeb集群大量使用Memcached中间层,基于ICEMySQL集群,垂直分区简单分布式StorageLucence搜索架构发展2008继续突破开放API,SOAMySQL集群,水平分区加强监控和安全DFS,龙存架构发展2009~2010稳健发展紧耦合=松耦合,SOAGracefuldegradationMySQL=NoSQL多数据中心,可扩展,灾备关注TCOGuideline人人网架构发展NuclearRoseNuclear–功能分布式key-value存储数据自动复制到多个节点数据自动分区到不同节点存储容量无限扩展CAP-CANuclear-CAP可用性永远可写入(HintedHandoff)不存在单点风险Nuclear-CAP多一致性选项DISCARDMINQUOROMDISCARDUOROMALL提供最终一致性EventuallyConsistentNuclear-OverviewNuclear-原理构建NIONettyProtocolBuffersSpring富数据模型Key=List弱结构化查询Nuclear-原理分区-HashRingABCNodeA0~6148914691236517205NodeB6148914691236517205~12297829382473034410NodeC12297829382473034410~18446744073709551616Nuclear-原理增加节点NodeNNodeANodeBNodeCNodeN0~3074457345618258602NodeA3074457345618258602~6148914691236517205NodeB6148914691236517205~12297829382473034410NodeC12297829382473034410~18446744073709551616Nuclear-原理增加节点A{[c,a],[b,c],[a,b]}B{[a,b],[c,a],[b,c]}C{[b,c],[a,b],[c,a]}N{[c,n],[b,c],[a,b]}A{[n,a],[c,n],[b,c]}B{[a,b],[n,a],[c,n]}C{[b,c],[a,b],[n,a]}A[a,b]=NB[b,c]=NC[c,n]=NNuclear-原理替换节点A{[d,a],[c,d],[b,c]}B{[a,b],[d,a],[c,d]}C{[b,c],[a,b],[d,a]}D{[c,d],[b,c],[a,b]}N{[d,n],[c,d],[b,c]}B{[n,b],[d,n],[c,d]}C{[b,c],[n,b],[d,n]}D{[c,d],[b,c],[n,b]}B[d,a]=NC[b,c]=ND[c,d]=NNuclear-原理删除节点A{[d,a],[c,d],[b,c]}B{[a,b],[d,a],[c,d]}C{[b,c],[a,b],[d,a]}D{[c,d],[b,c],[a,b]}B{[d,b],[c,d],[b,c]}C{[b,c],[d,b],[c,d]}D{[c,d],[b,c],[d,b]}C[b,c]=BD[c,d]=CB[d,a]=DNuclear-原理节点状态迁移图Nuclear-原理Consistency和NWRW+RNW=2R=2N=3系统保障最终的一致性MerkleTreeNuclear-应用系统组件–普通节点(Node)•接收Client请求•提供数据存储–中心节点(Seed)•维护整个NuclearInstance的拓扑关系•健康检测–客户端(NuclearClient)•提供CRUDAPINuclear-应用NuclearInstanceNodeANodeBNodeZ……SeedNuclear-应用节点变更–增加•shnode.shnewA–删除•deletenodeA(manage.sh)–替换•replaceANuclear-应用性能–单节点处理最高2.5Wreq/s–典型应用环境:•4Node•Mysql•N=3W=2R=2•100ClientWriteRequest•单个Node15862req/s平均单次请求耗时5ms99.51%请求耗时50msNuclear-应用性能010000002000000300000040000005000000600000013579111315171921232527293133353739414345474951timesClientWriteQpstimesNuclear-应用NuclearClientAPIGet@paramkeyString@paramdataIDLong@paramconsistencyLevelList@paramkeyString@paramCondition?@paramconsistencyLevelNextDataIDPut@paramkeyString@paramdataIDLong@paramvalueByteString@paramconsistencyLevelReplace同PutdataID可选Delete@paramkeyString@paramdataIDLong@paramconsistencyLevelNuclear-应用CodeExampleDataIDProtocolBufferNuclear-应用NuclearManageClient–QPS查看–Node接收请求总数–Node处理请求耗时数据–节点信息查看–集群拓扑信息查看–动态更改节点处理线程数Nuclear-展望–EventuallyConsistent–VectorClock–AsyncStore–ReadCache–BalanceMonitor–BigTable?Nuclear-参考•Amazon'sDynamo–•Cassandra–•Voldemort–•主创人员:冷昊+人人网UGC团队–RoseRose是什么Rose人人网释出的开源Web开放框架(Java)主创:王志亮+人人网架构组REST式Web开发基于Spring技术支持服务端portalRose的应用100%覆盖人人网Web网站首页、个人主页状态、日志、分享公共主页开放平台Rose的发展人人网支持全线使用不断更新稳定发布开源路线Wiki电子书Rose开发示例资源•假设有2个只读资源•GET/blog/251375230/459764084o这是一篇日志的URLo251375230是作者的IDo459764084是该日志的ID•GET/blog/251375230o这是某个人的日志的URLo251375230是作者的IDRose开发示例控制器骨架packagecom.renren.blog.controllers.blog;@ReqMapping({userId:[0-9]+})publicclassBlogController{@GetpublicStringlist(@Param(userId)longuserId){returnblog-list;}@Get({entryId:[0-9]+})publicStringshow(@Param(userId)longuserId,@Param(entryId)longentryId){returnblog-show;}}Rose开发示例视图文件骨架•根存放地址:{webapp}/views•BlogController视图地址:{webapp}/views/blogoblog-list.jspoblog-show.vmRose开发示例model:控制器--视图@AutowiredBlogServiceblogService;@GetpublicStringlist(Invocationinv,@Param(userId)longuserId){ListEntryentries=blogService.findUserEntries(userId);inv.addModel(entries,entries);returnblog-list;}Rose开发示例使@Autowired工作•实现步骤o创建com.renren.blog.service.BlogService及其实现o在WEB-INF下创建spring配置文件:applicationContext-blog.xmlo把BlogService实现配置到该文件中oBlogController将自动通过类型找到BlogService实例并注入(dependecyinjection)•@autowired机制o在纯粹spring中默认是关闭的o在rose下默认是打开的,而且无法关闭Rose开发示例部署•在sourceFolder/META-INF/目录下创建rose.properties,写上rose=controllers,messages,applicationContext,dao•jar包发布,确认rose.properties存在于目标jar的META-INF下•web.xml配置roseFilterfilterfilter-nameroseFilter/filter-namefilter-classnet.paoding.rose.RoseFilter/filter-class/filterfilter-mappingfilter-nameroseFilter/filter-nameurl-pattern/*/url-patterndispatcherREQUEST/dispatcherdispatcherFORWARD/dispatcherdispatcherINCLUDE/dispatcher/filter-mapping•./start.shRose其他特性•可扩展、可订制o参数解析器o参数验证器o拦截器o统一错误处理器•flash:在重定向前后传递信息•简单、可层级化的国际化支持•rose重量级插件:服务端portal技术•调试工具:/rose-info/jar、/rose-info/mapping等•jade项目集成:annotation式的DAORose-Statement开源化:使用ApacheLicense,Version2.0;通用化:不做只适合某个公司假设的事情;安全:不含法律、道德、业内所不允许行为的代码调试工具默认关闭;稳定发布:在人人网经受每日数亿访问冲击,稳定发布;支持:提供丰富的wiki、电子书(2010Q2-Q3)公共主页:!