『九个月实现破亿用户的可扩展架构』学习笔记

昨晚把美拍架构负责人洪小军在Qcon上的『九个月实现破亿用户的可扩展架构』分享看了一遍(其实那场QCon我也在现场,可是当时小军这个会场实在太多人了,并且当时北京还没开空调又热又闷,因此我就挑了个凉快的会场去听了哈哈),感受有很多值得学习的地方,在这里记录一下,强烈建议你们把视频从头至尾看一遍,不要只看ppt。尤为是身在创业公司且公司业务发展速度比较快的同窗。html

总的一个中心思想是在不一样阶段选择最适合本身的方案。这句话提及来简单,可是背后的各类辛酸泪以及血的教训只有亲历者才能理解了。下面咱们从各个角度分别来看一下。前端

对了,忘了说一个前提了,美拍从上线到发展到一亿用户只经历了短短几个月的时间,在这业界应该是没有几个先例的,这也是前面为何说必定要仔细看看。另外说个八卦,听说美图的第一个后端开发(也是惟一的一个)在刚上线时连续三天没回家...java

首先先从架构上来讲,看下美拍经历的几个阶段:redis

  1. 极简化设计(快速发布上线)
  2. 保持简单行设计(产品快速迭代)
  3. 可扩展和高可用保证(用户量到必定量级)
  4. 高可扩展和高可用保证

而后咱们来看下美拍一路走来遇到的问题:数据库

  1. MySQL慢查询
  2. MySQL写入瓶颈
  3. redis超时
  4. memcached命中率奇低
  5. 服务相互依赖
  6. 监控报警不稳定
  7. CDN服务各类故障
  8. 添加字段成本高
  9. 量级上来后,MySQL继续慢

而后,咱们按服务维度把每个服务拆开,看下每个服务在美拍架构上的迭代过程。后端

1、MySQL

MySQL是最重要的一个服务,在美拍架构里经历了屡次迭代。在初版直接就是一个实例,为了保持代码的简单,业务逻辑能在数据库里作的都放到数据库作了,好比Feed功能,直接用MySQL的join查询。缓存

可是后来就出现了一些慢查询的状况,这时候作了主从,作读写分离,多个从库用来作查询。再到后来出现写入也慢的状况,这时候也没有作架构上的优化,而是升级硬件,由于如今正是业务高速发展阶段,须要极简化设计,这个阶段更多精力要放在业务开发上(估计当时也木有招到合适的人:))。服务器

过了一段时间又开始出现写入慢的状况,这时候才开始作分表。可是等到了重心放在扩展性和可用性上时,又遇到了新的问题,一个很大的问题仍是写入慢,另一个就是随着数据量的增大,添加字段成本特别的高。针对这两个问题作了下面两个方案:架构

  1. 异步写入,作到前端永远可写,后面复杂的事情放到队列里面去异步的作
  2. 索引和数据分离,把须要索引的字段单独拆出来一个表,其余数据用kv存储,value就是全部属性和值的pb二进制数据,解决家字段困难的问题

这个时候针对MySQL的架构优化才告了一段落 :)oracle

2、缓存

缓存主要用到了memcache和redis(redis应该主要是用在队列和计数服务)。在量比较小的时候就是简单粗暴的用,可是很快就遇到了redis超时的问题,这时候对redis扩容,使用多slave架构。而后是rdb dump时影响用户请求的问题,解决方法一是在凌晨访问量低的时候才去dump,二是用不对外服务的机器来作dump。

而后memcached遇到了命中率很低的问题,一个大问题就是容量瓶颈,这没啥好说的,扩容(小军有提到,要随时作好扩容的准备)。另一个就是slab calcification的问题(又叫slab钙化问题,这个是memcached的内存分配机制致使的,简单来讲就是memcached会内存分红N个slab,当新添加一个内存对象时会根据这个对象的大小来选择不一样的slab,若是没有合适的就会建立一个slab,那若是这时候剩余内存不足以分配一个slab呢?这时候就出现了钙化问题了),美拍当时的解决办法是核心业务隔离部署,避开这个问题。

到可用性保证阶段,缓存的可用性就更加的很是的重要了,缓存挂了可能就整个系统都挂了,很难收场,因此就要保证缓存的可用性。这时候作了主从的优化,master也承担读查询,以保证缓存热度,slave穿透到master,master穿透到slave,防止单点故障。

3、运维

在初期只是简单的监控告警,有时候出问题了可能收不到告警或者看不到是啥地方出问题,后来逐渐完善监控告警,且监控告警是用配置比较高的服务器,保证监控告警的可用性。而后假如更多监控维度和更多日志,方便定位问题。对依赖的第三方服务和资源作开关,出问题时能够经过服务的开关保证核心路径可用

4、第三方服务

主要提到的是CDN服务。其中一个很大的问题就是DNS被攻击、被劫持,除了和运营商保持沟通外,还作了多服务商配合的策略,好比一样的数据在多个云服务那里作冗余,客户端在访问时若是出现问题就切换到其余的访问地址,而且在客户端作了服务端可用性探测。这也是个很是有价值的经验。

5、技术栈

整个看下来会发现美拍的架构作的很是的稳,小军也有提到,在项目初期高速发展阶段作架构时要克服对完美架构的欲望、克服对新技术的欲望,先让系统跑起来。

可是在整个迭代过程当中,美拍也一直在引入新技术,好比在团队不太熟悉时先在部分业务上使用MongoDB,在注重可扩展和可用性阶段,引入java作业务逻辑,引入c作底层基础服务。


经过这个分享能够学习到一个系统从0到亿的架构迭代过程,可是更多的仍是在于实践,估计美拍走过的坑也远不止小军分享里提到的这些,每个点均可能出现N多的问题,每一个点均可以展开不少话题来说。但愿能看到更多相似的有价值的分享!

相关文章
相关标签/搜索