服务热线:400-0033-166
万商云集 - 企业数字化选用平台

企业首选的

数字选用平台

看5名技术人员是如何支撑起整个系统的:Instagram网站的图片存储架构

2020-12-31 09:10:57 阅读(146 评论(0)

Instagram是Facebook以10亿美元收购的著名手机照片共享应用程序,最近引起了无数人的关注。Instagram联合创始人MikeKrieger表示,他们花了8周时间建造了最初的Instagram,但现在的系统肯定已经不是以前的样子了。Instagram技术团队发表了一篇文章,介绍了Instagram背后的技术。最近,MikeKrieger在名为ScalingInstagram的演讲中介绍了更多细节,让人们知道五名技术人员是如何支持整个系统的。上传一张照片的过程如下:1。同步写入媒体数据库;2.如果照片上有地理位置标签,则异步将照片提交给Solr索引;3.将照片的ID添加到每个关注者的列表中,并将其保存在Redis中;4.显示Feed时,选择一小部分照片ID,在Memcached中查询;5.设计系统时,Instagram的设计理念简单,优化和监控所有内容,减轻运维负担;其核心原则是保持简单,不重复发明轮子,尽可能使用验证、稳定、可靠的技术。由于只有5名技术人员(其中只有2.5名后端工程师)精力有限,选择Amazon的云服务是个不错的选择。由于只有5名技术人员(其中只有2.5名后端工程师)精力有限,选择Amazon云服务是一个不错的选择。目前,他们使用了100多个EC2实例来提供各种服务。操作系统为Ubuntu11.04,以前的一些版本在高流量时表现不稳定。在负载平衡方面,他们使用Amazon的ElasticloadBalancer来实现负载平衡,后端运行了三个Nginx实例,SSL只在ELB上,减少了Nginx上的CPU负载。DNS和CDN分别由Amazon的Route53和CloudFront提供,所有照片都存储在S3上,目前有几个TB规模。AmazonHighigh操作用于处理请求的应用服务器-CPUExtra-在Largeinstance之上,因为他们的要求更多的是CPU密集型,所以这可以更好地平衡CPU和内存。开发框架为Django,WSGI服务器为Gunicorn,通过Fabric在所有机器上并行部署,一次只需几秒钟。PostgreSQL中存储用户信息、图片元数据、标签等大部分数据。在实践中,发现Amazon的网络磁盘系统在单位时间内找道能力不好,因此有必要将数据尽可能放入内存中。为了提高IO能力,创建了软RAID,使用MDADM工具进行RAID管理。vmtouch是管理内存中数据的小工具,值得推荐。PostgresQL设置为Master-Replica模式,流复制模式。使用EBS快照备份数据库。为了充分配合快照服务,使用XFS文件系统。PostgreSQL复制管理器采用repmgr这个小工具。Pgbouncer用于连接池管理。ChristophePetus的文章包含了很多PostgreSQL数据库的信息。Pgbouncer在连接数据库时建立应用程序连接池。目前,Instagram的数据根据用户ID进行分割,有些分割可能超过物理节点的容量上限,因此将数据分成多个逻辑分割,映射到少数物理节点;当一个节点被填充时,一些逻辑分割可以移动到其他节点,以减轻节点的压力。随着数据量的增加,他们将在未来进行垂直分区,DjangoDBRouter可以让一切轻松得多。Instagram还使用Redis存储复杂的对象(对象的大小有一定的限制),用于主Feed、活动Feed、会话系统等相关系统。因为Redis的所有数据都应该放在内存中,High也应该用在这里-MemoryQuadrupleExtra-LargeInstance,并对数据进行了分片。当Redis实例的要求达到4000/秒时,它逐渐成为瓶颈,因此Redis也从复制开始,复制的数据经常导出到磁盘上,并通过EBS快照备份。除了Redis,他们还使用Memcached作为缓存,目前运行了6个例子,应用服务器通过pylibmc和libmemcached连接。Amazon虽然提供Elasticcache服务,但服务价格并不便宜。相比之下,运行自己的Memcached实例更划算。Gearman用于异步任务队列。目前,处理各种任务的工作流程约为200个,如与Twitter和Facebook分享照片、通知用户新照片等。Pyapns已经处理了10亿推送通知,非常稳定。他们还开发了自己的基于Node的推送通知.jsnode2dm,用于向Android设备发送推送通知。在监控方面,Instagram使用Munin以图形化的方式呈现整个系统的运行状态,并通过Python-Munin定制一些插件来显示业务数据;Stated可以实时收集和总结网络保护过程;Dogslow将监控过程。一旦发现过程运行时间过长,将保存过程快照进行后续分析,例如,响应时间超过1.5秒的请求通常卡在Memcachedset()和get_many()方法。只要登上Sentry,Python的错误就可以实时获取错误信息。Highscalability还根据Instagram团队软件工程师MikeKrieger的演讲,整理了一些值得借鉴的经验,比如:1。找到你熟悉的技术和工具,在简单的使用场景中做一些尝试。2.不要用两个工具来处理同样的任务。3.提前准备降级方案,必要时减轻负荷。4.不要过度优化。或者希望事先知道网站应该扩展。对于一个初创的社交网站来说,没有扩展问题是无法解决的。5.如果一个方法不好,请尽快更换另一个方法

内容来源:网络,以上内容来源于网络,不代表本站观点,如有侵权,请联系删除。

最新文章