写点什么

Instagram 如何跨大洋拆分有状态服务

  • 2018-12-01
  • 本文字数:1321 字

    阅读完需:约 4 分钟

Instagram如何跨大洋拆分有状态服务

在最近举行的 Large Installation System Administration(LISA)2018 大会上,Instagram 产品工程师 Sherry Xiao 解释了他们的团队如何将 Instagram 服务分散在美国和欧洲的数据中心。他们使用了 Facebook 工程团队的工具,在有状态服务(Cassandra 和 TAO)中解决了数据本地性(locality)问题。


Facebook 在 2012 年收购了 Instagram,后者迁移到了 Facebook 的基础设施上。Instagram 的基础设施只部署在美国,而 Facebook 的数据中心位于美国和欧洲。Instagram 的技术栈主要包括 Django、Cassandra、TAO 分布式数据存储、Memcached 和 Celery 异步作业。他们不得不在美国和欧盟数据中心之间拆分服务,以解决数据存储空间限制问题。Cassandra quorum 调用的高延迟,为数据本地性划分数据集,在欧盟区域内进行故障转移以及为 TAO 进行主副本同步,这些都是团队在进行服务拆分时必须克服的挑战。



图片来源——https://www.youtube.com/watch?v=2GInt9E3vrU


Instagram 使用 Cassandra 作为通用的键值存储服务。他们将 Cassandra 与其他组件从 AWS 转移到 Facebook 自己的数据中心。Cassandra 在数据中心使用法定数量的副本来实现读写一致性。维护欧洲数据中心的数据副本会导致存储浪费,而 quorum 请求需要跨洋,延迟太高,不可取。Instagram 团队改为使用名为 Akkio 的工具对数据进行分区,这样美国用户的数据位于美国数据中心,欧盟用户的数据位于欧盟的三个数据中心。Akkio 是一款由 Facebook 开发的数据布局工具,可以对数据检索进行优化。它通过将数据分组为逻辑集来实现布局,然后将逻辑集存储在最靠近经常访问它们的最终用户的数据中心。Xiao 说,Akkio“跟踪最终用户的访问模式并触发数据迁移”。


这种架构消除了在每个数据中心存储所有数据副本的必要。美国和欧盟的数据中心可以独立运作,quorum 请求可以留在同一个大陆。Instagram 还使用 Social Hash 分区器将请求路由到正确的存储桶,尤其是对于拥有大量关注者的帐户。


Instagram 也使用了 Facebook 的 TAO 来存储社交图数据。在分片模式下,TAO 的每个分片都有一个主节点。写入操作只会被转发给运行在美国数据中心的主节点,副本是只读的。该团队修改了 TAO,让它可以将写入操作传给欧盟地区的本地主节点,避免跨洋调用。为什么不在这里使用 Akkio?Xiao 解释说,“与 Cassandra 相比,TAO 拥有不同的数据模型。大多数用例都是使用用户 ID 作为键,数据属于用户”。相比之下,TAO 处理的对象可以被全球各地的用户访问,因此 Akkio 无法实现最佳的数据本地性。


在最终的架构中,在前端有一个无状态的 Django 层,后面是分区的 Cassandra 和 TAO,数据被写入本地主节点。迁移需要改变灾难恢复(DR)计划,因为延迟以及不同的数据集会导致无法实现跨洋的灾难恢复。Xiao 说,每个地区都能够通过在每个数据中心保持 20%的空闲容量来处理来自故障数据中心的负载。


查看英文原文:https://www.infoq.com/news/2018/11/instagram-across-continents

相关推荐


12 月 7 日北京 ArchSummit 全球架构师峰会上,来自 Google、Netflix、BAT、滴滴、美团 等公司技术讲师齐聚一堂,共同分享“微服务、金融技术、前端黑科技、智能运维等相关经验与实践。详情点击 https://bj2018.archsummit.com/schedule


2018-12-01 13:571986
用户头像

发布了 731 篇内容, 共 448.9 次阅读, 收获喜欢 2002 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

PS 进行隐藏图制作

空城机

PhotoShop ps 视觉处理 视觉 隐藏图

我还不懂什么是分布式事务

好好学习,天天向上

Java MySQL spring 分布式 事务

图片的黑魔法——GitHub 热点速览 v.21.13

HelloGitHub

GitHub 开源

推进智能变革,HPE让零售业的数字化梦想照进现实

Lily

无需编程,通过配置零代码生成CRUD RESTful API

crudapi

RESTful 低代码 API crud crudapi

2020 年前端技术发展盘点

三钻

发展 大前端 组件化 机会与趋势

关于Vue权限路由思考

程序员海军

Vue 大前端 vue-router 权限认证 按钮权限

AA

郑伟

标签

万物皆可拆

小匚

来,在图片上画个矩形吧,取经之旅第 14 天

梦想橡皮擦

3月日更

go + ffmpeg + goav 实现拉流解码器

张音乐

音视频 ffmpeg Go 语言 goav

Centos7下Docker安装&配置&镜像加速

happlyfox

学习 ,docker 3月日更

Kafka、RabbitMQ、RocketMQ 之间的区别是什么 ?

AI乔治

Java kafka 架构 消息队列

科普NA公链(Nirvana):NAC公链采用基于NIO的Netty,实现链上应用百万级TPS并发​

区块链第一资讯

史上最全教程:idea将Java项目打包Jar包,并生成exe可执行文件

madison

Java jar包转exe可执行文件 exe4j

Python API 类型系统的设计与演变

李宇飞

API

MySQL主从原理,基于快速学习一门技术的3种方式

博文视点Broadview

【Axure9百例】47.CSDN的列表样式

zhuchuanming

原型设计 Axure 交互原型

从新手到专家:如何设计一套亿级消息量的分布式IM系统

JackJiang

架构设计 即时通讯 IM

双非怎么了

我是程序员小贱

3月日更

书单|互联网企业面试案头书之数据分析师篇

博文视点Broadview

记上周双休日的加班

sadhu

加班

缓存不一致、缓存雪崩、缓存击穿、缓存穿透

escray

redis 学习 极客时间 3月日更 Redis 核心技术与实战

Java + opencv实现视频人脸检测

张音乐

OpenCV 人脸识别 视频

Redis - 主从模式

insight

redis 3月日更

算法:求两个单向链表的最早公共交点

程序员架构进阶

算法 链表 28天写作 3月日更 算法解析

工作四年,分享50个让你代码更好的小建议

比伯

Java 程序员 架构 程序人生 计算机

局域网服务器访问外网方案

程序员与厨子

Linux 网络 路由表

Firebase 命令行工具

HoneyMoose

华为云副总裁薛浩:云原生视频服务,重塑体验,助力产业升级

华为云开发者联盟

云原生 音视频 视频 华为云 AR/VR

区块链农产品溯源系统开发,区块链农产品溯源平台的搭建

13828808769

区块链 区块链+ #区块链#

Instagram如何跨大洋拆分有状态服务_架构_Hrishikesh Barua_InfoQ精选文章