# 使用 HAProxy,PHP,Redis 和 MySQL 处理 10 亿个请求的简便方法来构建成长型启动架构
> 原文: [http://highscalability.com/blog/2014/8/11/the-easy-way-of-building-a-growing-startup-architecture-usin.html](http://highscalability.com/blog/2014/8/11/the-easy-way-of-building-a-growing-startup-architecture-usin.html)
![](https://img.kancloud.cn/3c/4e/3c4ec21bea439968c1e41b2ee17f4b93_240x133.png)
此案例研究是 [Antoni Orfin](http://labs.octivi.com/author/aorfin/) 的来宾帖子, [Octivi](http://octivi.com/?utm_source=highscalability.com&utm_medium=referral&utm_campaign=guest-post) 的联合创始人兼软件架构师。
在文章中,我将向您展示我们基于 HAProxy,PHP,Redis 和 MySQL 开发非常简单的架构的方式,该架构每周无缝处理大约 10 亿个请求。 还应注意进一步扩展该模式和指出不常见模式的可能方法,这些方法特定于该项目。
## 统计:
* 服务器:
* 3 个应用程序节点
* 2 个 MySQL + 1 个备份
* 2 个 Redis
* 应用程序:
* 应用程序每周处理 1,000,000,000 个请求
* 单个 Symfony2 实例高达 700 req / s(平均工作日-550 req / s)
* 平均响应时间-30 毫秒
* 清漆-超过 12,000 req / s(在压力测试过程中达到)
* 数据存储区:
* Redis-160,000,000 条记录,100 GB 数据(我们的主要数据存储!),
* MySQL-300,000,000 条记录-300 GB(第三缓存层)
## 平台:
## ![logical architecture.png](https://img.kancloud.cn/23/17/23173848b4f55230e049345bdb14d8df.png)
* 监控:
* 伊辛加
* 已收集
* Application:
* 带有 Keepalived 的 HAProxy
* 清漆
* 带有 Symfony2 框架的 PHP(PHP-FPM)
* Data store:
* 具有 HAProxy 负载平衡的 MySQL(主-主)
* Redis(主从)
# 背景
大约一年前,我们的朋友带着一个苛刻的问题来到我们的办公室。 他们经营着一家快速成长的电子商务初创公司,当时他们想扩展到国际市场。
由于它们仍然是一家初创型公司,因此建议的解决方案必须具有成本效益,以免在下一台服务器上用完钱。 旧版系统是使用标准 LAMP 堆栈构建的,他们已经拥有强大的 PHP 开发人员团队。 引入新技术必须很聪明,以免使体系结构过于复杂,并让他们与现有人员进一步维护平台。
系统架构必须以可扩展的方式设计,以实现其扩展到下一个市场的计划。 所以我们来检查他们的基础设施...
![soa-after.png](https://img.kancloud.cn/2d/d1/2dd1316b90e440e77ad9b4ae46306617.png) ![soa-before.png](https://img.kancloud.cn/2e/b1/2eb17a082955dbf831d7fb976d4c44d7.png)
以前的系统是单片设计的。 在后台有一些单独的基于 PHP 的 Web 应用程序(该创业公司有许多所谓的前端网站)。 他们中的大多数使用单个数据库,他们共享一些处理业务逻辑的通用代码。
此类应用程序的进一步维护可能是一场噩梦。 由于必须重复某些代码,因此在一个网站中进行更改将导致业务逻辑不一致-他们始终必须在所有 Web 应用程序中进行相同的更改。
从项目管理的角度来看,这也是一个问题-谁负责跨多个代码库分布的那部分代码?
根据这些观察,我们的第一步是将核心业务关键功能提取到单独的服务中(这是本文的范围)。 这是**面向服务的体系结构**的模式。 考虑“关注点分离”原则,但要考虑整个系统。 该服务保持一种特定的高级业务功能的逻辑。 举一个真实的例子-服务可以是搜索引擎,销售系统等。
前端网站正在通过 **REST API** 与服务进行通信。 响应基于 **JSON** 格式。 我们选择它是为了简单起见,而不是像 SOAP 那样对开发人员来说是苛刻的(没人喜欢解析 XML…;-))
提取的服务无法处理身份验证和会话管理之类的事情。 必须在更高层次上处理这些事情。 前端网站对此负责,因为只有他们才能识别其用户。 这样,我们使服务变得更简单-在进一步扩展问题和编写代码方面。 没什么不好的,因为它需要处理不同类型的思考任务。
## 好处:
-完全独立的开发团队可以轻松开发单独的子系统(Service)。 开发人员不要互相干扰。
-**它不处理用户身份验证**和会话,因此这个常见的扩展问题消失了。
-**业务逻辑保存在一个地方**-跨不同前端网站的功能不再多余。
-**易于使服务公开访问**。
## 缺点:
-**为系统管理员**做的更多工作-服务位于其自己的基础结构中,需要管理员额外注意。
-**保持向后兼容**-在一年的维护之后,API 方法发生了无数变化。 事实是,它们一定不能破坏向后兼容性,因为这会导致对每个前端网站的代码进行更改-以及一次部署所有网站的繁琐工作……一年之后,所有方法仍与 文档的第一版。
# 应用层
![physical architecture.PNG](https://img.kancloud.cn/50/0c/500c8bf75d17028b15d001ba9cf8ea2d.png)
与请求流一起,第一层是应用程序。 HAProxy 负载平衡器,Varnish 和 Symfony2 Web 应用程序位于此处。
来自前端网站的请求首先到达 HAProxy,然后将其分发到应用程序节点。
## 应用程序节点配置
* Xeon [[受电子邮件保护]](/cdn-cgi/l/email-protection) ,64GB RAM,SATA
* 漆
* 阿帕奇 2
* PHP 5.4.X 作为 PHP-FPM 运行,具有 APC 字节码缓存
我们有三个这样的应用服务器。 双活模式下的 **N + 1 冗余-“备份”服务器正在积极处理请求。**
在每个节点上保留**单独的 Varnish 可以降低缓存命中率,但是这样我们在这里没有 SPOF(单点故障)。 我们这样做是为了保持可用性而不是性能(在我们的案例中这不是问题)。**
已选择 Apache2,因为旧版前端网站服务器也使用了 Apache2。 避免混合使用多种技术,使管理员更易于维护系统。
## Symfony2 应用
该应用程序本身建立在 Symfony2 之上。 这是一个 PHP 全栈框架,提供了许多有用的组件,可加快开发过程。 由于通常将 REST 服务基于复杂框架的决定对于某人来说听起来很奇怪,所以让我澄清一下背后的原因:
* **访问 PHP / Symfony 开发人员**-客户的 IT 团队由 PHP 开发人员组成。 引入新技术(例如 Node.js)将导致需要雇用能够进一步维护系统的新开发人员。
* **干净的项目结构**-Symfony2 并不强加完整的项目结构,但具有非常明智的默认结构。 向新开发人员介绍该项目很简单,因为他们对代码很熟悉。
* **现成的组件**-遵循 DRY 概念...没有人想要重新发明轮子,所以我们没有。 我们广泛使用 Symfony2 控制台组件,它是一个不错的框架,可用于制作 CLI 命令,用于分析应用程序的工具(调试工具栏),记录器等。
在选择使用它之前,我们已经对**进行了性能测试**,以确保它能够处理计划的流量。 我们已经开发了概念证明,并对其进行了 JMeter 的测试。 结果令人印象深刻-700 req / s,响应时间高达 50ms。 它使我们确认,可以将这种复杂的框架用于此类项目。
## 应用程序配置文件&监视
我们正在使用 Symfony2 工具来监视应用程序。 有一个很好的事件探查器组件,我们可以用来收集特定方法的执行时间,尤其是与第三方网络服务进行通信的方法。 这样,我们可以发现潜在的弱点和应用程序中最耗时的部分。
详细日志记录也是必须的。 为此,我们使用了 PHP Monolog 库,该库使我们能够创建格式良好的日志行,开发人员和系统管理员完全可以理解。 必须始终记住要添加尽可能多的细节,我们发现越详细越好。 我们使用不同的日志级别:
* **调试**-即将发生的事情-例如 在调用外部 Web 服务之前请求信息; 刚刚发生的事情-API 调用的响应
* **错误**-出了点问题,但请求流没有停止(例如,来自第三方 API 的错误响应)。
* **严重**-糟糕…应用程序刚刚崩溃了:-)
因此,在生产环境中,您可以看到诸如 Error 之类的痕迹,并且在其下-Critical。 在开发/测试环境中,还记录了调试信息。
我们还将**日志分为单独的文件**(在 Monolog 库中,它们称为“通道”)。 有一个主日志文件,其中记录了所有应用程序范围内的错误以及来自特定渠道的简短日志。 我们将通道中的详细日志保存在它们各自的文件中。
## 可扩展性
扩展应用程序平台层并不困难。 HAProxy 的性能**不会长期耗尽**,我们正在考虑的唯一事情就是使它们冗余以避免 SPoF。
因此,当前模式只是添加下一个应用程序节点。
# 资料层
我们正在使用 Redis 和 MySQL 来存储所有数据。 **MySQL** 主要用作**第三层缓存**层,而 **Redis 是我们的主要数据存储区**。
## 雷迪斯
在设计系统时,我们正在考虑选择合适的数据库来满足计划的需求:
* 保留大量数据(约 250,000,000 条记录)时不会失去性能
* 通常基于特定资源 ID 的简单 GET(无需查找或复杂的 SELECT)
* 可以在单个请求中检索大量资源以最小化延迟
经过调查,我们决定使用 Redis。
* 我们执行的所有操作的复杂度为 O(1)或 O(N),其中 N 是要检索的键的数量。 也就是说,键空间的大小不会影响性能。
* 我们主要使用 MGET 命令来一次检索> 100 个键。 与在循环中进行多个 GET 相比,这可以省去网络延迟。
当前,我们有两台 Redis 服务器以主从复制模式运行。 它们每个都具有以下配置:Xeon [[受电子邮件保护]](/cdn-cgi/l/email-protection) ,128GB,SSD。 内存限制设置为 100 GB ...并且始终被完全消耗:-)
![](https://img.kancloud.cn/1a/3d/1a3de43a874db09eedb528179858106a.png)
由于应用程序并没有穷尽单个 Redis 服务器的性能限制,因此从服务器主要用作备份并保持高可用性。 如果主机崩溃,我们可以轻松地切换应用程序以使用从机。 复制在执行某些维护任务或迁移服务器时也很方便-轻松切换服务器。
您可能想知道我们的 Redis 一直处于 maxmemory 极限的情况。 大多数键是持久类型的-大约占键空间的 90%。 但是它们的其余部分是纯缓存,我们为其设置了到期 TTL。 现在,密钥空间分为两部分:一部分已设置 TTL(缓存),第二部分未设置(持久数据)。 由于可以设置“ volatile-lru” maxmemory 策略,因此会不断自动删除使用较少的缓存键(只有它们已过期)。
这样,我们就可以**仅保留一个既充当主存储又充当典型缓存**的 Redis 实例。
使用此模式时,必须始终记住监视“过期”键的数量:
db.redis1:6379 >信息键空间
#键空间
db0:keys = 16XXXXXXX,expires = 11XXXXXX,avg_ttl = 0
当您发现该数字危险地接近零时,请开始分片或增加内存;-)
我们如何监控它? 有一个 Icinga 支票,用于监视“到期”数是否达到临界点。 我们还收集了 Redis 图,以可视化“丢失键”的比率。
![redis-expires.png](https://img.kancloud.cn/bf/03/bf0340e8ff89058a5594f137e423dc56.png)
一年后,我可以说我们完全加入了 Redis。 从项目一开始,就没有让我们感到失望-没有任何中断或其他问题。
## 的 MySQL
除了 Redis,我们还使用传统的 MySQL 数据库。 罕见的是,我们通常将其用作第三个缓存层。 我们将最近未使用过的 MySQL 对象存储在其中,而将它们存储在 Redis 中会占用过多的内存,因此我们将它们保存在硬盘上。 这里没有什么花哨的技术,但是我们希望将堆栈保持尽可能简单,以便于维护。
我们有 2 台使用 Xeon [[受电子邮件保护]](/cdn-cgi/l/email-protection) ,64GB RAM,SSD 的 MySQL 服务器。 它们上有一个本地的异步主-主复制。 另外,我们保留单个从节点仅用于备份。
## MySQL 的高可用性
正如您在物理体系结构图上看到的那样,在每个 MySQL 框上,HAProxy 也处于保持状态。 与 MySQL 的连接通过 HAProxy 进行。
在每台数据库服务器中安装 HAProxy 的模式导致保持堆栈的高可用性,并且无需为负载平衡器添加添加下一个服务器。
HAProxy 以主动-被动模式运行(一次仅使用其中之一)。 对它们的可用性的控制是通过保持机制进行的。 在 keepalived 的控制下有一个浮动 IP(VIP)。 它检查主负载均衡器节点的可用性。 发生故障时,第二个(被动)HAProxy 节点将接管 IP。
## Scalability
数据库始终是应用程序中最难的瓶颈。 目前,不需要任何横向扩展操作-到**为止,我们正在通过将 Redis 和 MySQL 移至更大的框来垂直扩展**。 仍有空间,例如 Redis 在具有 128 GB 内存的服务器上运行-可以将其迁移到 256 GB 的节点上。 当然,这种笨重的盒子在快照或仅运行服务器等操作中也有缺点-启动 Redis 服务器将花费更长的时间。
放大(垂直)后,横向扩展。 令人高兴的是,我们已经准备好**易于分片的数据**结构:
Redis 中有 4 种“大量”记录。 可以根据数据类型在 4 台服务器上分片它们。 我们会避免基于散列进行分区,而倾向于**将数据除以记录类型**。 这样,我们仍然可以运行始终在一种类型的键上执行的 MGET。
在 MySQL 中,表是以这种方式进行结构化的,从而可以轻松地将其中的某些表迁移到不同的服务器上-也基于记录类型(表)。
在无法进一步按数据类型进行分区之后,我们将进行散列处理:-)
# 得到教训
* **不要共享您的数据库**-一次,一个前端网站希望将其会话处理切换为 Redis。 所以他们已经连接到我们的了。 这导致 Redis 缓存空间用尽,并拒绝了我们的应用程序来保存下一个缓存键。 所有缓存已开始仅存储在 MySQL 服务器上,这导致大量的开销。
* **制作详细的日志**-在日志行中没有太多信息,您将无法快速调试问题所在。 在一种情况下,由于缺乏单一信息,我们无法找到导致问题的原因,因此不得不等待其他问题的发生(在添加了丢失数据的日志之后)。
* **使用复杂的框架并不会自动意味着“降低网站速度”** -有些人感到惊讶的是,使用全栈框架可以每秒处理如此多的请求。 一切都与智能使用您拥有的工具有关–您甚至可以在 Node.js 中使其运行缓慢:-)选择一种提供良好开发环境的技术,没有人愿意为不友好的工具而烦恼(降低 devops 的士气!)。
## 谁在应用程序背后
该平台由波兰软件公司 [Octivi](http://octivi.com/?utm_source=highscalability.com&utm_medium=referral&utm_campaign=guest-post) 设计。 我们专注于构建注重高性能和可用性的可扩展架构。 我们还要感谢与 IT 部门在客户端方面的大力合作!
# 相关文章
* [使用 Symfony2](http://labs.octivi.com/handling-1-billion-requests-a-week-with-symfony2/?utm_source=highscalability.com&utm_medium=referral&utm_campaign=guest-post) 一周处理 10 亿个请求-我们整个应用程序的概述
* [将其推向极限-满足高性能需求的 Symfony2](http://symfony.com/blog/push-it-to-the-limits-symfony2-for-high-performance-needs) -描述了具有 Symfony2 功能的软件体系结构的详细信息
标题是;
“使用 HAProxy,PHP,Redis 和 MySQL 构建增长的启动体系结构的简便方法,每周可处理 10 亿个请求”
在文章中描述了 Varnish 的用法。 我认为标题需要更新。
为什么只有一台 Haproxy 服务器? 您正在为应用程序节点使用 N + 1,但是前面只有一个负载均衡器吗? 如果此关键服务器出现故障,将会发生什么?
那么“平均响应时间-30 毫秒”呢?该统计数据是在清漆前面或没有清漆的情况下计算的?
马丁
谁能回答这些初学者的问题?
1)由于 Redis 都在内存中,所以我假设持久保存数据以防两个 Redis 节点都掉下来是 MySQL 的工作吗?
2)如果要使该系统更大,更可扩展,是否会引入消息队列?
3)您是否具有到两个 Mysql 实例以及将来的分片 Redis 节点的单独数据库连接池?
1\. Redis 可以将数据持久保存到磁盘。 它只是不能增长到大于 memory_size
2。如果它需要在请求之外做一些事情而不是
3.不知道。
在“ MySQL 的高可用性”中,我不明白您为什么使用 HAProxy,仅 Keepalived 可以解决问题(主动-被动和热备用)。 有什么原因吗?
Kakwa:HAProxy 允许以下几项:
1\. MySQL 处于主动-主动模式,不仅是主动-被动模式(也可以使用 keepalived 和多个浮动 IP)
2\. HAProxy 之后的 MySQL 服务器权重(服务器不支持) (必须具有相同的硬件)
3.使用“ mysql-check”就可以更轻松地切换到维护模式
@Al:
1-Redis 提供可配置的将数据推送到磁盘。 因此,如果 Redis 发生故障,那么它将与 MISS 缓存和 MySQL 的工作相同,是的。
2-我认为是正确的,甚至他们实际上正在使用消息/作业队列,但在本文中未提及
3-不知道:)
伟大的 AI 问题!
1)不,Redis 可提供存储数据的完全持久性。 您可以在两种模式下进行设置:
RDB-在配置的时间范围内将整个键空间转储到一个文件中
AOF-将每个“查询”保存到文件中
我们正在使用 RDB,但是您可以使用两种模式 与此同时。
2)当然! 在 Canhnm 之后,的确,我们在 Redis 之上建立了一些队列,因为它为此类事情提供了专用的数据结构。 我们将消息传递用于最耗时的任务。
3)不
嗨,这真的很有趣,谢谢! 但这只是架构的一部分:提供 JSON 响应的后端服务。 应用程序如何处理该数据并将其提供给最终用户? 是否有 JS 框架或另一个 PHP 应用程序层? 谢谢!
几乎找不到您所有的图像 404 :(
您正在使用哪个 PHP 的 Redis 扩展在 PHP 网站中实现 [redis 缓存? 我知道两个扩展:Predis 和 PHPRedis。 以我的经验,在启用了 varnish 和 memcached 的同一台服务器上,事实证明 Predis 真的很容易配置,并且比 PHPRedis 提供更好的性能。](https://www.cloudways.com/blog/redis-cache-with-custom-php/)
- 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 内容平台的经验教训