• 1. 人人网技术架构介绍人人网·黄晶
  • 2. Guideline人人网架构发展 Nuclear Rose
  • 3. 架构发展2006 Let’s Get it started Resin Pro MySQL InnoDB主从结构 单Storage+Squid
  • 4. 架构发展2007 突飞猛进 LVS Resin Web集群 大量使用Memcached 中间层,基于ICE MySQL集群,垂直分区 简单分布式Storage Lucence搜索
  • 5. 架构发展2008 继续突破 开放API,SOA MySQL集群,水平分区 加强监控和安全 DFS,龙存
  • 6. 架构发展2009 ~ 2010 稳健发展 紧耦合=>松耦合,SOA Graceful degradation MySQL=>NoSQL 多数据中心,可扩展,灾备 关注TCO
  • 7. Guideline人人网架构发展 Nuclear Rose
  • 8. Nuclear – 功能分布式key-value存储 数据自动复制到多个节点 数据自动分区到不同节点 存储容量无限扩展 CAP - CA
  • 9. Nuclear - CAP可用性 永远可写入(Hinted Handoff) 不存在单点风险
  • 10. Nuclear - CAP多一致性选项 DISCARD MIN QUOROM DISCARDUOROM ALL 提供最终一致性 Eventually Consistent
  • 11. Nuclear - Overview
  • 12. Nuclear - 原理构建 NIO Netty Protocol Buffers Spring 富数据模型 Key=>List 弱结构化查询
  • 13. Nuclear - 原理分区 - Hash Ring ABCNode A 0 ~ 6148914691236517205 Node B 6148914691236517205 ~ 12297829382473034410 Node C 12297829382473034410 ~ 18446744073709551616
  • 14. Nuclear - 原理增加节点 Node N 0 ~ 3074457345618258602 Node A 3074457345618258602 ~ 6148914691236517205 Node B 6148914691236517205 ~ 12297829382473034410 Node C 12297829382473034410 ~ 18446744073709551616
  • 15. Nuclear - 原理增加节点 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] => N B [b,c] => N C [c,n] => N
  • 16. Nuclear - 原理替换节点 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] => N C [b,c] => N D [c,d] => N
  • 17. Nuclear - 原理删除节点 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] => B D [c,d] => C B [d,a] => D
  • 18. Nuclear - 原理节点状态迁移图
  • 19. Nuclear - 原理Consistency 和 NWR W+R>N W=2 R=2 N=3 系统保障最终的一致性 Merkle Tree
  • 20. Nuclear - 应用系统组件 普通节点 (Node) 接收Client请求 提供数据存储 中心节点(Seed) 维护整个Nuclear Instance的拓扑关系 健康检测 客户端(Nuclear Client) 提供CRUD API
  • 21. Nuclear - 应用Nuclear Instance Node ANode BNode Z… …SeedClient Request
  • 22. Nuclear - 应用节点变更 增加 sh node.sh new A 删除 delete node A (manage.sh) 替换 replace A
  • 23. Nuclear - 应用性能 单节点处理最高 2.5Wreq/s 典型应用环境: 4 Node Mysql N=3 W=2 R=2 100 Client Write Request  单个Node 15862 req/s  平均单次请求耗时 5ms  99.51% 请求耗时 < 50ms
  • 24. Nuclear - 应用性能
  • 25. Nuclear - 应用Nuclear Client API Get @param key @param dataID @param consistencyLevel List @param key @param Condition @param consistencyLevel NextDataID Put @param key @param dataID @param value @param consistencyLevel Replace 同 Put dataID可选 Delete @param key @param dataID @param consistencyLevel
  • 26. Nuclear - 应用Code Example DataID Protocol Buffer
  • 27. Nuclear - 应用Nuclear Manage Client QPS查看 Node接收请求总数 Node处理请求耗时数据 节点信息查看 集群拓扑信息查看 动态更改节点处理线程数
  • 28. Nuclear - 展望Eventually Consistent Vector Clock Async Store Read Cache Balance Monitor BigTable ?
  • 29. Nuclear - 参考Amazon's Dynamo http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html Cassandra http://incubator.apache.org/cassandra/ Voldemort http://project-voldemort.com/ 主创人员:冷昊+人人网UGC团队 http://ugc.renren.com
  • 30. Guideline人人网架构发展 Nuclear Rose
  • 31. Rose是什么Rose 人人网释出的开源Web开放框架(Java) 主创:王志亮+人人网架构组 REST式Web开发 基于Spring技术 支持服务端portal
  • 32. Rose的应用100%覆盖人人网Web网站 首页、个人主页 状态、日志、分享 公共主页 开放平台
  • 33. Rose的发展人人网支持 全线使用 不断更新 稳定发布 开源路线 Wiki 电子书
  • 34. Rose开发示例资源 假设有2个只读资源 GET /blog/251375230/459764084 这是一篇日志的URL 251375230是作者的ID 459764084是该日志的ID   GET /blog/251375230 这是某个人的日志的URL 251375230是作者的ID
  • 35. Rose开发示例控制器骨架 package com.renren.blog.controllers.blog; @ReqMapping("{userId:[0-9]+}") public class BlogController {      @Get      public String list(@Param("userId") long userId) {            return "blog-list";      }      @Get("{entryId:[0-9]+}")      public String show(             @Param("userId") long userId,             @Param("entryId") long entryId) {             return "blog-show";      } }
  • 36. Rose开发示例视图文件骨架 根存放地址:{webapp} / views BlogController视图地址:{webapp} / views / blog blog-list.jsp blog-show.vm
  • 37. Rose开发示例model: 控制器-->视图 @Autowired      BlogService blogService;      @Get      public String list(Invocation inv, @Param("userId") long userId) {            List entries = blogService.findUserEntries(userId);            inv.addModel("entries", entries);            return "blog-list";        }
  • 38. Rose开发示例使@Autowired工作 实现步骤 创建com.renren.blog.service.BlogService及其实现 在WEB-INF下创建spring配置文件:applicationContext-blog.xml 把BlogService实现配置到该文件中 BlogController将自动通过类型找到BlogService实例并注入(dependecy injection) @autowired机制 在纯粹spring中默认是关闭的 在rose下默认是打开的,而且无法关闭
  • 39. Rose开发示例部署 在sourceFolder/META-INF/目录下创建rose.properties,写上rose=controllers,messages,applicationContext,dao jar包发布,确认rose.properties存在于目标jar的META-INF下 web.xml配置roseFilter      roseFilter   net.paoding.rose.RoseFilter       roseFilter   /*   REQUEST   FORWARD   INCLUDE   ./start.sh
  • 40. Rose其他特性可扩展、可订制 参数解析器 参数验证器 拦截器 统一错误处理器 flash:在重定向前后传递信息 简单、可层级化的国际化支持 rose重量级插件:服务端portal技术 调试工具:/rose-info/jar、/rose-info/mapping等 jade项目集成:annotation式的DAO
  • 41. Rose - Statement开源化:使用Apache License, Version 2.0; 通用化:不做只适合某个公司假设的事情; 安全:不含法律、道德、业内所不允许行为的代码 调试工具默认关闭; 稳定发布:在人人网经受每日数亿访问冲击,稳定发布; 支持:提供丰富的wiki、电子书(2010 Q2-Q3) 公共主页:http://page.renren.com/paoding-rose
  • 42. Thank You!