写点什么

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:572231
用户头像

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

关注

评论 1 条评论

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

基于深度学习的医学图像分割(一)

cv君

AI 引航计划

TensorFlow by GoogleCNN识别猫和狗, 过拟合优化 易筋 ARTS 打卡 Week 70

John(易筋)

ARTS 打卡计划

【Flutter 专题】35 图解自定义 View 之 Canvas (三)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

源码 | 为金融场景而生的数据类型:Numeric

RadonDB

数据库 postgresql

业界首个机密计算容器运行时—Inclavare Containers正式进入CNCF!

阿里巴巴云原生

阿里云 容器 云原生

VSCode设置Python的unittest测试

陈磊@Criss

第 12 章 -《Linux 一学就会》-重定向和文件的查找

学神来啦

云计算 Linux 运维 linux学习

【布隆过滤】大数据+查重过滤+爬虫领域精选算法

cv君

AI 引航计划

保姆级人工智能学习成长路径

herosunly

AI 引航计划 内容合集

Vue进阶(幺贰柒):插槽详解

No Silver Bullet

Vue 插槽 10月月更

智慧火电扭转传统运作模式,3D可视化助力双碳政策疾行

一只数据鲸鱼

数据可视化 智慧能源 火力发电 智慧火电 火电厂

Form Schema 定义详解

全象云低代码

大前端 低代码平台 JSON Schema

Interrupted Exception异常可能没你想的那么简单!

华为云开发者联盟

线程 JVM 高并发 并发 java

OpenKruise 如何实现应用的可用性防护?

阿里巴巴云原生

阿里云 开源 云原生 OpenKruise

自定义Vue脚手架模板之:Vue-Cli源码分析

Brave

源码 vue cli 10月月更

从头开始(概率)学HMM:精讲第四课-预测问题(维特比算法)

herosunly

AI 引航计划 内容合集

【LeetCode】重复的DNA序列Java题解

Albert

算法 LeetCode 10月月更

010云原生之可观测架构模式

穿过生命散发芬芳

云原生 10月月更

mysql cpu占用超过100%

hasWhere

netty系列之:使用netty搭建websocket客户端

程序那些事

Java Netty websocket 程序那些事

何时适合进行自动化测试?(上)

禅道项目管理

自动化测试

disruptor在数据同步场景下的应用实战

编程 架构 面试 后端

决策树——从原理走向实战

cv君

AI 引航计划

从头开始(概率)学HMM:精讲第三课-概率计算问题

herosunly

AI 引航计划 内容合集

仁兄,可曾听闻OpenVINO

cv君

AI 引航计划

从头开始(概率)学HMM:精讲第五课-EM算法

herosunly

AI 引航计划 内容合集

🐬【MySQL技术专题】该换换你的数据库版本了,让我们一同迎接8.0的到来哦!(初探篇)

码界西柚

MySQL 运维 MySQL8.0 MySQL 数据库 10月月更

定制个机器人帮你和Ta聊天

万俊峰Kevin

golang chatbot 聊天机器人 微信聊天

为了减少代码复杂度,我将if-else升级为面向状态编程

华为云开发者联盟

编程 复杂度 面向状态编程 if-else

【设计模式】第一篇 - 组合模式

Brave

组合模式 10月月更

架构实战营作业 -- 模块四

冬瓜茶

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