※ 罗马不是一天建成的
豆瓣在5年内经历了6次架构的调整,和淘宝有得一拼啊。任何优秀的架构都是在不断的问题和瓶颈中发展起来的
※ 总是考虑使用Memcached
应该在系统架构的第一时间就考虑使用Memcached,按照洪大师的说法。豆瓣现在的内存缓存有38G。Memcached的好处地球人都知道了
※提防Memcached的并发访问
Memcached虽然是剂猛药,但也有可能成为毒药。特别是在高并发的情况下同时获取一批缓存数据的时候(不知道新版本的Memcached解决这个问题没有,当时我第一次看到这个功能时那是激动得内牛满面啊~~~)。要知道Memcached毕竟只是个缓存工具,不是内存数据库。不要指望他提供什么锁、并发控制的机制(不过它倒是提供了一个原子操作increment,用于递增数据,对于刷新页面访问量之类的比较有用)
※ 根据数据访问特性合理规划表类型
使用MySQL的数据库,可以方便地使用不同的存储引擎对应不同操作类型的表(貌似对于其它数据库,还没有这种功能。也可能是我孤陋寡闻了)。对于读写不平衡但并发低的情况,采用MyISAM可以获得较高的效率。网上google了一把,ISAM的意思是Indexed Sequential Access Method (有索引的顺序访问方法),它的优势是速度快,支持全文搜索;但对事务支持差(PS:个人意见这个用来做数据分析或者数据挖掘最好了 ^_^)。如果是用于高并发的读写访问,那么只能采用InnoDB类型的表了。
※ 动静分离
使用lighttpd具有比Apache更好的静态文件处理功能(PS:个人见到从豆瓣的第一个版本开始到目前为止的版本,只有两点是不变的:1.使用lighttpd对精通文件进行分离,直接从FS读取。动态的走SCGI接口。2.使用Memcached)。
※ 对缓存、数据库进行负载均衡,例如MySQL Proxy
使用类似于Load Balance来平衡Memcached的负载。不同于Round-robin方式,采用的是hash分配。自己实现Hash算法(PS:这个倒是和网上的多数观点一样,但缓存的东西多了,命中率总是会下降,要么扩大内存要么改算法,避免多次的重新分配)
※ 不要忽视小文件的读写
在豆瓣的某个发展阶段,就出现了因为大量的小图片读写而造成大量的磁盘IO和碎片的问题。原来豆瓣一开始也是把所有图片都放在一个目录下啊,后来出现问题后才改成1000个图片一个目录。要不按照洪大师的说法:一个ls就可以让服务器挂掉。
※ 屏蔽表名和物理表的关系
通过中间映射实现底层物理数据表的无缝迁移。(PS:这个只要是做过Java的都知道了,IoC,代理其实也就是这个作用),具体的做法就是只传一个逻辑表名进去,后台函数映射后解析成一个真正的物理表所在的位置,方便日后的数据迁移,只要维护这个映射表就好了
※ 数据复制(主从模式)是必经阶段
当主数据库出现瓶颈时,要考虑采用数据库 复制的方式(Master / Slave模式),主库负责事务性读写,从库负责非事务性读(不能有写)。数据库复制的形式在豆瓣的发展上发生了很多次变化,我看到的就有从单点的复制到最终的跨机房复制。这一点可以从后面的PPT看到
※ 数据库复制是存在时间延迟的
数据库复制的延迟时间要考虑在内,否则会出现当主库写完后,未来得及复制到从库就出现Application从从库读数据的情况,严重的话用户每次更新数据后再刷新看到的永远都是旧的数据(缓存还没有更新,同步的数据还在路上呢....)。
※ 人肉刷新缓存有时候是必要的
接上面的问题,洪大师的团队最终采用了“人肉刷新”---- 即在可预见的情况下,内存中的数据更新后,主动调用Memcached的flush()方法刷新一下缓存,先同步了缓存再说,后面的数据你就慢慢复制吧。这个只能靠程序员自己控制了....ORZ
※ 统一的Data mining入口
豆瓣的数据库复制机制中有一个特别的“Data mining”模块,由它负责把数据写到主DB,再从主DB replicate到从DB,然后Data mining模块从从DB read。这个有点搞不懂?这个“Data mining”到底是什么来头?怎么所有数据都从这里写,甚至连主DB的数据都是从这里写进去的?
※ 分离服务器
把服务器分成控制服务器、应用服务器、代理服务器。分别对应入口转发,应用请求,负载均衡。把数据挖掘、日志分析、爬虫应用之类占用带宽,耗内存的东西全都移到后端,放在月黑风高,夜深人静的时候去进行吧。
※ 硬件的故障不可忽视
SCSI比SATA的稳定性要高,花在内存上的钱是值得的
※ 永远不要高估机房托管方、空间提供商的智商和责任心
比如洪大师说的:搬机器的时候不小心把你们服务器的电源线拔了之类的问题...
※ 如果你够牛B,那么考虑实现自己的内存数据库和文件系统
例如DoubanFS、DoubanDB(貌似这是一个基于key-value的内存数据库,看来内存数据库在未来大有可为啊,该死的hibernate,该死的iBatis,该死的OR-Mapping)。
以上是豆瓣洪大师的观点,加上最近看到的其它,也一并总结一下吧:
※ 尽可能在长事务的情况下使用异步通信,例如发送SMS、MMS到网关然后等待回应
※ 对数据库采用水平分区而非垂直分区以加强后期的扩展性
※ 合理恰当地使用索引
※ 在高层次的地方使用缓存,而不要在低层次的地方使用缓存
※ 建立科学合理的性能、压力测试环境。性能瓶颈总是出现在你意想不到的地方
分享到:
相关推荐
豆瓣网技术架构变迁的知识点主要包括以下几个方面: 1. 豆瓣网简介:2005年3月上线,是一个以分享和发现为核心内容的社区,主要内容包括读书、电影、音乐、小组、同城以及九点等板块,同时还有“我的豆瓣”和“友邻...
从最初的 MySQL 数据库到 Redis 缓存,再到 Nginx Web Server 和 Picture Storage 的使用,知乎的架构设计都是为了满足业务需求和提高系统性能。 三、架构设计的原则 架构设计的原则是指在架构设计过程中需要遵循...
综上所述,从小米网的发展历程来看,其技术架构经历了从单一数据库支持到多层结构拆分,再到面向服务的转型等多个阶段。每一次架构的调整都是为了更好地适应业务需求的变化,同时也反映了小米网在技术创新方面的不懈...
TalkingData-大数据统计分析平台架构故事-数据库技术进化 数据库架构变迁 共28页.pptx
### 互联网时代的架构变迁 #### 单机时代与单体架构 互联网的早期阶段,特别是在资源有限、人力资源紧张的情况下,为了能够快速推出产品或者上线网站,单机模式成为了一个非常实用的选择。在这种模式下,所有的...
在余额宝2.0到4.0的发展过程中,数据架构也经历了从传统数据库到大数据处理平台的转变。这不仅包括了从交易数据中提取有价值信息的能力,还包括利用大数据技术对用户行为进行预测,为用户理财提供更加精准的服务。 ...
从2010年最初的初创时期,到如今拥有超过11百万活跃用户(RU 11M+)、80百万月活跃用户(MAU 80M+)以及每天处理2亿2千万次页面浏览(MPV 220M+),知乎的技术架构经历了多次关键性的升级和优化,以应对不断增长的...
### 从零到十亿——大型网站架构设计变迁 #### 架构的定义与意义 在探讨大型网站架构设计变迁之前,我们首先需要明确“架构”这一概念的本质。架构可以被理解为对一个系统内各个组成部分及其相互关系的一种主观...
【知乎架构变迁史】从初创时期的简单架构到应对大规模用户需求的复杂演进,知乎的技术栈和设计策略经历了显著变化。在2010年,知乎由两位工程师启动,使用Python作为主要开发语言,选择Tornado框架是因为其异步特性...
例如,在阿里的发展过程中,从最初的淘宝网到后来的支付宝和蚂蚁金服,阿里的组织架构都发生了相应的调整。小米的发展也经历了从智能手机到 IoT 生态系统的转变,组织架构也相应地进行了调整。 二、组织效率的关键...
"藏经阁-瓜子后端技术架构的变迁" 本文将详细介绍瓜子后端技术架构的变迁,包括...瓜子后端技术架构的变迁是一个渐进的过程,从架构V0.1到架构V1.0,逐步解决了各种问题,提高了系统的可扩展性、可维护性和可靠性。
豆瓣是中国知名的社交网络及评分平台,它的架构变迁代表了从早期的单体架构到微服务化架构的转变。早期,豆瓣可能采用的是传统的垂直架构,随着用户量的增加,这种架构难以扩展,因此逐渐转向分布式服务。微服务架构...
知乎在发展历程中不断优化其技术架构,解决了许多由快速增长带来的挑战。从最初简单的单体应用到如今高度模块化且具有良好扩展性的微服务架构,知乎的技术团队始终紧跟业界前沿,积极探索新的技术和方法论。未来,...
支付宝作为中国领先的第三方在线支付平台,其组织架构的变迁反映了互联网行业快速发展的特性与需求。...这个过程不仅涉及到技术层面,还包括了战略规划、人力资源管理等多个方面,是值得其他企业和行业借鉴的经验。
360云查杀服务从零到千亿级PV的架构变迁,不仅反映了技术的迭代和升级,也体现了面对海量用户需求和数据处理压力时,对架构设计和系统优化的高度适应性。通过不断地解决技术债务、优化架构设计、整合资源、提升性能...
这份文档可能会讲述淘宝从初期到现在的数据库架构变迁。早期,淘宝可能采用的是单机数据库,随着业务发展,面临高并发和海量数据存储的压力,逐渐演进为分布式数据库、主从复制、读写分离等模式。更进一步,淘宝可能...