MocoSpace架构介绍阅读笔记

来源:互联网 发布:印象笔记 linux 编辑:程序博客网 时间:2024/04/30 17:40

最近对大规模系统的架构比较感兴趣,有很多东西想看,这次正好看到在HighScalability上读到《MocoSpace Architecture - 3 Billion Mobile Page Views a Month》,觉得讲的挺实在的,摘录一些内容放在这里。

 

先介绍下MocoSpace,这是一个针对移动设备的SNS,拥有1千2百万用户,10万并发用户量,一个月30亿PV,6百万独立访问者,上传1千2百万照片。

 

一、系统平台
整个站点运行于CentOS及RedHat之上,应用服务器是Resin,数据库为PostgreSQL;缓存方面使用了Memcached
作为分布式缓存,Squid进行静态内容缓存;前台主要使用JQuery;大量使用消息队列进行异步处理,此处采用运行于RedHat集群中的ActiveMQ;监控方面使用了Nagios和Zabbix。

 

硬件方面,Web层主要是5x Dell 1950(2x dual core, 16G RAM),5x Dell 6950/R905(4x dual core, 32G RAM);数据库层2x Sun Fire X4600 M2 Server(8x quad core, 256G RAM),2x Dell 6950(4x dual core, 64G RAM)。负载均衡器采用F5 BigIP硬件实现,EMC SAN充当数据库的存储介质。

 

除此之外,MocoSpace还使用了Amazon的S3和EC2,前者存储用户的照片及视频,后者用于照片处理(使用云存储和云计算平台还是有不少好处的,可惜国内要大规模使用还真需要考虑考虑,也许哪天Amazon就访问不了了。。。);Akamai CDN每天有2TB的量,2亿5千万个请求。


二、系统架构
数据库根据用户的Key进行Shard,对大表进行拆分(eBay:Partition Everything);离线环境下以批次为单位进行一致性校验,实现最终一致性。(eBay:Embrace Inconsistency。从现在的趋势来看,设计系统时光知道ACID是远远不够滴,还要了解BASE和CAP,学校里可不会教这些。:-))

 

在缓存的应用方面,使用多层缓存(应用服务器本地缓存、Memcached分布式缓存),更新数据时同时更新Memcached和数据库,在更新Memcached的同时通过消息队列发送invaild本地缓存的指令到各台应用服务器上。

 

采用专门的服务器在内存里构建及遍历social graph;在部署新版本时通过负载均衡器保持全站可用性;服务器的配置和部署尽量自动化(eBay:Automate Everything,别在靠系统管理员人肉部署了)。

 

以2周作为一个发布周期,发布周期越长,系统的复杂性就越高。

 

三、经验总结

1充分利用服务器资源。(不要担心服务器的Load过高,只要保持在可接受的范围即可。文章中说他们在一台应用服务器上跑了5个实例。)

2、找到每层的瓶颈所在。

3、严谨地剖析数据库。(找到系统中的Top Query,并对它进行跟踪处理。)

4、设计可降级的系统。(这个也是在很多地方都提到的一点)

5、只在必要时才使用同步通信。(鼓励使用异步通信,eBay:Asynchrony Everywhere)

6、在设计时就要考虑到监控的需求,而不是事后再补监控。(还要尽可能图形化,Twitter的Dashboard做的就很强大)

7、首选无状态,其次是粘性会话,尽量不要使用分布式Session。

8、注意Java的GC。(Full GC会Stop the whole world,一定要对GC进行优化,前几天BlueDavy写了个PPT专门讲了GC的问题。)

9、当站点发展到一定规模时,要考虑垃圾信息和黑客攻击。

10、删除数据时采用软删除而非立即删除。(更新比删除效率更高,而且也许有误操作,可以恢复)

11、任何东西都要有冗余。(eBay:Remember Everything Fails)

 

P.S.

虽然是讲MocoSpace,但很多设计原则都是通用的,我在很多地方都标注了eBay架构原则里的一些东西,有兴趣的TX可以去搜一下eBay的一些演讲PPT,会很有收获的。