# Twitter 如何使用 Redis 进行扩展-105TB RAM,39MM QPS,10,000 多个实例
> 原文: [http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html](http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html)
<iframe align="right" allowfullscreen="" frameborder="0" height="200" src="//www.youtube.com/embed/rP9EKvWt0zo?rel=0" width="220"></iframe>[姚悦](https://twitter.com/thinkingfish)自 2010 年以来一直在 Twitter 的 Cache 团队工作。 当然,这是关于 Redis 的,但不仅是关于 Redis 的。
姚明已经在 Twitter 工作了几年。 她看过一些东西。 她看到 Twitter 上缓存服务的增长从仅由一个项目使用到迅速增加到将近 100 个项目。 那就是成千上万台机器,许多集群和数 TB 的 RAM。
从她的讲话中可以很明显地看出,她来自一个真正的个人经历的地方,并且以一种探索问题的实用方式闪耀出来。 这个话题值得一看。
如您所料,Twitter 具有大量缓存。
Timeline Service for one datacenter using Hybrid List:
* 约 40TB 分配的堆
* 〜30MM qps
* > 6,000 个实例
Use of BTree in one datacenter:
* 约 65TB 的已分配堆
* 〜9MM qps
* > 4,000 个实例
稍后,您将了解有关 BTree 和 Hybrid List 的更多信息。
有几点值得注意:
* Redis 是一个绝妙的主意,因为它占用服务器上未充分利用的资源并将其转变为有价值的服务。
* Twitter 对 Redis 进行了专门化,提供了两种完全适合其用例的新数据类型。 因此他们获得了所需的性能,但是将它们锁定在基于旧代码的代码中,因此很难合并到新功能中。 我想知道,为什么要使用 Redis 这样的东西? 只需使用您自己的数据结构创建时间轴服务即可。 Redis 真的为聚会增添了什么吗?
* 在网络饱和之前,请使用本地 CPU 功能汇总节点上的大量日志数据。
* 如果您想要高性能的产品,请将快速路径(即数据路径)与慢速路径(即命令和控制路径)分开,
* Twitter 正在以 Mesos 作为作业调度程序进入容器环境。 这仍然是一种新方法,因此了解它的工作方式很有趣。 一个问题是 Mesos 浪费问题,该问题源于在复杂的运行时世界中指定硬资源使用限制的要求。
* 中央集群管理器对于使集群保持易于理解的状态非常重要。
* JVM 慢,C 快。 他们的缓存代理层正在回到 C / C ++。
考虑到这一点,让我们进一步了解 Twitter 上 Redis 的用法:
## 为什么要使用 Redis?
* Redis 驱动着 Twitter 最重要的服务时间轴。 时间轴是由 ID 索引的推文索引。 在列表中将推文链接在一起会生成“主页时间轴”。 用户时间轴(由用户已发布的推文组成)只是另一个列表。
* 为什么考虑使用 Redis 而不是 Memcache? 网络带宽问题和长通用前缀问题。
* 网络带宽问题。
* Memcache 在时间表上不如 Redis 正常工作。 问题在于处理扇出。
* Twitter 读取和写入**的次数是递增的**,它们很小,但时间表本身却很大。
* 生成推文时,需要将其写入所有相关的时间轴。 推文是一小块数据,附加到某些数据结构。 阅读时,最好加载一小部分推文。 向下滚动会加载另一个批次。
* 本地时间行可能比较大,这对于观看者一组阅读是合理的。 例如,也许有 3000 个条目。 由于性能原因,应避免访问数据库。
* 在大对象(时间轴)上进行增量写入和小型读取的读取-修改-写入周期太昂贵,并且会造成网络瓶颈。
* 在每秒 100K +的千兆链接读写中,如果平均对象大小大于 1K,则网络将成为瓶颈。
* 长通用前缀问题(确实是两个问题)
* 灵活的架构方法用于数据格式。 对象具有可能存在或可能不存在的某些属性。 可以为每个单独的属性创建一个单独的键。 这要求针对每个单独的属性发出单独的请求,并且并非所有属性都可以在缓存中。
* 随时间推移观察到的度量标准具有相同的名称,每个样本具有不同的时间戳。 如果单独存储每个度量标准,则长公共前缀会被存储很多次。
* 为了在两种情况下都更加节省空间,对于指标和灵活的架构,希望有一个分层的密钥空间。
* **下的专用缓存群集 利用 CPU** 。 对于简单的情况,内存中的键值存储是 CPU 轻的。 对于较小的键值,一个盒子上 1%的 CPU 时间可以每秒处理超过 1K 个请求。 尽管对于不同的数据结构,结果可能有所不同。
* **Redis 是个绝妙的主意** 。 它可以看到服务器可以做什么,但不能做什么。 对于简单的键值存储,服务器端在 Redis 等服务上有很多 CPU 余量。
* Redis 于 2010 年在 Twitter 中首次用于时间轴服务。 广告服务中也使用它。
* 未使用 Redis 的磁盘功能。 部分原因是因为在 Twitter 内部,缓存和存储服务位于不同的团队中,因此他们使用他们认为最佳的任何机制。 部分原因可能是因为存储团队认为其他服务比 Redis 更适合他们的目标。
* Twitter 分叉了 Redis 2.4 并为其添加了一些功能,因此它们停留在 2.4(2.8.14 是最新的稳定版本)上。 更改为:Redis 中的两个数据结构功能; 内部集群管理功能; 内部日志记录和数据洞察力。
* 热键是一个问题,因此它们正在构建具有客户端缓存的分层缓存解决方案,该解决方案将自动缓存热键。
## 混合列表
* 为**增加了可预测的内存性能**,为 Redis 添加了 Hybrid List。
* 时间轴是 Tweet ID 的列表,因此是整数列表。 每个 ID 都很小。
* Redis 支持两种列表类型:ziplist 和 linklist。 Ziplist 节省空间。 链表是灵活的,但是由于双链表每个键都有两个指针的开销,因此给定 ID 的大小开销非常大。
* 为了有效利用内存,仅使用 ziplist。
* Redis ziplist 阈值设置为时间轴的最大大小。 永远不要存储比压缩列表中更大的时间轴。 这意味着产品决策(时间轴中可以包含多少条推文)已链接到低级组件(Redis)。 通常不理想。
* 添加或删除 ziplist 效率低下,尤其是列表很大时。 从 ziplist 删除使用 memmove 来移动数据,以确保该列表仍然是连续的。 添加到 ziplist 需要内存重新分配调用,以为新条目腾出足够的空间。
* 由于时间轴大小,写入操作可能会出现**高延迟。 时间线的大小差异很大。 大多数用户的推文很少,因此他们的用户时间轴很小。 家庭时间表,尤其是那些涉及名人的时间表。 当更新较大的时间线并且高速缓存用完了堆时,这通常是在使用高速缓存时的情况,在有足够的连续 RAM 来处理一个大 ziplist 之前,将淘汰非常大的**小时间线** 。 由于所有这些缓存管理都需要时间,因此写操作可能会具有较高的延迟。**
* 由于写入被散布到许多时间轴,因此由于内存用于扩展时间轴,因此更有可能陷入**写等待时间陷阱**。
* 鉴于写入延迟的高度可变性,**很难为写入操作创建 SLA** 。
* 混合列表是 ziplist 的链接列表。 阈值设置为每个 ziplist 可以以字节为单位的大小。 以字节为单位,因为对于**内存有效**而言,它有助于**分配和取消分配相同大小的块**。 当列表经过时,它将溢出到下一个 ziplist 中。 ziplist 直到列表为空时才被回收,这意味着可以通过删除使每个 ziplist 只有一个条目。 实际上,推文并不是经常被删除。
* 在“混合列表”之前,一种变通方法是使较大的时间轴更快地过期,这为其他时间轴释放了内存,但是当用户查看其时间轴时,这是昂贵的。
## BTree
* 在 Redis 中添加了 BTree 以支持对层次结构键的范围查询,以返回结果列表。
* 在 Redis 中,处理辅助键或字段的方法是哈希映射。 为了对数据进行排序以便执行范围查询,使用了一个排序集。 排序后的订单按双倍得分排序,因此不能使用任意的辅助键或任意的名称进行排序。 由于哈希图使用线性搜索,因此如果有很多辅助键或字段,那就不好了。
* BTree 是尝试解决哈希映射和排序集的缺点。 最好让**一个可以完成您想要的内容的数据结构**。 更容易理解和推理。
* 借用了 BTree 的 BSD 实现,并将其添加到 Redis 中以创建 BTree。 支持键查找以及范围查询。 具有良好的查找性能。 代码相对简单。 缺点是 **BTree 的内存效率不高**。 由于指针,它具有大量的元数据开销。
## 集群管理
* 集群出于单一目的使用多个 Redis 实例。 如果数据集大于单个 Redis 实例可以处理的数据量或吞吐量高于单个实例可以处理的数据量,则需要对键空间进行分区,以便可以将数据存储在一组实例中的多个分片中 。 路由选择一个密钥,并弄清楚该密钥的数据在哪个分片上。
* 认为集群管理是 Redis 采用率未激增的**首要原因。 当群集可用时,没有理由不**将所有用例迁移到 Redis** 。**
* Tricky 正确安装 Redis 群集。 人们之所以使用 Redis 是因为作为数据结构服务器的想法是执行频繁的更新。 但是很多 Redis 操作都不是幂等的。 如果出现网络故障,则需要重试,并且数据可能会损坏。
* Redis 集群**倾向于使用** **集中管理器** **来规定全局视图**。 对于内存缓存,很多集群都使用基于一致性哈希的客户端方法。 如果数据不一致,那就这样。 为了提供真正好的服务,集群需要一些功能,例如检测哪个分片已关闭,然后重播操作以恢复同步。 经过足够长的时间后,应清除缓存状态。 Redis 中的损坏数据很难检测。 当有一个列表并且缺少一个大块时,很难说出来。
* Twitter 多次尝试构建 Redis 集群。 [Twemproxy](https://github.com/twitter/twemproxy) 并未在 Twitter 内部使用,它是为 [Twemcache](https://github.com/twitter/twemcache) 构建的 和 Redis 支持增加了。 另外两个解决方案基于代理样式路由。 其中一项与时间轴服务相关,并不意味着具有普遍性。 第二个是对 Timeline 解决方案的概括,该解决方案提供了群集管理,复制和碎片修复。
* **群集中的三个选项**:服务器相互通信以达成群集外观的共识; 使用代理; 或进行客户端集群的客户端集群管理。
* 并非采用服务器方法,因为其理念是**使服务器保持简单** **,笨拙且快速**。
* 不接受客户端,因为 **更改很难传播** 。 Twitter 中约有 100 个项目使用缓存集群。 要更改客户端中的任何内容,必须将其推送到 100 个客户端,更改可能要花费数年的时间才能传播。 快速迭代意味着几乎不可能将代码放入客户端。
* 之所以使用代理样式路由方法和分区,有两个原因。 缓存服务是一种高性能服务。 如果您想要**高性能的产品,请将快速路径(即数据路径)与慢速路径** **(即命令和控制路径**)分开。 如果将群集管理合并到服务器中,则会使作为有状态服务的 Redis 代码变得复杂,每当您想要**修复错误或为群集管理代码提供**升级时,有状态 Redis 服务必须 也需要重新启动,这可能会丢弃大量数据。 群集的滚动重启很痛苦。
* 使用代理方法存在一个问题,即在客户端和服务器之间插入了另一个网络跃点。 **分析显示额外的跃点是一个神话**。 至少在他们的生态系统中。 通过 Redis 服务器的等待时间不到 0.5 毫秒。 在 Twitter 上,大多数后端服务都是基于 Java 的,并使用 Finagle 进行对话。 通过 Finagle 路径时,延迟接近 10 毫秒。 因此,额外的跃点并不是问题。 **JVM 内部是问题**。 在 JVM 之外,您几乎可以做任何您想做的事情,除非您当然要通过另一个 JVM。
* 代理失败并不重要。 在数据路径上引入代理层还不错。 客户不在乎与之交谈的代理。 如果超时后代理失败,则客户端将转到另一个代理。 在代理级别没有分片操作,它们都是无状态的。 要扩展吞吐量,只需添加更多代理。 权衡是额外的成本。 代理层被分配用于执行转发的资源。 群集管理,分片和查看群集的操作均在代理服务器外部进行。 代理不必彼此同意。
* Twitter 的实例具有 **100K 开放连接** ,并且工作正常。 只是有开销要支付。 没有理由关闭连接。 只要保持打开状态,就可以改善延迟。
* 缓存集群用作 [后备缓存](http://www.quora.com/Is-Memcached-look-aside-cache) 。 缓存本身不负责数据补充。 客户端负责从存储中获取丢失的密钥,然后将其缓存。 如果某个节点发生故障,则分片将移至另一个节点。 出现故障的计算机恢复运行时将被刷新,因此不会留下任何数据。 所有这些都是由**集群负责人**完成的。 集中观点对于使集群保持易于理解的状态非常重要。
* 用 C ++编写的代理进行了实验。 **C ++代理看到** **性能显着提高**(未给出编号)。 代理层将移回 C 和 C ++。
## Data Insight
* 当有电话说缓存系统在大多数情况下都无法正常运行**时,缓存就很好**。 通常,客户端配置错误。 或者他们通过请求太多密钥来滥用缓存系统。 或一遍又一遍地请求相同的密钥,并使服务器或链接饱和。
* 当您告诉某人他们正在滥用您的系统**时,他们需要证明**。 哪个键? 哪个分片不好? 什么样的流量导致这种行为? 证明需要可以显示给客户的指标和分析。
* SOA 架构不会给您问题隔离或自动调试的便利。 您必须对组成系统的每个组件具有良好的可见性**。**
* 决定将 Insight 内置到缓存中。 缓存是用 C 语言编写的,并且速度很快,因此可以提供其他组件无法提供的数据。 其他组件无法处理为每个请求提供数据的负担。
* **可以记录每个命令**。 缓存可以 100K qps 记录所有内容。 仅记录元数据,不记录值(关于 NSA 的笑话)。
* **避免锁定和阻止**。 特别是不要阻止磁盘写入。
* 以 100 qps 和每条日志消息 100 字节的速度,每个盒子每秒将记录 10MB 数据。 开箱即用的大量数据。 万一出现问题,将使用 10%的网络带宽。 **在经济上不可行**。
* **预计算日志可降低成本** 。 假设它已经知道将要计算什么。 进程读取日志并生成摘要,并定期发送该框视图。 与原始数据相比,该视图很小。
* View 数据由 Storm 汇总,存储并在顶部放置一个可视化系统。 您可以获取数据,例如,这是您的前 20 个键; 这是您的点击量的第二个,并且有一个高峰,这表示点击量模式很尖锐; 这是唯一键的数量,这有助于容量规划。 当捕获每个日志时,可以做很多事情。
* 洞察力对于运营非常有价值。 如果存在丢包现象,通常可以将其与热键或尖刻的流量行为相关联。
## Redis 的愿望清单
* 显式内存管理 。
* **可部署(Lua)脚本** 。 刚开始谈论。
* **多线程** 。 将使群集管理更加容易。 Twitter 有很多“高个子”,其中主机具有 100+ GB 的内存和许多 CPU。 要使用服务器的全部功能,需要在物理机上启动许多 Redis 实例。 使用多线程,将需要启动更少的实例,这更易于管理。
## 获得的经验教训
* **量表要求可预测性** 。 集群越大,客户越多,您希望服务成为更具可预测性和确定性的对象。 当有一个客户并且有问题时,您可以深入研究问题,并且很有趣。 当您有 70 个客户时,您将无法跟上。
* **尾部延迟很重要** 。 当您扇出很多分片时,如果分片缓慢,则整个查询将变慢。
* 确定性配置在操作上很重要 。 Twitter 正朝着容器环境迈进。 Mesos 用作作业计划程序。 调度程序满足对 CPU,内存等数量的请求。监视器将杀死超出其资源需求的任何作业。 Redis 在容器环境中引起问题。 Redis 引入了外部碎片,这意味着您将使用更多内存来存储相同数量的数据。 如果您不想被杀死,则必须通过供过于求来弥补。 您必须考虑我的内存碎片率不会超过 5%,但我会多分配 10%作为缓冲空间。 甚至 20%。 或者,我想每台主机将获得 5000 个连接,但以防万一我为 10,000 个连接分配内存。 结果是巨大的浪费潜力。 如今,超低延迟服务在 Mesos 中不能很好地发挥作用,因此这些工作与其他工作是隔离的。
* **在运行时了解您的资源使用情况确实很有帮助** 。 在大型集群中,会发生坏事。 您认为自己很安全,但是事情会发生,行为是无法预料的。 如今,大多数服务无法正常降级。 例如,当 RAM 达到 10GB 的限制时,请求将被拒绝,直到有可用的 RAM。 这只会使与所需资源成比例的一小部分流量失败。 很好 垃圾收集问题不是很正常,流量只是掉在地上,这个问题每天都会影响许多公司中的许多团队。
* **将计算推入数据** 。 如果查看相对的网络速度,CPU 速度和磁盘速度,那么在进入磁盘之前进行计算并在进入网络之前进行计算是有意义的。 一个示例是在将节点上的日志推送到集中式监视服务之前对其进行汇总。 Redis 中的 LUA 是将计算应用于数据附近的另一种方法。
* **LUA 今天尚未在 Redis 中投入生产** 。 按需脚本编写意味着服务提供商无法保证其 SLA。 加载的脚本可以执行任何操作。 哪个服务提供商会愿意冒别人代码的风险承担违反 SLA 的风险? 部署模型会更好。 它将允许代码审查和基准测试,因此可以正确计算资源使用情况和性能。
* **Redis 是下一代高性能流处理平台** 。 它具有 pub-sub 和脚本。 为什么不?
## 相关文章
* [Google:驯服长时间延迟的尾巴-当更多的机器等于更差的结果时](http://highscalability.com/blog/2012/3/12/google-taming-the-long-latency-tail-when-more-machines-equal.html) [架构](http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html)
* [Twitter 用于处理 1.5 亿活跃用户,300K QPS,22 MB / S 的 Firehose,并在 5 秒内发送推文](http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html)
* [带有碎片的问题-我们可以从 Foursquare 事件中学习到什么?](http://highscalability.com/blog/2010/10/15/troubles-with-sharding-what-can-we-learn-from-the-foursquare.html)
* [始终记录所有内容](http://highscalability.com/blog/2007/8/30/log-everything-all-the-time.html)
* [低级可伸缩性解决方案-聚合集合](http://highscalability.com/blog/2013/3/6/low-level-scalability-solutions-the-aggregation-collection.html)
万一 Twitter 上有人读过我:为什么不禁用 EVAL(不是 EVALSHA),重命名 SCRIPT 并使用它来预加载脚本? 然后,您可以发布您的客户端可以使用的 SHA 目录。
“ Redis 是下一代高性能流处理平台。它具有 pub-sub 和脚本功能。为什么不呢?”
更重要的是,2.8.9 在 PFADD / PFCOUNT / PFMERGE 命令中添加了 HyperLogLog(当然,Twitter 被困在 2.4 中)。 这样就可以在恒定内存中非常精确地近似估计流中唯一键的数量,而不必存储整个数据集。 例如,每天/每周/每月的唯一身份访问者数量。 这使大量分析成为可能,而不必使用像 Hadoop 这样的大数据大炮。
@Pierre Chapuis:我认为您的建议会奏效。 我认为这不是最干净的方法,但是:SCRIPT *是一个在线命令,如果我要离线加载(或者至少不通过数据路径完成加载),我会强烈建议这样做。 可能添加了一个配置选项,例如 SCRIPT_LOAD_PATH,以按照您的建议从目录中读取它们。
现在,如果我们允许即时重新加载配置(我在当前项目中已经计划过的事情),您甚至可以更新脚本而不会丢失所有数据或阻止流量。
MM 被用作百万的缩写吗? 在技术环境中看到它似乎有些奇怪……这不是更多的财务缩写吗? Just M 对我来说更容易。
我喜欢这样的观察:面向服务的体系结构的优点(概括地说)仅与您在服务边界处所做的工作一样好。 她说这是出于监视的目的(SOA 并没有因为服务 A 而神奇地将服务 B 隔离出问题)。 但这似乎同样适用于记录清晰的 API 合同,保持代码库清晰等。我在阐明将应用程序分解为服务方面对我有吸引力的方面时遇到了一些麻烦,而我认为那是缺少的部分-仅仅是 SOA 的概念不能提供大多数价值; 在边界上应用的整套实践可以提供帮助。
还发人深省(且合理):像 Redis 这样的代码库往往不会由委员会维护,您需要进行认真的审查才能阻止糟糕的代码。 (最近阅读了很多 golang 的代码审查/变更列表流,因为它是公开的,有时它是保持语言状态最简单的方法,并且通常给它留下深刻的印象。)
关于脚本,我想知道如何在包装盒上找到包含数据的脚本,作为具有自己的容器和资源限制的普通 Redis 客户端。 您可以避免带宽限制; 您可以控制资源的使用(也许在分配内核的级别?); 您不仅可以使用 Lua,还可以使用 Scala 或其他任何方法(尽管如此,但是,GC)。 Redis 的进程内 Lua 脚本可能没有通信成本,而它们会占用宝贵的 RAM 来存储数据,但这是一件容易的事。
对于 Twitter 开放源代码混合列表/树,这听起来像是最好的“自私”论据,它最终意味着更快地加入 2.8。 :)
@姚谢谢您的回答。 我同意选择离线加载(“东京霸王”)会更好。 另外,为 SHA 赋予别名是经常需要的功能,这将大有帮助,并使得可以以向后兼容的方式更新脚本的实现。
阅读这篇文章会让我觉得自己生活在一个平行的宇宙中,并且做着非常相似的事情。
嗨,
不错的演示。 我曾经遇到的一个问题是-您是否将 ssl 与 redis 一起使用?
- LiveJournal 体系结构
- mixi.jp 体系结构
- 友谊建筑
- FeedBurner 体系结构
- GoogleTalk 架构
- ThemBid 架构
- 使用 Amazon 服务以 100 美元的价格构建无限可扩展的基础架构
- TypePad 建筑
- 维基媒体架构
- Joost 网络架构
- 亚马逊建筑
- Fotolog 扩展成功的秘诀
- 普恩斯的教训-早期
- 论文:Wikipedia 的站点内部,配置,代码示例和管理问题
- 扩大早期创业规模
- Feedblendr 架构-使用 EC2 进行扩展
- Slashdot Architecture-互联网的老人如何学会扩展
- Flickr 架构
- Tailrank 架构-了解如何在整个徽标范围内跟踪模因
- Ruby on Rails 如何在 550k 网页浏览中幸存
- Mailinator 架构
- Rackspace 现在如何使用 MapReduce 和 Hadoop 查询 TB 的数据
- Yandex 架构
- YouTube 架构
- Skype 计划 PostgreSQL 扩展到 10 亿用户
- 易趣建筑
- FaceStat 的祸根与智慧赢得了胜利
- Flickr 的联合会:每天进行数十亿次查询
- EVE 在线架构
- Notify.me 体系结构-同步性
- Google 架构
- 第二人生架构-网格
- MySpace 体系结构
- 扩展 Digg 和其他 Web 应用程序
- Digg 建筑
- 在 Amazon EC2 中部署大规模基础架构的六个经验教训
- Wolfram | Alpha 建筑
- 为什么 Facebook,Digg 和 Twitter 很难扩展?
- 全球范围扩展的 10 个 eBay 秘密
- BuddyPoke 如何使用 Google App Engine 在 Facebook 上扩展
- 《 FarmVille》如何扩展以每月收获 7500 万玩家
- Twitter 计划分析 1000 亿条推文
- MySpace 如何与 100 万个并发用户一起测试其实时站点
- FarmVille 如何扩展-后续
- Justin.tv 的实时视频广播架构
- 策略:缓存 404 在服务器时间上节省了洋葱 66%
- Poppen.de 建筑
- MocoSpace Architecture-一个月有 30 亿个移动页面浏览量
- Sify.com 体系结构-每秒 3900 个请求的门户
- 每月将 Reddit 打造为 2.7 亿页面浏览量时汲取的 7 个教训
- Playfish 的社交游戏架构-每月有 5000 万用户并且不断增长
- 扩展 BBC iPlayer 的 6 种策略
- Facebook 的新实时消息系统:HBase 每月可存储 135 亿条消息
- Pinboard.in Architecture-付费玩以保持系统小巧
- BankSimple 迷你架构-使用下一代工具链
- Riak 的 Bitcask-用于快速键/值数据的日志结构哈希表
- Mollom 体系结构-每秒以 100 个请求杀死超过 3.73 亿个垃圾邮件
- Wordnik-MongoDB 和 Scala 上每天有 1000 万个 API 请求
- Node.js 成为堆栈的一部分了吗? SimpleGeo 说是的。
- 堆栈溢出体系结构更新-现在每月有 9500 万页面浏览量
- Medialets 体系结构-击败艰巨的移动设备数据
- Facebook 的新实时分析系统:HBase 每天处理 200 亿个事件
- Microsoft Stack 是否杀死了 MySpace?
- Viddler Architecture-每天嵌入 700 万个和 1500 Req / Sec 高峰
- Facebook:用于扩展数十亿条消息的示例规范架构
- Evernote Architecture-每天有 900 万用户和 1.5 亿个请求
- TripAdvisor 的短
- TripAdvisor 架构-4,000 万访客,200M 动态页面浏览,30TB 数据
- ATMCash 利用虚拟化实现安全性-不变性和还原
- Google+是使用您也可以使用的工具构建的:闭包,Java Servlet,JavaScript,BigTable,Colossus,快速周转
- 新的文物建筑-每天收集 20 亿多个指标
- Peecho Architecture-鞋带上的可扩展性
- 标记式架构-扩展到 1 亿用户,1000 台服务器和 50 亿个页面视图
- 论文:Akamai 网络-70 个国家/地区的 61,000 台服务器,1,000 个网络
- 策略:在 S3 或 GitHub 上运行可扩展,可用且廉价的静态站点
- Pud 是反堆栈-Windows,CFML,Dropbox,Xeround,JungleDisk,ELB
- 用于扩展 Turntable.fm 和 Labmeeting 的数百万用户的 17 种技术
- StackExchange 体系结构更新-平稳运行,Amazon 4x 更昂贵
- DataSift 体系结构:每秒进行 120,000 条推文的实时数据挖掘
- Instagram 架构:1400 万用户,1 TB 的照片,数百个实例,数十种技术
- PlentyOfFish 更新-每月 60 亿次浏览量和 320 亿张图片
- Etsy Saga:从筒仓到开心到一个月的浏览量达到数十亿
- 数据范围项目-6PB 存储,500GBytes / sec 顺序 IO,20M IOPS,130TFlops
- 99designs 的设计-数以千万计的综合浏览量
- Tumblr Architecture-150 亿页面浏览量一个月,比 Twitter 更难扩展
- Berkeley DB 体系结构-NoSQL 很酷之前的 NoSQL
- Pixable Architecture-每天对 2000 万张照片进行爬网,分析和排名
- LinkedIn:使用 Databus 创建低延迟更改数据捕获系统
- 在 30 分钟内进行 7 年的 YouTube 可扩展性课程
- YouPorn-每天定位 2 亿次观看
- Instagram 架构更新:Instagram 有何新功能?
- 搜索技术剖析:blekko 的 NoSQL 数据库
- Pinterest 体系结构更新-1800 万访问者,增长 10 倍,拥有 12 名员工,410 TB 数据
- 搜索技术剖析:使用组合器爬行
- iDoneThis-从头开始扩展基于电子邮件的应用程序
- StubHub 体系结构:全球最大的票务市场背后的惊人复杂性
- FictionPress:在网络上发布 600 万本小说
- Cinchcast 体系结构-每天产生 1,500 小时的音频
- 棱柱架构-使用社交网络上的机器学习来弄清您应该在网络上阅读的内容
- 棱镜更新:基于文档和用户的机器学习
- Zoosk-实时通信背后的工程
- WordPress.com 使用 NGINX 服务 70,000 req / sec 和超过 15 Gbit / sec 的流量
- 史诗般的 TripAdvisor 更新:为什么不在云上运行? 盛大的实验
- UltraDNS 如何处理数十万个区域和数千万条记录
- 更简单,更便宜,更快:Playtomic 从.NET 迁移到 Node 和 Heroku
- Spanner-关于程序员使用 NoSQL 规模的 SQL 语义构建应用程序
- BigData 使用 Erlang,C 和 Lisp 对抗移动数据海啸
- 分析数十亿笔信用卡交易并在云中提供低延迟的见解
- MongoDB 和 GridFS 用于内部和内部数据中心数据复制
- 每天处理 1 亿个像素-少量竞争会导致大规模问题
- DuckDuckGo 体系结构-每天进行 100 万次深度搜索并不断增长
- SongPop 在 GAE 上可扩展至 100 万活跃用户,表明 PaaS 未通过
- Iron.io 从 Ruby 迁移到 Go:减少了 28 台服务器并避免了巨大的 Clusterf ** ks
- 可汗学院支票簿每月在 GAE 上扩展至 600 万用户
- 在破坏之前先检查自己-鳄梨的建筑演进的 5 个早期阶段
- 缩放 Pinterest-两年内每月从 0 到十亿的页面浏览量
- Facebook 的网络秘密
- 神话:埃里克·布鲁尔(Eric Brewer)谈银行为什么不是碱-可用性就是收入
- 一千万个并发连接的秘密-内核是问题,而不是解决方案
- GOV.UK-不是你父亲的书库
- 缩放邮箱-在 6 周内从 0 到 100 万用户,每天 1 亿条消息
- 在 Yelp 上利用云计算-每月访问量为 1.02 亿,评论量为 3900 万
- 每台服务器将 PHP 扩展到 30,000 个并发用户的 5 条 Rockin'Tips
- Twitter 的架构用于在 5 秒内处理 1.5 亿活跃用户,300K QPS,22 MB / S Firehose 以及发送推文
- Salesforce Architecture-他们每天如何处理 13 亿笔交易
- 扩大流量的设计决策
- ESPN 的架构规模-每秒以 100,000 Duh Nuh Nuhs 运行
- 如何制作无限可扩展的关系数据库管理系统(RDBMS)
- Bazaarvoice 的架构每月发展到 500M 唯一用户
- HipChat 如何使用 ElasticSearch 和 Redis 存储和索引数十亿条消息
- NYTimes 架构:无头,无主控,无单点故障
- 接下来的大型声音如何使用 Hadoop 数据版本控制系统跟踪万亿首歌曲的播放,喜欢和更多内容
- Google 如何备份 Internet 和数十亿字节的其他数据
- 从 HackerEarth 用 Apache 扩展 Python 和 Django 的 13 个简单技巧
- AOL.com 体系结构如何发展到 99.999%的可用性,每天 800 万的访问者和每秒 200,000 个请求
- Facebook 以 190 亿美元的价格收购了 WhatsApp 体系结构
- 使用 AWS,Scala,Akka,Play,MongoDB 和 Elasticsearch 构建社交音乐服务
- 大,小,热还是冷-条带,Tapad,Etsy 和 Square 的健壮数据管道示例
- WhatsApp 如何每秒吸引近 5 亿用户,11,000 内核和 7,000 万条消息
- Disqus 如何以每秒 165K 的消息和小于 0.2 秒的延迟进行实时处理
- 关于 Disqus 的更新:它仍然是实时的,但是 Go 摧毁了 Python
- 关于 Wayback 机器如何在银河系中存储比明星更多的页面的简短说明
- 在 PagerDuty 迁移到 EC2 中的 XtraDB 群集
- 扩展世界杯-Gambify 如何与 2 人组成的团队一起运行大型移动投注应用程序
- 一点点:建立一个可处理每月 60 亿次点击的分布式系统的经验教训
- StackOverflow 更新:一个月有 5.6 亿次网页浏览,25 台服务器,而这一切都与性能有关
- Tumblr:哈希处理每秒 23,000 个博客请求的方式
- 使用 HAProxy,PHP,Redis 和 MySQL 处理 10 亿个请求的简便方法来构建成长型启动架构
- MixRadio 体系结构-兼顾各种服务
- Twitter 如何使用 Redis 进行扩展-105TB RAM,39MM QPS,10,000 多个实例
- 正确处理事情:通过即时重放查看集中式系统与分散式系统
- Instagram 提高了其应用程序的性能。 这是如何做。
- Clay.io 如何使用 AWS,Docker,HAProxy 和 Lots 建立其 10 倍架构
- 英雄联盟如何将聊天扩大到 7000 万玩家-需要很多小兵。
- Wix 的 Nifty Architecture 技巧-大规模构建发布平台
- Aeron:我们真的需要另一个消息传递系统吗?
- 机器:惠普基于忆阻器的新型数据中心规模计算机-一切仍在变化
- AWS 的惊人规模及其对云的未来意味着什么
- Vinted 体系结构:每天部署数百次,以保持繁忙的门户稳定
- 将 Kim Kardashian 扩展到 1 亿个页面
- HappyPancake:建立简单可扩展基金会的回顾
- 阿尔及利亚分布式搜索网络的体系结构
- AppLovin:通过每天处理 300 亿个请求向全球移动消费者进行营销
- Swiftype 如何以及为何从 EC2 迁移到真实硬件
- 我们如何扩展 VividCortex 的后端系统
- Appknox 架构-从 AWS 切换到 Google Cloud
- 阿尔及利亚通往全球 API 的愤怒之路
- 阿尔及利亚通往全球 API 步骤的愤怒之路第 2 部分
- 为社交产品设计后端
- 阿尔及利亚通往全球 API 第 3 部分的愤怒之路
- Google 如何创造只有他们才能创造的惊人的数据中心网络
- Autodesk 如何在 Mesos 上实施可扩展事件
- 构建全球分布式,关键任务应用程序:Trenches 部分的经验教训 1
- 构建全球分布式,关键任务应用程序:Trenches 第 2 部分的经验教训
- 需要物联网吗? 这是美国一家主要公用事业公司从 550 万米以上收集电力数据的方式
- Uber 如何扩展其实时市场平台
- 优步变得非常规:使用司机电话作为备份数据中心
- 在不到五分钟的时间里,Facebook 如何告诉您的朋友您在灾难中很安全
- Zappos 的网站与 Amazon 集成后冻结了两年
- 为在现代时代构建可扩展的有状态服务提供依据
- 细分:使用 Docker,ECS 和 Terraform 重建基础架构
- 十年 IT 失败的五个教训
- Shopify 如何扩展以处理来自 Kanye West 和 Superbowl 的 Flash 销售
- 整个 Netflix 堆栈的 360 度视图
- Wistia 如何每小时处理数百万个请求并处理丰富的视频分析
- Google 和 eBay 关于构建微服务生态系统的深刻教训
- 无服务器启动-服务器崩溃!
- 在 Amazon AWS 上扩展至 1100 万以上用户的入门指南
- 为 David Guetta 建立无限可扩展的在线录制活动
- Tinder:最大的推荐引擎之一如何决定您接下来会看到谁?
- 如何使用微服务建立财产管理系统集成
- Egnyte 体系结构:构建和扩展多 PB 分布式系统的经验教训
- Zapier 如何自动化数十亿个工作流自动化任务的旅程
- Jeff Dean 在 Google 进行大规模深度学习
- 如今 Etsy 的架构是什么样的?
- 我们如何在 Mail.Ru Cloud 中实现视频播放器
- Twitter 如何每秒处理 3,000 张图像
- 每天可处理数百万个请求的图像优化技术
- Facebook 如何向 80 万同时观看者直播
- Google 如何针对行星级基础设施进行行星级工程设计?
- 为 Mail.Ru Group 的电子邮件服务实施反垃圾邮件的猫捉老鼠的故事,以及 Tarantool 与此相关的内容
- The Dollar Shave Club Architecture Unilever 以 10 亿美元的价格被收购
- Uber 如何使用 Mesos 和 Cassandra 跨多个数据中心每秒管理一百万个写入
- 从将 Uber 扩展到 2000 名工程师,1000 个服务和 8000 个 Git 存储库获得的经验教训
- QuickBooks 平台
- 美国大选期间城市飞艇如何扩展到 25 亿个通知
- Probot 的体系结构-我的 Slack 和 Messenger Bot 用于回答问题
- AdStage 从 Heroku 迁移到 AWS
- 为何将 Morningstar 迁移到云端:降低 97%的成本
- ButterCMS 体系结构:关键任务 API 每月可处理数百万个请求
- Netflix:按下 Play 会发生什么?
- ipdata 如何以每月 150 美元的价格为来自 10 个无限扩展的全球端点的 2500 万个 API 调用提供服务
- 每天为 1000 亿个事件赋予意义-Teads 的 Analytics(分析)管道
- Auth0 体系结构:在多个云提供商和地区中运行
- 从裸机到 Kubernetes
- Egnyte Architecture:构建和扩展多 PB 内容平台的经验教训
- 缩放原理
- TripleLift 如何建立 Adtech 数据管道每天处理数十亿个事件
- Tinder:最大的推荐引擎之一如何决定您接下来会看到谁?
- 如何使用微服务建立财产管理系统集成
- Egnyte 体系结构:构建和扩展多 PB 分布式系统的经验教训
- Zapier 如何自动化数十亿个工作流自动化任务的旅程
- Jeff Dean 在 Google 进行大规模深度学习
- 如今 Etsy 的架构是什么样的?
- 我们如何在 Mail.Ru Cloud 中实现视频播放器
- Twitter 如何每秒处理 3,000 张图像
- 每天可处理数百万个请求的图像优化技术
- Facebook 如何向 80 万同时观看者直播
- Google 如何针对行星级基础设施进行行星级工程设计?
- 为 Mail.Ru Group 的电子邮件服务实施反垃圾邮件的猫捉老鼠的故事,以及 Tarantool 与此相关的内容
- The Dollar Shave Club Architecture Unilever 以 10 亿美元的价格被收购
- Uber 如何使用 Mesos 和 Cassandra 跨多个数据中心每秒管理一百万个写入
- 从将 Uber 扩展到 2000 名工程师,1000 个服务和 8000 个 Git 存储库获得的经验教训
- QuickBooks 平台
- 美国大选期间城市飞艇如何扩展到 25 亿条通知
- Probot 的体系结构-我的 Slack 和 Messenger Bot 用于回答问题
- AdStage 从 Heroku 迁移到 AWS
- 为何将 Morningstar 迁移到云端:降低 97%的成本
- ButterCMS 体系结构:关键任务 API 每月可处理数百万个请求
- Netflix:按下 Play 会发生什么?
- ipdata 如何以每月 150 美元的价格为来自 10 个无限扩展的全球端点的 2500 万个 API 调用提供服务
- 每天为 1000 亿个事件赋予意义-Teads 的 Analytics(分析)管道
- Auth0 体系结构:在多个云提供商和地区中运行
- 从裸机到 Kubernetes
- Egnyte Architecture:构建和扩展多 PB 内容平台的经验教训