zoukankan      html  css  js  c++  java
  • 听豆瓣架构变迁分享会总结 (转)

    要点如下:
    目前23台pc server
    每天pv数2k万左右。注册用户数300万。 表的数据,大部分是行数量是千万的。
    5个人算法团队。另外开发人员总共11个,包括全职和兼职(以前看百姓网分享其技术也只有10名)
    06年的时候每天120万左右动态请求。这个时候主要瓶颈在磁盘i/0上面,拿到风投,有钱购买硬件设备。购买两台iu服务器(双核,4g内存) 一台作为应用服务器,一台作为数据库服务器,迁移到双线ip机房,使用dns解析不同网段ip(自己去找哪些网段是电信的哪些网段是网通,然后自己进行解析)。看演讲后面提到的机房调整感觉到,其实这是走了弯路,可以选择一个好的机房来解决dns解析方面(后来总结是靠ip段来分布数据不靠谱)
    具体怎么做,就是放到一个支持多线的(教育网铁通等)机房,现在我们公司用的阿里云就是多线) 那么这样子就不需要自己多ip段分配了(就是判断访问用户是电信还是网通等)。
    使用内存缓存(豆瓣使用的是memcached)的两点原则: 1、对于需要比较消耗资源的数据 2、需要重复使用的数据。如果只需要使用一次,那么即便是比较消耗资源,丢入缓存也没多少意义
    理解:内存缓存也需要内存,没必要浪费。如果不需要重复使用,丢入内存中也比较浪费(毕竟内存不便宜,也占用服务器资源)
    豆瓣的memached命中率挺高的。靠这个也缓解了很多压力。

    innodb并发访问支持好,因为支持行级存储。使用myisam还是innodb他们的的业务特点是:读多写少使用myisam,写多读少使用innodb
    数据库切分方面:目前是按照功能进行分区(作者没有详细解释,应该是按照功能模块划分表。一个功能模块相关的表放到一个库中去),提到,采用了经典的mysql主从架构。所以每个库其实是重复三份的(他说的主辅库)。应该是三个mysql从服务器
    分库之后,操作多个库,使用游标的方式获取具体的库和具体的表。传入参数进去(具体没看懂)
    数据库主从复制延迟问题一直是一个常见问题。
    购买硬盘是一个教训:刚开始还是宁愿投资多点钱购买好的点的磁盘,因为磁盘这东西升级不太可能。到时候网站扛不住了。仍然得换。那么,刚开始宁愿多花点钱,购买高速磁盘,因为业务如果发展快了的话,就得换。即便贵点,磁盘仍然没有浪费的。

    200万每天的动态请求的时候,豆瓣提到,静态的小文件服务(用户头像、封面图片)使得磁盘i/0成为瓶颈,以前愚蠢得把图片都放到一个目录下面,这个目录下面有几十万个小文件(直接导致不能使用ls命令,一使用服务器就死掉了),这个时候把文件分目 录。分成每个目录存储10000个文件。

    有专门的数据挖掘团队。算法团队进行矩阵计算,把结果放入mysql,供前端查询显示出来。
    豆瓣的fs是专门针对图片存储,自己开发的。其实机制是参考了amazon的,写的时候写三份数据。
    磁盘随机寻道比吞吐量更加重要,当时的性能瓶颈在磁盘寻道速度上(这点跟之前看淘宝的图片文件系统分析的大量的图片访问带来的磁盘磁头频繁定位造成的延时类似)
    后来把所有myisam表改为innodb表。
    innodb的缓存:是在进程中自我管理(也就是内存中),而myisam的缓存是基于文件中(受操作系统控制)。以前既用myisam表也用innodb表,导致两种类型的表相互竞争内存,效率不高。索引全部换成innodb存储引擎(这点我不是很理解,只明白其考虑点是为了更好利用内存)

    应用服务器故障:nginx自带功能。
    图片的流量成为很大成本:迁移到天津机房是因为更加便宜点。机柜比较便宜,把数据挖掘方面的数据和图片数据都搬过去。
    北京与天津两个机房。里面各自搭建mysql的master-slave结构。

    搜索方面:以前一直使用mysql的全文索引。后来迁移使用sphinx(这个结合mysql来使用,作为mysql的一个存储引擎),后来又变为xapain
    为什么没使用sphinx了?没有详细解释
    使用MogileFS来存储图片,后来又自己开发了doubanfs存储。迁移的原因:mogilefs出现性能瓶颈,由于mogilefs是把元数据(命名空间, 和文件在哪里)存储在mysql中,数据库行数变多之后,就会变得越来越慢。而大量的小文件需要读取数据库,也影响了速度。当时的行数增长非常快,当时瓶颈在于mysql数据库上。

    大字段影响了数据库的性能,实际上数据表行数并不多。就是大字段的影响。大文本字段移除出去,存储到自己开发的doubanDB中(是一个key-value数据库,参考了亚马逊的dymamo,进行简化)。底层存储基于tokyocabinet。后来把doubanfs重写,基于doubandb实现,把图片存储进去。
    使用双master方案。解决了复制延迟问题,因为写和读都是对同一个master,读取到的数据是最新的。而以前:从master写入,然后从slave读,存在数据延迟

    部署lvs。
    之前使用spread作为消息队列,后来使用rabbitMQ替代
    =========================================================

  • 相关阅读:
    Java实现 LeetCode 667 优美的排列 II(暴力)
    Java实现 LeetCode 665 非递减数列(暴力)
    Java实现 LeetCode 665 非递减数列(暴力)
    Java实现 LeetCode 665 非递减数列(暴力)
    Java实现洛谷 P1873 砍树(StreamTokenizer+IO+二分)
    PHP RESTful
    PHP 获取图像宽度与高度
    PHP imagecolorclosesthwb
    PHP imagecolorclosestalpha
    PHP imagecolorclosest
  • 原文地址:https://www.cnblogs.com/hubing/p/3488383.html
Copyright © 2011-2022 走看看