七月 19th, 2010Facebook背后的软件

Facebook的数据规模使得很多传统的解决方案根本不适用,或者无法分解来处理。保持一个拥有5亿用户的系统一直稳定可靠的运行,并不是一件很容易的事情。这篇文章介绍了一下Facebook使用的软件。
 
Facebook的扩展性挑战
 
在我们讨论细节之前,这里有一些Facebook已经做的软件规模:
 
> Facebook有570000000000每月页面浏览量 (据Google Ad Planner)。
 
> Facebook的照片量比其他所有图片网站加起来还多(包括Flickr等网站)。
 
> 每个月超过30亿张照片被上传。
 
> Facebook的系统服务每秒处理120万张照片 。 这不包括CDN服务中处理的照片。
 
> 每月超过25亿条的内容 (状态更新,评论等)被共享。
 
> Facebook有超过30,000服务器 (这个数字是去年的!)
 
Facebook扩展所依赖的软件
 
Facebook是在某些程度上说仍然是LAMP的站点,但它比普通的LAMP大得多,以纳入其他元素和很多服务,并修改现行的做法。
 
例如:
 
> Facebook也使用PHP,但它已经为它建立一个编译器,以便它可以分为本地代码打开了Web服务器,从而提高性能。
 
> Facebook也使用Linux,但它特别为网络吞吐量做了优化。
 
> Facebook也使用MySQL,但主要是作为一个Key-value的持久性存储,Jions和服务器逻辑操作在Web服务器上操作。因为在那里更容易执行。
 
> 还有是自编写的系统,如Haystack,一个高度可扩展的对象存储,用来存储Facebook的照片。还有Scribe,一个日志系统,可以运行在Facebook的巨大规模上的日志系统。
 
OK。现在 我们介绍一下全球最大的社会网络网站的所使用的软件吧。
 
Memcached
 
memcached的
是现在互联网最有名的软件之一了。 这是一个分布式内存缓存系统,用来作为Web服务器和MySQL服务器之间的缓存层(因为数据库访问比较慢)。
多年以来,Facebook已经提出了一些优化Memcached和一些周边软件的办法。如压缩network stack。
 
Facebook的每时每刻都有数10TB的数据缓存在Memcached的数千台服务器上。 它可能是世界上最大的Memcached的集群了。
 
HipHop for PHP
 
PHP作为一种脚本语言,和本地程序相比是运行缓慢的。 HipHop可以将PHP转换成C++代码,然后再进行编译,可以获得更好的性能。 因为Facebook严重依赖PHP,这使得其可以让Web服务器运行的更有效率。
 
一个工程师小团队在Facebook(一开始只有三人)花了18个月时间开发HipHop,现在已经是可用状态。
 
Haystack
 
Haystack是Facebook的高性能照片存储/检索系统(严格来说,是一个对象存储,因此它并不一定要存储照片)。 它有许多工作要做;有超过20亿张上传的照片,并且每一个被保存在四个不同的分辨率,因此有超过800亿张照片。
 
它不仅是对能够处理的上亿的照片,运行表现也是至关重要的。 正如我们前面提到的,Facebook的服务约120万张照片每秒 ,这个数字不包括CDN上的。 这是一个惊人的数字。
 
BigPipe
 
BigPipe是Facebook开发的一个动态的网页服务系统。 Facebook使用它来按section(称为“pagelets”)处理每个网页,以获取最佳性能。
 
例如,在聊天窗口是分开的,新闻Feed也是分开的,等等。 这些pagelets可以在一个页面表现的时候同时使用,这是该页面表现的时候获取进来的。即使某些工程的一部分关闭或中端,用户也可以获得一部分网页。
 
Cassandra
 
Cassandra是一个不会单点失败的分布式存储系统。 这是为NoSQL运动的一个重要组成部分,并已公开的源代码(它甚至成为一个Apache项目)。Facebook在搜索功能中使用它。
 
除了Facebook,还有一些人也用它,例如Digg的。 不过最近Twitter放弃了cassandra。
 
Scribe
 
Scribe是一个灵活的日志系统,Facebook在他的内部大量使用。 它的能够处理在Facebook的大规模日志记录,并自动处理新的日志记录类别,Facebook有数百个日志类别(categories)。
 
Hadoop and Hive
 
Hadoop的是一个开源的map-reduce实现,使得它可以在进行大数据上进行运算。 Facebook的使用这个进行数据分析(而我们都知道,Facebook已经大量的数据)。 Hive就是发源于Facebook,使得对于Hadoop使用的SQL查询成为可能,从而是其更容易对非程序员使用。
 
Hadoop和Hive是开源的(Apache项目),有为数众多的追随者,例如雅虎和Twitter。
 
Thrift
 
Facebook使用的几种不同的语言和不同的services。 PHP是最终用于前端,Erlang是用于聊天,Java和C ++也使用于多种场所,也许还有其他语言。Thrift是一个内部开发的跨语言的框架,联系语言,使他们可以在一起合作,从而使他们之间可以交互。 这使得Facebook可以更容易为继续保持其跨语言的发展。
 
Facebook已经让Thrift开源。更多的语言支持已被添加到Thrift。
 
Varnish
 
Varnish是一个HTTP加速器,可以作为一个负载平衡器,并缓存的内容,然后可以以闪电般的速度送达。
 
Facebook使用的arnish来处理照片和个人资料图片,处理每天数十亿的要求。 和其他的东西一样,Varnish是开源的。
 
保持Facebook 顺畅运行的其他东西。
 
我们已经提到的软件,组成了Facebook的系统,并帮助运行在大规模上。 但是,处理这么大的系统是一个复杂的任务,因此我们将列出一些其他的东西,他们保持了Facebook的平稳运行。
 
渐进发布和暗启动
 
Facebook有一个他们所谓的守门人制度(Gatekeeper),允许他们可以给不同的用户运行两套不同的系统。 这让Facebook渐进的发布新的功能,A / B测试,只为Facebook雇员发布等的某些特性。
Gatekeeper
也可以让Facebook实现“暗启动”,这是在用户使用一些功能之前,就激活某些功能(因为用户没有察觉,所以称之为暗启动)。
这将作为一个现实世界的压力测试,在正式启动前,帮助揭露一些功能障碍和其他问题。 暗启动通常是在正式启动前两个星期。
 
Profiling的直播系统
 
Facebook的仔细监控其系统,有趣的是它也负责监察每一个PHP函数在生产环境的性能。 检测各个PHP的环境的配置运行情况。使用开源工具,XHProf 。
 
渐进的利用关闭功能来提升性能
 
如果Facebook运行时出现性能问题,有一个办法,就是逐步禁用不太重要的功能,以增强Facebook的大量核心功能表现。
 
我们没有提及的事情
 
我们没有提到硬件相关的事情,但这也是提高可伸缩性的重要一环。例如,就像其他大型站点,Facebook利用CDN来处理静态内容。Facebook还有一个the huge data center,可以帮助他扩展更多的服务。
 
Facebook的开源情节
 
不仅是Facebook使用(和帮助),如Linux,Memcached的,MySQL和Hadoop的开源软件,以及许多其他情况下,也贡献许多了其内部开发的软件。
 
Facebook亦开源了Tornado,一个高性能的网络服务器框架,由FriendFeed团队开发。
 
关于开放源码软件清单,可以在Facebook’s Open [...]

/**
* 读取文件前几个字节 判断文件类型
*
* @return String
*/
function checkTitle($filename) {
    $file = fopen ( $filename, rb );
    $bin = fread ( $file, 2 ); //只读2字节
    fclose ( $file );
    $strInfo = @unpack ( c2chars, $bin );
    $typeCode = intval ( $strInfo ['chars1'] . $strInfo ['chars2'] );
    $fileType = ”;
    switch ($typeCode) {
      [...]

windows上的nginx+php+mysql套装wnpmserver,当前版本

nginx
v0.8.35
(2010-4-14)

php
v5.3.2 (nts)
(2010-3-23)

mysql
5.5.3 m3
(2010-4-14)

下载地址:http://wnpmserver.googlecode.com/files/wnpm.7z
项目地址:http://code.google.com/p/wnpmserver/
注意:需要.net 支持

要求传入数据是utf-8编码,如果不是,请使用mb_convert_encoding()进行转码
/**
    * @param {string} $word 必须是一个汉字,或代表汉字的一个数组(用str_split切割过)
    * @return {string} 一个十进制unicode码,如4f60,代表汉字 “你”
    */ 
function getUnicodeFromOneUTF8($word) {
    //获取其字符的内部数组表示,所以本文件应用utf-8编码!
    if (is_array( $word))
    $arr = $word;
    else
    $arr = str_split($word);
    //此时,$arr应类似array(
    //定义一个空字符串存储
    $bin_str = ”;
    //转成数字再转成二进制字符串,最后联合起来。
    foreach ($arr as $value)
    $bin_str .= decbin(ord($value));
    //此时,$bin_str应类似111001001011110110100000,如果是汉字"你"
    //正则截取
  [...]

因需要,今天下载了ucenter和uchome来安装,结果老是出问题,完全感觉不到装php开源程序的乐趣。但又不得不装上他们去研究一些东西,所以只能跑到代码里去跟踪了,在此将结果分享一下。

七月 1st, 2009php检测远程文件

通常我们会用php去检测远程文件是否存或者是判断远程文件类型,以及通过文件大小来判断远程文件是否有效(比如一首正常的流行歌曲的mp3文件不会少于300k吧)。

方法众多,本人觉得通过socket抓出HTTP报头来判断无疑是性价比最优的。下面就是通过修改HttpClient得到了一个getFileHeader的类(含有示例及结果)

六月 16th, 2009最新CSFT安装手记

CSFT介绍
CSFT,全称为CoreSeek Fulltext Search Server,也就是CoreSeek 全文检索服务器。Sphinx默认不支持中文索引及检索,CSFT是在Sphinx基础上开发的全文检索软件,按照GPLv2协议发行。Coreseek (http://www.coreseek.com) 为sphinx在中国地区的用户提供支持服务。
到写本文时,CSFT最新版为2009.6.7的3.1rc1版。所有版本发表和修订记录见:http://www.coreseek.cn/products/ft_changelog/
CSFT下载
下载地址:http://www.coreseek.cn/products/ft_down/
选择Source版. Coreseek Fulltext Server(源代码) Coreseek Mmseg(源代码)
安装配置CSFT
1.安装mmseg
tar zxvf mmseg-3.1.tar.gz
   cd mmseg-3.1
   ./configure –prefix=/usr/local/mmseg
   make && make install
2.安装csft
tar zxvf csft-3.1.tar.gz
   cd csft-3.1
   ./configure –prefix=/usr/local/sphinx -with-mysql=/usr/local/mysql -with-mysql-includes=/usr/local/mysql/include/mysql -with-mysql-libs=/usr/local/mysql/lib/mysql -with-mmseg-includes=/usr/local/mmseg/include/mmseg -with-mmseg-libs=/usr/local/mmseg/lib -with-mmseg
   make && make install
注意:在make时若提示找不到iconv,则在configure结束后在src下的Makefile中查找到LIBS,然后加上 -liconv
3.生成词典
重回到mmseg的源代码目录
cd data
   mmseg -u unigram.txt
   mv  unigram.txt.uni  uni.lib
  cp uni.lib /usr/local/sphinx/
4.配置(略)

估计这个说法有些诡异,不过我也不知道该怎么描述,对应成字符串就是求最大公共子串,此时的字符串就是数组,字符对应的是数组的元素。
比较常规的方法就是LCS,单纯从c的角度,LCS还是比较耗空间。所有出现了一些替代方法,不过都相对耗时一些。
下面是我用php来计算两个数组中最长公共元素的代码。
function longestComArr(&$newStrArr1,&$newStrArr2){
    $maxlen = 0;
    for($i=0;$i<count($newStrArr1);$i++){
        $j=$r=0;//记录当前短数组下标
        while($newStrArr2[$j] && $newStrArr1[$i]){
            $k=$i;//记录当前长数组下标
            while ($newStrArr1[$k] && $newStrArr1[$k] !=$newStrArr2[$j]) {
                $k++;
            }
            if ($newStrArr1[$k] ==$newStrArr2[$j]) {
  [...]

五月 25th, 2009php分析字符串成单词

用php来尝试给英文进行分词,欢迎大家拍砖,详细代码进入文章查看

PHP分词的上乘之选,原生态支持php中文分词,提供dll库和so包下载。
SCWS 在概念上并无创新成分,采用的是自行采集的词频词典,并辅以一定程度上的专有名称、人名、地名、数字年代等规则集。 采用纯 C 代码开发,以 Unix-Like OS 为主要平台环境,提供共享函数库,方便植入各种现有软件系统。此外它支持GBK,UTF-8,BIG5 等汉字编码。
切词效率测试(UTF-8编码,随机从天涯抓取了一个连载页面测试结果, 45Kb左右的文本切词时间是0.026秒, 换算完毕大概是 1.5MB文本/秒)
项目地址:
http://www.ftphp.com/scws/


© 2006~2010 后羿之弓 赣ICP备10006480号