每月3亿PV的FaceBook朋友买卖插件的架构与数据

来源:互联网 发布:浴缸品牌 知乎 编辑:程序博客网 时间:2024/04/30 16:42

在短短的三个月时间内,朋友买卖成为facebook前十名的应用,它每秒钟处理200个请求,每月产生300 000 000个page view。在技术上,选择了Ruby on Rails框架,两个兼职程序员,一打服务器,和优秀的架构。

 

架构

Ruby on Rails

CentOS 5(64bit)

Capistrano 升级和重启应用服务器

Memcached

Mysql

Nginx

Starling 分布式队列服务

Softlayer 堡垒主机

Pingdom 站点监视器

LVM 逻辑卷管理器

Dr.Nics Magic Multi-Connections Gem 数据库读写分离

 

当前情况

Facebook十大热门应用

将近600 000活跃用户

每天500000独立用户访问量并保持持续增长

300 000 000 page view 每月

每月300%的稳定增长率

上个月2100 000 000的独立用户

每秒处理200次请求

每月5TB的流量

两个兼职开发者(目前一个全职),一个远程DBA支持

4台数据库服务器,6台应用服务器,a staging server, a front end server

六台 4核 8G内存 应用服务器

每个应用服务器建立16个mongrels一共是96个mongrels

 

系统设计目标:

支撑facebook应用-买卖朋友。

它基于一个波动的金融市场。

目前它是facebook排名前十的热门应用。

Tips:像买卖宠物一样买卖好友!你可以玩弄他,送礼物,或者用来炫耀。精明的投资者会把他的朋友发展成人们的货物,其实这只是满足

 

为什么做这个系统:

做这个系统更多的是为了测试和了解facebook这个系统

 

设计系统的时候,在设计,架构和实现方面有什么挑战和创新?

因为作为facebook的应用,每个请求都不能使用缓存页面,因此,它是一个时实行,并且写操作频繁的系统,对数据库优化要求比较高。

 

如何应付这些挑战?

我们采用memcached作为中间层,每个请求都不直接访问数据库。使用Rail's fragment caching缓存表现层。

 

系统目前是什么规模?

昨日访问量是500 000个独立用户并且访问量一直在增长。根据统计反馈,本月有 300 000 000 的page view。

 

带宽使用状况

上月产生了3T的流量,这月最少5T,内容仅仅是一些图标和xhtml/css。

 

文件数目,图片数目,和数据情况

没有文件,有10 000 000用户信息。只有少量图片。

 

增长率?

Page view由平均3M 每天增长到一个月前的10M每天,之前一个月1M,因此平均300%的月增长率,平均每秒处理200个访问。

 

用户需要付费么?

全部免费

 

用户增长率

平均1%,并且以每天3%的速度增长。

 

上月有多少用户活动了?

通过google的统计,上月有2 100 000 独立用户访问。

 

系统架构如何做?

首先它构建于非常稳定的Rails集群,而且使用nginx软件运行负载均衡和静态内容的服务。6个应用服务器使用4核CPU8G内存。每个应用服务器运行16个mongrels,一共有96个mongrels。负载均衡直接转向mongrels ports。还有,一个4G的memcache服务器,独立的一台对列服务器。

使用god检测进程。

数据层,使用两台32G内存,4核CPU,4×15K SCSI RAID 10disk 做主从。使用Dr Nic's magic multi-connection's gem产品做读写分离。

现在添加了更多的从属服务器可以获得更高的读效率和冗余。

 

托管商略。

 

如何规划架构

在应用层没有做什么,因为功能非常琐碎。在数据库方面,我们只有一个主数据库,尽可能去快速分发。垂直划分数据库提高可用性。

 

有什么独特的地方可以借鉴?

三个方面:

1、两个开发者之前都没有进行过大规模的Rails开发

2、我们的增长率在Rails开发史上比较少见。

3、几乎没有做缓存,每个请求直接用Rails处理

 

你们中间学到了什么?你们为什么成功?你们是否希望以后做其他的东西,有什么不想改变的?

我们知道了一个好的托管上,好的硬件,好的DBA都是非常重要的。我们曾经选择Railsmachine,他们是一个非常不错的空间提供商但给我们很大的支持。之后几乎没有碰到过硬件上的问题,而且之用两个小时就平滑切换到了Softlayer上。选择一个好的托管上尤其重要。

另一个重要的事情是可伸缩的架构一贯问题出现在数据库上。首先检查数据库,一般情况下都可以通过数据库服务器,数据库配置,查询,索引来解决。

开始就建立在一个好的托管商。

我们鉴定用Rails,因为这是免费并且可快速开发的程序,实践证明两个小伙在没有充足时间的前提下也顺利开发完成了。

 

你们的小组如何组成的?

我们有两个Rails程序员,包括我在内。而且招安了曾经兼职远程办公的DBA。

 

你们一共有多少钱人?

技术方面,两个兼职的,一个全职的,一个远程办公的DBA。

 

你们现在在哪?

两个全职人员依然在 SOMA area of San Francisco。

 

这些人的职责?

两个开发者作为创始人,我最早做前端开发和程序开发。有一些经验后我也做网管。创始人Alex非常专注于Rails开发,大部分的应用程序是他开发的。现在我主要做数据库方面的工作。

 

有什么独特的管理方法?

首先,找到最聪明的人,给最好的待遇,尽其所长。最好的管理是尽其所长,我用这种方法管理公司。我想我经常在这里出问题。

 

你如使一个分散的团队工作?

有个好的交流工具。远程办公比较痛苦,核心开发还是要在本地,一些DBA之类的事情可以远程。

 

 

开发情况

使用Rails,很多缓存采用Chris Wanstrath的方案,数据库连接使用Dr Nic。我们使用VIM作为编辑器。

 

开发语言

Ruby / Rails

 

服务器数量

12台服务器

 

服务器应用情况

4台数据库,6台应用,一台staging server,一台前端机

 

托管商

Softlayer

 

服务器操作系统

Centos 5 64bit

 

Web server

Nginx

 

数据库软件

Mysql 5.1

 

反向代理

Nginx

 

如何部署

委托Softlayer

 

存储

NAS备份,SCSI硬盘支撑。

 

存储容量

5TB

 

存储如何扩展

Ad-hoc。 我们不关注这块,这是我们的软肋。

 

存储服务器

Nope

 

如何处理session

数据库,memcache也许更好

 

数据库如何规划

目前用的主从。一主多从,使用负载均衡提高读性能。

 

如何做负载均衡

Nginx

 

使用何种框架和ajax类库

Rails

 

是否使用了消息服务

 

使用了何种分布式任务管理系统

Starling(队列管理)

 

如何处理广告服务

使用eCPM

 

是否使用了标准的API

Nope

 

团队有多少成员

两个开发

 

团队的技能情况

Me:前端开发,开发(Rails)。最近专注数据库和高扩展性Rails的开发。

Alex:应用程序开发,前端开发,程序架构设计。

 

开发环境

Alex使用OSX,我在ubuntu上,我们使用svn进行同步,我用vim编辑器,alex用textmate。

 

开发进度

逻辑层,测试驱动开发,在应用层,使用迭代开发。

 

缓存策略

使用memcache no TTL,手工设置过期

 

是否采用了客户端缓存机制

 

系统管理

 

如何保证性能

使用Pingdom工具进行网页性能监测。

 

服务器和网络可用性检测

现在我们用自己的检测工具和Softlay提供的ping检测工具。最近我们开发了 FiveRuns作为服务器监控工具。

 

如何做网络和服务器性能图标

没有做

 

如何测试系统

我们分模块测试,然后完善的部分,部署到应用服务器上。

 

如何做性能分析

分析每条sql语句保证效率。没有测试标准。

 

如何保证安全

小心

 

那些特性需要改进/保持

反思和批评。我们会非常谨慎得增加一些特性。

 

如何做web分析

使用一个成长中的检测工作做病毒检测,也使用了google analytics。

 

是否做A/B测试

一直在做

 

数据中心是如何设置的

 

如何备份和回复系统

LVM,每周做增量备份,每日做基本备份

 

如何升级软硬件

现在手工来做,除非有新的应用。使用capistrano升级和重启应用服务器。

 

如何处理主数据库的升级

一般是先切换一个从数据库为主,升级完后再切换回来。

 

你们的发展计划

不是很好

 

你们有独立的运营团队么

希望有

 

是否使用内容分发系统

Nope

 

盈利模式

CPM,浏览多收入多。也通过虚拟货币盈利。

 

如何营销你们的产品

口碑。病毒传销。

 

在算法上有什么独特的地方

Ruby已经非常优秀。我们只需要简单应用。

 

是否在数据库中存储图片

没有,这样不太好

 

在前端设计上你们都做了什么

在事情发生之前你不知道会发生什么事情。一旦做过,你会有完备的知识去解决下个问题。

 

有什么值得关注的好事或者坏事

不可靠的硬件,托管商之间沟通的困难,最重要的事情是选择一个能支持你应用的托管商。(sun补充:好像他们的运维都是idc来做)。另一个重要的事情是商用硬件做一个主从设置能支撑多久,你可以轻松支撑10亿级访问。

 

系统什么时候增加新的扩展

没这个计划,事情来了才去计划。

 

有什么值得发扬的

Memcache,你可以随意切分你的架构

 

未来是否要调整架构

我们马上要给用户数据库分区,因为马上就会达到数据库的极限。

 

Facebook 营销思想

 

Facebook 成功的把社会关系网络数字化

未来社会关系很重要

Facebook把飞速发展的社会关系放在了互联网上

你的应用创意可以是:社会性的,诱人的,通用的。

社会化的病毒营销

货币化

普遍具有潜力

朋友买卖是个社会,因为你可以买卖你的社会关系

因为它只是一个概念,没有压力并且有点调侃的玩,所以非常有趣

它是公平的因为每个人都是虚拟的,有价钱,而且都想变得有人缘。

每次应用都可能发展一些新的用户

从增长指数上来计算,每个人都能影响1.4个人

每个用户发出好多邀请,查看公告,阅读feed,查看用户资料,和其他的项目

每个频道都能跟踪用户点击,修改,和卸载

 

本节收获

 

扩展性从开始就是facebook的一个方向,他们在一周内就做到每天1000000pv的访问量

Ruby on Rails可扩展

扩展性表现在架构上,关注架构和运营

你需要个好的DBA,好的托管商,合理的硬件

利用cache和高负载的硬件,你不用去做负载的数据库优化

社会关系是真实的,它构建于facebook的用户基础上,而且有非常好的虚拟应用。

大部分问题都是数据库的,数据库服务器,数据库配置,查询,和索引。

用户依然试用VI

 

原创粉丝点击