Successfully reported this slideshow.

大型Sns数据库设计

9,520 views

Published on

ThinkingInLamp社区MySQL用户大会(上海)分享

Published in: Technology, Business
  • want know more detail
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • 大型Sns数据库设计
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • f
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

大型Sns数据库设计

  1. 1. 盛大网络 大型 SNS 网站数据库设计 赵佳佳
  2. 2. SNS 介绍 SNS ( Social Networking Services )即社会性网络服务
  3. 3. 思考问题 <ul><li>1 ,前期无盈利,如何支撑? </li></ul><ul><li>2 ,爆炸性增长,如何解决? </li></ul><ul><li>3 ,业务形态纷繁复杂,如何应对? </li></ul>
  4. 4. 前期无盈利? <ul><li>成本 </li></ul><ul><li>成本 </li></ul><ul><li>成本 </li></ul>
  5. 5. 分布式数据库 <ul><li>优点: </li></ul><ul><li>分散负载; </li></ul><ul><li>局部应用的响应速度快 ; </li></ul><ul><li>体系灵活 </li></ul><ul><li>可靠性高、可用性好 ; </li></ul><ul><li>扩展性好; </li></ul><ul><li>致命缺点: </li></ul><ul><li>弱关系(避免 join ) ; </li></ul><ul><li>避免跨库事务; </li></ul><ul><li>SNS 以用户为中心,存储的是用户属性及行为数据,一个带有用户 ID 的原子性操作就能满足大部分需求,所以这些缺点对它来说显得并不突出。 </li></ul>爆炸性增长?
  6. 6. 爆炸性增长 <ul><li>垂直切分 (规则简单,实施方便) </li></ul><ul><li>垂直切分 </li></ul><ul><li>水平切分 (相对复杂) </li></ul>如何分布式 —— 数据切分
  7. 7. 爆炸性增长 <ul><li>一、按范围切分 </li></ul><ul><li>UID 根据取值: 1 ~ 1000 的对应 DB1 , 1001 ~ 2000 的对应 DB2 ,以此类推; </li></ul><ul><li> 优点:迁移方便 </li></ul><ul><li> 缺点:数据分布不均 </li></ul><ul><li>二、 hash 取模切分 </li></ul><ul><li>UID mod 4 余数为 0 对应 DB 1 , 1 对应 DB2 , 2 对应 DB3 , 3 对应 DB4 </li></ul><ul><li> 优点:数据分布均匀 </li></ul><ul><li> 缺点:数据迁移的时候麻烦,需重新哈希 </li></ul><ul><li>三、 建立配置表 </li></ul><ul><li>表中保存 UID 到 DB 的映射关系,每次访问数据库的时候都要先查询一次这个表,以得到具体的 DB 信息,然后才能进行我们需要的查询操作。 </li></ul><ul><li> 优点:灵活性强,一对一关系 </li></ul><ul><li> 缺点:每次查询之前都要多一次查询,性能大打折扣 </li></ul>常用切分 (水平切分) 方法
  8. 8. 爆炸性增长 先垂直 , 再水平 先哈希 , 再范围 切分案例一、 (利用中间件 / 程序逻辑拆分)
  9. 9. 爆炸性增长 <ul><li>切分案例二、 </li></ul><ul><li>(硬路由,避免中间逻辑) </li></ul>
  10. 10. 爆炸性增长 拆分流程:
  11. 11. 爆炸性增长 原始状态 二次拆分 (配合中间件 / 程序逻辑)
  12. 12. 爆炸性增长 二次拆分 (配合中间件 / 程序逻辑) 创建复制
  13. 13. 爆炸性增长 二次拆分 (配合中间件 / 程序逻辑) 更改路由
  14. 14. 爆炸性增长 二次拆分 (配合中间件 / 程序逻辑) 停止复制
  15. 15. 爆炸性增长 二次拆分 (配合中间件 / 程序逻辑) 删除冗余
  16. 16. 复杂业务形态? <ul><li>分类、归纳方法 </li></ul><ul><li>举例: </li></ul><ul><li>读特征非常明显的业务,比如相册、博客; </li></ul><ul><li>时效性很强的业务,比如动态、推他; </li></ul><ul><li>需求变动频繁的业务; </li></ul><ul><li>。。。 </li></ul><ul><li>  </li></ul>
  17. 17. 复杂业务形态 读特征明显的业务?答:读写分离
  18. 18. 复杂业务形态 读写分离
  19. 19. 复杂业务形态 <ul><li>时效性强的业务? </li></ul><ul><li>以时间为 partition ,删除整个过期分区 </li></ul><ul><li>好处: </li></ul><ul><li>删除效率高; </li></ul><ul><li>无行锁,对前端业务无影响; </li></ul><ul><li>控制数据量,平衡性能; </li></ul>
  20. 20. 复杂业务形态 需求变动频繁的业务? 数据量小,统计性强,扩展性差 无限扩展,兼顾统计,数据量庞大 扩展性较好,记录数小,结果需要程序解析,数据统计不便
  21. 21. DBA 最不容忽视事情 -- SQL 审核 <ul><li>select ID, SDID, APP_ID, PHOTO_ID, ALBUM_ID, IMAGE_NAME </li></ul><ul><li>from SD_PHOTO.IMAGE </li></ul><ul><li>where SDID=#sdid:BIGINT# AND DEL_FLAG = 0 </li></ul><ul><li><dynamic> </li></ul><ul><li>< isNull prepend=&quot;AND&quot; property=&quot;requestRelation&quot; > </li></ul><ul><li> PRIVILEGE <![CDATA[&]]> 4 = 4 </li></ul><ul><li></ isNull > </li></ul><ul><li>< isNotNull prepend=&quot;AND&quot; property=&quot;requestRelation&quot; > </li></ul><ul><li> PRIVILEGE <![CDATA[&]]> #requestRelation:BIGINT# = #requestRelation:BIGINT# </li></ul><ul><li></isNotNull > </li></ul><ul><li>< isNotNull prepend=&quot;AND&quot; property=&quot;photoId&quot;> </li></ul><ul><li> PHOTO_ID = #photoId:BIGINT# </li></ul><ul><li>< /isNotNull > </li></ul><ul><li> < isNotNull property=&quot;order&quot;> </li></ul><ul><li> ORDER BY $order$ </li></ul><ul><li> < isNotNull /> </li></ul><ul><li> < isNotNull property=&quot;startIndex&quot;> </li></ul><ul><li> LIMIT #startIndex:INTEGER#,#itemsPerPage:INTEGER# </li></ul><ul><li> < /isNotNull > </li></ul><ul><li></dynamic> </li></ul>
  22. 22. SNS 网站架构
  23. 23. 欢迎交流

×