老的架构

Tumblr最开始是托管在Rackspace上的,每个自定义域名的博客都有一个A记录。当2007年Rackspace无法满足其发展速度不得不迁移时,大量的用户都需要同时迁移。所以他们不得不将自定义域名保留在Rackspace,然后再使用HAProxy和Varnish路由到新的数据中心。类似这样的遗留问题很多。

开始的架构演进是典型的LAMP路线:

  • 最初用PHP开发,几乎所有程序员都用PHP
  • 最初是三台服务器:一台Web,一台数据库,一台PHP
  • 为了扩展,开始使用memcache,然后引入前端cache,然后在cache前再加HAProxy,然后是MySQL sharding(非常奏效)
  • 采用“在单台服务器上榨出一切”的方式。过去一年已经用C开发了两个后端服务:ID生成程序和Staircar(用Redis支持Dashboard通知)

Dashboard采用了“扩散-收集”方式。当用户访问Dashboard时将显示事件,来自所关注的用户的事件是通过拉然后显示的。这样支撑了6个月。由于数据是按时间排序的,因此sharding模式不太管用。

新的架构

由于招人和开发速度等原因,改为以JVM为中心。目标是将一切从PHP应用改为服务,使应用变成请求鉴别、呈现等诸多服务之上的薄层。

这其中,非常重要的是选用了Scala和Finagle

  • 在团队内部有很多人具备Ruby和PHP经验,所以Scala很有吸引力。
  • Finagle是选择Scala的重要因素之一。这个来自Twitter的库可以解决大多数分布式问题,比如分布式跟踪、服务发现、服务注册等。
  • 转到JVM上之后,Finagle提供了团队所需的所有基本功能(Thrift, ZooKeeper等),无需再开发许多网络代码,另外,团队成员认识该项目的一些开发者。
  • Foursquare和Twitter都在用Finagle,Meetup也在用Scala。
  • 应用接口与Thrift类似,性能极佳。
  • 团队本来很喜欢Netty(Java异步网络应用框架,2月4日刚刚发布3.3.1最终版),但不想用Java,Scala是不错的选择。
  • 选择Finagle是因为它很酷,还认识几个开发者。

之所以没有选择Node.js,是因为以JVM为基础更容易扩展。Node的发展为时尚短,缺乏标准、最佳实践以及大量久经测试的代码。而用Scala的话,可以使用所有Java代码。虽然其中并没有多少可扩展的东西,也无法解决5毫秒响应时间、49秒HA、4万每秒请求甚至有时每秒40万次请求的问题。但是,Java的生态链要大得多,有很多资源可以利用。

内部服务从C/libevent为基础正在转向Scala/Finagle为基础。

开始采用新的NoSQL存储方案如HBase和Redis。但大量数据仍然存储在大量分区的MySQL架构中,并没有用HBase代替MySQL。HBase主要支持短地址生产程序(数以十亿计)还有历史数据和分析,非常结实。此外,HBase也用于高写入需求场景,比如Dashboard刷新时一秒上百万的写入。之所以还没有替换HBase,是因为不能冒业务上风险,目前还是依靠人来负责更保险,先在一些小的、不那么关键的项目中应用,以获得经验。MySQL和时间序列数据sharding(分片)的问题在于,总有一个分片太热。另外,由于要在slave上插入并发,也会遇到读复制延迟问题。

此外,还开发了一个公用服务框架

  • 花了很多时间解决分布式系统管理这个运维问题。
  • 为服务开发了一种Rails scaffolding,内部用模板来启动服务。
  • 所有服务从运维的角度来看都是一样的,所有服务检查统计数据、监控、启动和停止的方式都一样。
  • 工具方面,构建过程围绕SBT(一个Scala构建工具),使用插件和辅助程序管理常见操作,包括在Git里打标签,发布到代码库等等。大多数程序员都不用再操心构建系统的细节了。

200台数据库服务器中,很多是为了提高可用性而设,使用的是常规硬件,但MTBF(平均故障间隔时间)极低。故障时,备用充足。

为了支持PHP应用有6个后端服务,并有一个小组专门开发后端服务。新服务的发布需要两到三周,包括Dashboard通知、Dashboard二级索引、短地址生成、处理透明分片的memcache代理。其中在MySQL分片上耗时很多。虽然在纽约本地非常热,但并没有使用MongoDB,他们认为MySQL的可扩展性足够了。

Gearman用于会长期运行无需人工干预的工作。

可用性是以达到范围(reach)衡量的。用户能够访问自定义域或者Dashboard吗?也会用错误率。

历史上总是解决那些最高优先级的问题,而现在会对故障模式系统地分析和解决,目的是从用户和应用的角度来定成功指标。(后一句原文似乎不全)

最开始Finagle是用于Actor模型的,但是后来放弃了。对于运行后无需人工干预的工作,使用任务队列。而且Twitter的util工具库中有Future实现,服务都是用Future(Scala中的无参数函数,在与函数关联的并行操作没有完成时,会阻塞调用方)实现的。当需要线程池的时候,就将Future传入Future池。一切都提交到Future池进行异步执行。

Scala提倡无共享状态。由于已经在Twitter生产环境中经过测试,Finagle这方面应该是没有问题的。使用Scala和Finagle中的结构需要避免可变状态,不使用长期运行的状态机。状态从数据库中拉出、使用再写回数据库。这样做的好处是,开发人员不需要操心线程和锁。

22台Redis服务器,每台的都有8-32个实例,因此线上同时使用了100多个Redis实例。

  • Redis主要用于Dashboard通知的后端存储。
  • 所谓通知就是指某个用户like了某篇文章这样的事件。通知会在用户的Dashboard中显示,告诉他其他用户对其内容做了哪些操作。
  • 高写入率使MySQL无法应对。
  • 通知转瞬即逝,所以即使遗漏也不会有严重问题,因此Redis是这一场景的合适选择。
  • 这也给了开发团队了解Redis的机会。
  • 使用中完全没有发现Redis有任何问题,社区也非常棒。
  • 开发了一个基于Scala Futures的Redis接口,该功能现在已经并入了Cell架构。
  • 短地址生成程序使用Redis作为一级Cache,HBase作为永久存储。
  • Dashboard的二级索引是以Redis为基础开发的。
  • Redis还用作Gearman的持久存储层,使用Finagle开发的memcache代理。
  • 正在缓慢地从memcache转向Redis。希望最终只用一个cache服务。性能上Redis与memcache相当。

Tumblr 的架构演进过程相关推荐

  1. 调度框架学习笔记(3)—— 集群调度框架的架构演进过程

    本章是 The evolution of cluster scheduler architectures 文章的学习笔记.这篇文章讨论了这些年调度架构是如何发展的以及为什么会这样发展. 首先介绍一下这 ...

  2. 架构系列一:大型项目架构演进过程

    架构系列一:大型项目架构演进过程 作为一名程序员,单单只会Coding是远远不够的,想要走的更高更完,还必需懂Coding之外的其他东西,如架构设计,系统分析等,今天就架构这块,谈谈自己的理解 一.单 ...

  3. 大型网站系统与Java中间件实践 第二章大型网站及其架构演进过程

    2.1什么是大型网站 通过第 1 章我们了解了分布式系统的相关基础知识, 大型网站是一种很常见的分布式系统,而本书重点要介绍的中间件系统也是在大型网站的架构变化中出现并发展的,那么我们很有必要从大型网 ...

  4. 16 张图详解,淘宝十年架构演进过程

    文本文以淘宝为例讲解了大型网站的架构演进过程,特此分享给大家,相信看完会有所收获.整个架构的演进过程: 单机架构 第一次演进:Tomcat与数据库分开部署 第二次演进:引入本地缓存和分布式缓存 第三次 ...

  5. 浓缩精华的架构演进过程,我连看了六遍!

    " 业务驱动技术的发展是亘古不变的道理.最开始的时候,业务量少,业务复杂度低,采取的技术也相对简单,基本满足用户对功能的需求. 作者:崔皓,来自51cto技术栈 简介:十六年开发和架构经验, ...

  6. 集群调度框架的架构演进过程

    原文:The evolution of cluster scheduler architectures 作者:Malte Schwarzkopf 之前组会上,有幸与大家探讨 Firmament: Fa ...

  7. 电商技术架构演进过程——具体到每一个技术

    我想,不管你是一个开发人员,或者正在走向开发路上的人,都和我一样,都想了解那些电商平台,究竟是如何一步一步从孤舟称为航空母舰的!他们都经历的哪些技术革新.我们正在做的,在哪一个节点上. 以下是我的几个 ...

  8. 啄木鸟巡护系统架构演进过程

    目录 单体应用 集群服务 内外网集群 微服务演进 一个系统的架构是一个不断演进的过程,而不是一步到位过度设计.架构图分享地址:http://huatu.qianglihuifu.com/lct/#R3 ...

  9. 彭荣新:喜马拉雅自研网关架构演进过程

    背景 网关是一个比较成熟的产品,基本上各大互联网公司都会有网关这个中间件,来解决一些公有业务的上浮,而且能快速的更新迭代,如果没有网关,要更新一个公有特性,就要推动所有业务方都更新和发布,那是效率极低 ...

  10. 喜马拉雅自研网关架构演进过程

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 推荐:https://www.xttblog.com/?p=5176 背景 网关 ...

最新文章

  1. spring定时每天早上八点_Spring Boot教程(13) – 简单定时任务
  2. 简单综合部署nagios环境
  3. 单tomcat多实例的实现
  4. ML:MLOps系列讲解之《MLOps原则之监控/“机器学习成绩”系统/可再现性/松散耦合架构(模块化)/基于ML的软件交付指标/MLOps原则和实践的总结》解读
  5. 在WPF程序中使用多线程技术
  6. Flask简介与简单项目操作流程
  7. windows下升级nodenpm
  8. java写 excel
  9. vue移动端项目中统一滚动条样式与效果
  10. Exception in thread “main” java.lang.NoClassDefFoundError: com/google/common/base/Preconditions
  11. html写16进制编辑器,浏览器中的16进制编辑器 Hexed.it
  12. python cpk 计算
  13. word打开html是空白,网页复制到Word之后或者出现空白或者格式变乱该怎么办
  14. 人工智能认知技术,在各行业的应用介绍
  15. android 手机自动登录,Android:程序跳过登录界面直接进入主界面(自动登录)
  16. 人工智能谓词逻辑——猴子摘香蕉问题
  17. nodejs打开默认浏览器
  18. prometheus监控域名证书到期时间
  19. VScode 代码格式化失效
  20. ChatGPT - 横看成岭侧成峰

热门文章

  1. 换页符'\f'的问题
  2. DSP中EALLOW,EDIS,EINT,DINT,ERTM,DRTM的作用
  3. c语言alpha通道的用法,alpha通道最主要的用途是什么
  4. 做直流逆变中用到的全桥逆变电路测试mos管好坏的方法
  5. leetcode(19):Anagrams (字谜游戏)
  6. 技术分享 | Online DDL 工具 gh-ost
  7. 架构搜索文献笔记(5):《APQ:联合搜索网络结构、剪枝和量化策略》
  8. 计算机网络重置,怎么重置电脑网络连接
  9. 远程计算机打印,教你玩转远程终端打印机
  10. centos7安装noIP-动态域名解析最佳实践