- 浏览: 720304 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (76)
- DB-MySQL-noSQL-K/V (0)
- Tomcat-Jetty-JBoss (0)
- Java (12)
- Python (5)
- SVG (0)
- IDE-Eclipse (1)
- Vi-Vim (1)
- DWR-EXT-GWT-JSF (0)
- HTML-XHTML-XML-JSON-HTML5 (1)
- FLEX-ActionScript-AIR (1)
- 软件过程-软件质量 (2)
- 数学-计算数学 (2)
- 数学-数理统计-R (5)
- 信息论-系统论-控制论 (1)
- Golang (5)
- Erlang (2)
- 生活-心情 (1)
- 领域-生物信息学-基因组学 (6)
- 领域-生物信息-开发 (2)
- 领域-分子进化与系统发育-比较基因组学 (2)
- 数据-存储-交换 (3)
- 数据可视化-dataviz-infographic (4)
- 分布式-并行-云计算-网格-IaaS (3)
- PaaS-GoogleAppEngine-SAE (4)
- REST-RESTful-Restlet (2)
- RIA (0)
- 职业-程序人生 (3)
- 项目管理-PM-PMP (1)
- 分析-设计-架构 (10)
- 数据结构-算法 (6)
- 行业-创业 (3)
- 网虫生活-APP (2)
- Matlab-Scilab (2)
- JavaFX (1)
- Lisp-Lua-Haskell-FP (1)
- IT技术选型-咨询顾问 (3)
- Server-Apache-Nginx-lighttp (1)
- 数据可视化-Circos (0)
- 领域-互联网-移动互联网-IM (8)
- 领域-电子商务-B2C-O2O (1)
- 学术-科学研究 (2)
- IM-XMPP-STUN-TURN (0)
- Lucene-Solr-ElasticSearch (0)
- 分布式-HA-zookeeper (0)
最新评论
-
bluky999:
转:Python 标准库 urllib2 的使用细节http: ...
python发送GET或POST请求以便干一些趣事 -
bluky999:
aber_song 写道兄台,你实践完了吗,最近也在看这个,期 ...
使用web2py开发python web程序,部署到GAE或者apache上 -
aber_song:
兄台,你实践完了吗,最近也在看这个,期待呀。
使用web2py开发python web程序,部署到GAE或者apache上 -
luyuwww:
...
一位Erlang程序员的自白 -
bluky999:
STUN和TURN服务器 restundhttp://www. ...
pystun 和 py2exe 以及 NAT类型检测
来源:
51CTO 作者:
Alpha译 责编:
豆豆技术应用 2009年05月14日
关键字:
设备驱动程序 WSRR WebSphere Portal Message Broker WebSphere Message Broker
Haystack提出了一种通用的基于HTTP的对象存储,它含有指针,映射到存储对象。在Haystack中以指针储存照片,把数以十万计的图像聚集到一个Haystack存储文件,从而消除了元数据负荷。这就使得元数据的开销非常小,并且使我们能够在存储文件和内存索引中存储每个指针的位置。这就使得能用少量的I/O操作来完成图像数据的检索,可以消除一切不必要的元数据开销。
照片应用程序是Facebook最流行的功能。直至目前为止,Facebook的用户已经上传了超过150万幅照片,这使得Facebook成为最大的照片共享网站。对于每一个上传的照片, Facebook生成并保存成4种不同大小的图像,即总共有60亿的图片占1.5PB的存储容量。目前的增长速度是每星期220万个新照片,即每周消耗25TB的额外存储空间。在高峰期,平均每秒会上传550,000幅图像。这些数字给Facebook的照片存储基础架构带来了严重的挑战。
NFS照片基础架构
旧的照片基础架构包含几个层次:
◆上传层接收用户上传的照片,测量原始图像的大小并将其保存到NFS存储层。
◆照片服务层接收HTTP照片请求,并向用户提供保存于NFS存储层的照片。
◆NFS存储层建立于商业存储设备之上。
由于每个图像存储在自己的文件内,所以根据命名空间目录和文件inode(内节点),在存储层产生了大量的元数据。这些元数据量远远超过了NFS存储层的缓存能力,导致了上传和读取每张照片时成倍的I/O操作。整个照片服务的基础架构由于NFS存储层的大量元数据负荷而成为了一个瓶颈,这就是Facebook严重依赖CDNs来提供照片服务的原因之一。以下两个附加的优化部署,用来在一定程度上减轻这个问题:
Cachr :一个缓存服务层,用来缓存Facebook中较小的“个人资料”图像。
NFS文件句柄缓存——部署在照片服务层,消除了一些NFS存储级元数据负荷
Haystack照片基础架构
新的照片基础架构将照片服务层和存储层合并为一个物理层。它实现了一个基于HTTP的照片服务器,把照片存储在名为Haystack的通用对象中。对于新层次的主要要求是消除任何照片读取操作的不必要的元数据开销,使每个读取I/O操作只是读取实际照片数据(而不是文件系统元数据)。Haystack可划分为以下一些功能层-
◆HTTP服务器
◆照片存储
◆Haystack对象存储
◆文件系统
◆存储设备
以下各节中,我们会自底向上密切关注每一个功能层。
存储设备
Haystack部署于日常存储片之上。一个2U存储片的典型硬件配置的是-
◆2 x 4核CPUs
◆16GB – 32GB内存
◆具有256MB – 512MB NVRAM缓存的硬件RAID控制器
◆12+ 1TB SATA驱动器
每个存储片提供大约10TB的可用空间,配置为一个RAID-6分区,由硬件RAID控制器进行管理。RAID 6提供了足够的冗余性和出色的读取性能,可以降低存储成本。RAID控制器NVRAM回写高速缓存可以部分缓解低劣的写性能。由于读取大多是随机的,所以NVRAM缓存完全保留给写操作。磁盘高速缓存被禁用,以保证在系统崩溃或电源断电时数据的一致性。
文件系统
Haystack对象存储实现于一个文件之上,该文件存储在一个单一文件系统上,该文件系统建立于10TB volume(卷)大小的空间之上。
照片读取请求导致read()系统调用请求读取文件中不同偏移量的信息,但为了执行读取操作,文件系统必须首先在实际物理卷上找到数据。在文件系统中,每个文件的是由一个名为inode的结构所描述,该结构包含一个块映射,可以把逻辑文件偏移量映射到物理卷中的物理块偏离量。对于大文件,根据所使用的文件系统类型的不同,块映射可能会相当庞大。
基于块的文件系统为每个逻辑块维护其映射信息,对于大文件,这些映射信息将不会像通常那样存入缓存的inode,而是储存在间接地址块,读取文件数据时需要进行转换。间接转化可能存在好几个层次,因此,根据间接地址块是否被缓存,单一的读取可能会导致若干个I/O操作。
基于范围的文件系统只为连续的块(区域)维护映射信息。对于一个连续大文件的块映射只由一个区域组成,此区域的大小正好可以装入inode之中。但是,如果该文件是严重地分散和不连续的,其区块在卷中不连续,那么其块映射可以随之增长。有了基于范围的文件系统,就可以通过积极分配一大块空间来减少碎片。
目前,所选择的文件系统是的XFS,基于范围的文件系统提供有效文件预分配。
Haystack对象存储
Haystack是一个简单日志结构(只追加)的对象存储,包含描述存储对象的指针。一个Haystack包括两个文件——实际的包含指针的Haystack存储文件,以及一个索引文件。下图显示了Haystack存储文件的结构布局:
第一个8KB的Haystack存储由超级块所占用。紧接着超级块的是指针,每个指针由页眉、数据、和页脚组成。
一个指针是由其﹤Offset(偏移量), Key, Alternate Key(替换键),Cookie﹥元组唯一确定,其中偏移量是指在Haystack存储中的指针偏移量。Haystack对于关键字的值没有任何限制,有的指针可以有多个关键字。下图显示的是索引文件的结构布局—
在Haystack存储文件中,每个指针有一个相应的索引纪录,而且指针索引纪录的顺序必须与Haystack存储文件中相关的指针顺序相匹配。索引文件提供查找Haystack存储文件中某一特定指针所需的最小元数据。为了快速查找,把索引记录载入并组织到一个数据结构中,这是Haystack应用程序(在我们的情况下是照片存储)的职责。索引文件不是至关重要的,因为它可以根据所需从Haystack存储文件中重建。索引的主要目的是可以快速加载指针元数据到内存中,而无须遍历庞大的Haystack存储文件,这是因为索引的大小通常还不到存储文件的1%。
Haystack写操作
Haystack写操作同步添加新的指针到Haystack存储文件中。当指针成功添加到庞大的Haystack存储文件中之后,相应的索引记录也被写入索引文件。由于索引文件不是至关重要的,为了达到更快的性能,该索引记录是异步写。
索引文件还会定期被刷新到下面的存储设备,以便限制由硬件故障所引起的恢复操作的程度。在系统崩溃或突然断电的情况下,Haystack恢复程序丢弃所有存储中的不完整的指针,同时截断Haystack存储文件直到最后一个有效的指针,然后,在Haystack存储文件最后为所有跟踪的孤立指针写入丢失的索引记录。
Haystack不允许覆盖已存在的指针偏移量,因此,如果某个指针的数据需要修改,其修改后的新版本必须使用相同的﹤Key, Alternate Key, Cookie﹥元组。然后应用程序就可以认为,在那些有着多个关键字的指针中,具有最大偏移量的指针就是最新添加的指针。
Haystack读操作
传递给Haystack读操作的参数包括指针偏移量、关键字、替换键、Cookie和数据大小。然后Haystack添加页眉和页脚的大小到数据大小中,并从文件中读取整个指针。只有当关键字、替换键和Cookie符合参数类型,所传递的数据通过校验,并且指针没有被之前的操作删除时,读操作才能成功(见下文)。
Haystack删除操作
删除操作很简单——通过设置指针的标记域中的一个“deleted(已删除)” 标记位,标记Haystack存储中的指针为已删除。然而,相关的索引记录并不进行任何方式的修改,因此一个应用程序可能会结束于引用某个已删除的指针。对于这样的指针的读操作会注意到“deleted”标记,然后终止操作,提示操作错误,给出错误信息。已删除的指针的空间不会以任何方式回收。回收已删除指针的空间的唯一方法是压缩c(见下文) 。
照片存储服务器
照片存储服务器负责接收HTTP请求,并转化成相应的Haystack存储操作。为了尽量减少读取照片所需的I/ O操作次数,服务器在内存中保存一个Haystack存储文件中所有照片偏移量的索引。启动时,服务器读取Haystack索引文件并生成一个内存中的索引。由于每个节点数以亿计的照片(并且该数字只会随着更大容量的驱动器而增加),我们必须确保该索引能够装入可用的内存中。这是通过在内存中保留最少数量的元数据来实现,只保留查找照片所需的信息。
当用户上传一个照片,该照片就被分配一个唯一的64位编号。然后将照片转化为4个不同大小的图片。每个图片具有相同的随机Cookie和64位关键字,合理的图像大小(大,中,小,缩略图)是储存在替换键中。然后上传服务器调用照片存储服务器,把所有4个图像存储在Haystack中。
内存中的索引为每张照片保存以下信息:
Haystack使用开源Google稀疏散列数据结构来减小内存中的索引,因为使用它,每条记录只占2位。
照片存储写/修改操作
写操作写入照片到Haystack,并更新内存索引。如果该索引中已经包含了具有相同关键字的记录,那么这就是一个修改现有照片的操作,那么只修改索引记录偏移量,以反映新图像在Haystack存储文件中的位置。照片存储总是假设存在重复的照片(具有相同关键字的照片),只有存储在最大偏移量位置的照片是有效的。
照片存储读操作
传递到读操作的参数包括Haystack id 和照片关键字、大小和COOKIE 。服务器根据照片关键字,执行一个在内存索引上的查找操作,然后得到含有所需照片的指针偏移量。如果发现调用的是Haystack读操作来读取照片,那么如上所述,Haystack删除操作并不更新Haystack索引文件记录。因此,一个新的内存索引可能会包含之前删除的照片的旧记录。读取之前删除的照片将会导致操作失败,并且内存中的索引会自动更新,设置已经删除图像的偏移量为0。
照片存储删除操作
在调用Haystack删除操作之后,内存中的索引被更新,设置特定图像的偏移量为0来表示该图像已经被删除。
压缩
压缩是一个联机操作,可以回收已被删除的指针和重复指针(具有相同关键字的指针)所占用的空间。它通过复制指针创建一个新的Haystack,跳过所有重复和已删除的指针。每次这样做,就会交换文件和内存中文件的结构。
HTTP服务器
我们使用的HTTP框架是由开源lib event图书馆所提供的简单的evhttp服务器。我们使用多线程,同一时间内,每个线程能够处理一个HTTP请求。因为我们的工作量最主要是由I/O操作产生,因此HTTP服务器的性能并不是至关重要的。
发表评论
-
Akka 简介与入门
2014-10-31 10:21 2311Akka 简介与入门 参考官网 http://a ... -
分布式基础知识和算法理论
2014-08-12 19:55 1551分布式基础知识和算法理论 BY NODEXY@ ... -
IBMDW: 数据层的多租户浅谈
2014-03-21 10:57 1134数据层的多租户浅谈 http://www. ... -
陌陌技术架构的相关公开资料
2014-03-04 09:41 61181. 陌陌移动开发技术分享 http://ww ... -
短视频分享应用与服务器实现
2014-01-06 16:06 2770目前比较火热的一个话题是短视频,比如你可能听说过的 ... -
消息队列与 ActiveMQ, RabbitMQ,ZeroMQ 等
2013-12-31 15:15 11561关于消息队列 对于一个消息系统,提高吞吐量的同时 ... -
【转】【PPT集萃】十位一线专家分享Spark现状与未来
2013-12-27 17:06 1132【PPT集萃】十位一线专家分享Spark现状与未来 ... -
Openfire附近的人插件 OpenfireLBS
2013-12-23 17:42 2725项目代码 https://github.com/node/ ... -
Openfire 性能调优和集群方案
2013-07-24 17:39 22280Openfire 性能调优和集 ... -
pystun 和 py2exe 以及 NAT类型检测
2012-04-19 13:32 7229今天把pystun的python脚本打包成了.exe方便 ... -
网络穿透 与 NAT类型 及 STUN TURN 协议
2012-04-17 18:16 11439网络穿透 与 NAT类型 及 STUN TUR ... -
关于hadoop的入门和进阶文章收录
2012-04-07 22:46 26371 Hadoop http://hadoop.apac ... -
协议测试与服务器性能测试工具 列表
2012-03-22 15:56 3989协议测试与服务器性能 ... -
关于XMPP和openfire中的消息回执和聊天状态
2011-11-30 16:18 17178关于XMPP和openfire中的消息回执和聊天状态 ... -
XMPP协议中的隐私策略
2011-10-25 15:55 2554XMPP协议中,隐私策略按内容分 presence-in, p ... -
Java web 负载均衡 和 缓存
2011-09-17 14:31 2982Java web 负载均衡 和 缓存 1 ap ... -
使用MINA2开发服务端程序
2011-09-08 14:18 2824使用MINA2开发服务端程序 关键字 :MIN ... -
将 openfire 源码作为java项目导入eclipse调试
2011-08-10 16:17 10041将 openfire 源码作为java项目导入ec ... -
IM 系统架构与开发的相关知识
2011-08-07 22:49 16963这只是一个关于IM系统架构与开发相关知识的简易list 。 ... -
关于 “推荐引擎” 的dw文章收集
2011-08-03 20:18 2066这不是一篇文章,只是一个ibm dw上的文章list - 关于 ...
相关推荐
3. **分布式存储系统**:Facebook开发了Haystack和Tao等自定义的分布式存储系统,用于存储图片、用户资料等非结构化数据,提高读取速度并减少I/O操作。 4. **BigPipe**:为了解决页面加载速度问题,Facebook推出了...
这个过程涉及到网络请求、HTML解析以及图片加载技术。当用户在Facebook的状态更新框中粘贴一个包含图片的网页URL时,Facebook的后台系统会自动抓取网页中的元数据,包括图片,然后展示在用户的动态中。这种分享方式...
在这个压缩包中,开发者可以深入理解Facebook应用程序的设计理念、架构以及它如何利用Android平台的功能。 1. **Android源码解析** Android源码是开源的,这使得开发者有机会学习到系统级别的工作原理。Facebook...
《深入解析SNS网站架构》 社交网络服务(SNS)网站架构是构建大规模在线社区的关键,其设计需要兼顾性能、可扩展性和稳定性。本篇文章将围绕SNS网站架构的演变、核心技术和架构模式展开,探讨如何构建高效且灵活的...
总结来说,《大型网站技术架构:核心原理与案例分析》这本书全面覆盖了构建大型网站所需的各类核心技术,并通过实例解析了这些技术在实际工作中的具体实施和效果,对于从事互联网开发和运维的专业人士来说,是一本极...
### 高性能高并发服务器架构的关键知识点解析 #### 一、引言 在当前互联网快速发展背景下,越来越多的应用和服务面临着高并发、大流量的挑战。如何构建一个既能满足高并发需求又能保证高性能的服务器架构,成为了...
源码中会包含与Facebook API交互的代码,这涉及到OAuth授权、JSON解析以及错误处理机制。 4. **异步处理**: 为了保证UI的流畅,源码中会有大量的异步任务,例如使用AsyncTask或者Handler-Looper机制进行后台操作...
Facebook大量使用了Retrofit库进行网络请求,结合Gson进行数据解析,实现了高效的数据获取和展示。此外,OkHttp作为网络通信的基础库,提供了强大的缓存机制和性能优化,确保了在网络条件不佳时也能有良好的用户体验...
本篇文章将根据提供的部分文档内容,深入解析Facebook在2011年的硬件配置情况,包括服务器的类型、内存、CPU以及存储设备等关键组件的具体规格与应用。 #### 二、服务器分类与功能 Facebook将服务器分为六大类:...
【Facebook 技术解析】 Facebook 是全球最大的社交媒体网络平台,由马克·扎克伯格等人在2004年创立。它改变了人们在线互动、分享信息和构建社区的方式。Facebook的技术架构是高度复杂且不断进化的,涉及到多个关键...
在Android程序开发中,源码分析是提升技术能力的重要途径之一。这个压缩包"Android程序研发源码Android 新浪、腾讯、人人、豆瓣、Facebook、Twitter.zip"包含了多个知名社交平台的Android应用源码,这对于开发者来说...
### 大型并发系统的关键架构和技术 #### 一、引言 随着互联网技术的发展和用户需求的增长,构建能够处理高并发请求的系统成为了许多大型网站的核心挑战之一。本篇文章将根据给定文件中的内容,深入探讨高并发系统...
11. **多媒体处理**:图片加载库如Glide或Picasso可能被用于优化图片显示,同时音频视频的播放和上传也是社交应用常见功能。 12. **性能优化**:包括内存优化、耗电优化、启动速度优化等,这些都是提升应用质量的...
这篇文档将深入探讨在Android平台上开发社交应用的相关知识点,基于提供的标题和描述,我们可以了解到这是一个包含新浪、腾讯、人人、豆瓣、Facebook和Twitter等知名社交平台的Android应用源码示例集合,非常适合...
【Facebook_Bot】是基于TypeScript开发的一种自动化交互工具,主要...在【facebook_bot-first_setup】阶段,主要任务是搭建基础架构,配置Facebook应用,安装依赖,初始化项目结构,为后续的开发工作打下坚实的基础。
5. **服务器端处理**:用户上传的图片和生成的动画需要在服务器端进行处理和存储。这涉及服务器架构、数据库管理(如MySQL或NoSQL)以及文件系统的管理。 6. **安全性与隐私**:考虑到用户可能会上传个人照片,系统...
《深入解析Android手机淘宝客户端》 在移动互联网的浪潮中,Android平台的淘宝客户端作为电商领域的领军应用,其背后的技术架构和实现原理是许多开发者关注的焦点。本文将基于“Android淘宝客户端”的源代码,详细...
通过对"andricoFacebook客户端Android源码"的深度研究,开发者可以学习到如何在Android平台上实现一个完整的社交应用,理解网络请求、数据存储、UI设计等多方面的技术,为自己的开发工作积累宝贵经验。同时,这种...
1. **网站架构**:全站系统通常指的是一个整体的网络平台,它可能基于Web应用架构,如MVC(模型-视图-控制器)模式,用于分离业务逻辑、数据处理和用户界面。常见的框架如Spring Boot、Django或Rails可能会被用到。 ...