我们是一个由 3 名学生组成的小组,我们创建了一个 Facebook 应用程序,目前有超过 753,320 名活跃用户,应用程序托管在 LAMP 1&1 服务器上:
- AMD Opteron 1352 4 x 2,1 GHz
- 4 GB RAM.
- 2 x 750 Go (RAID 1 Hardware).
- Connection : 100 Mbps.
这个应用程序运行得很好,没有任何问题。
我们正在准备一款新的应用程序,预计几个月后将有数百万活跃用户。
应用信息 :
- 使用 PHP / MySQL 创建。
- 每个用户每次使用至少可以运行 25 个查询。
- 提供许多静态文件(图像、flash 文件、css、js)。
- 该应用程序包含 8 个部分,例如游戏、礼物等......
我们想知道该应用服务器的正确架构。
- 我们需要多少台服务器来托管它?
如果我们在此服务器上托管 php 文件:
- 英特尔® 酷睿™ i7-920 处理器 4x2.66 GHz
- 12GB 内存
MySQL远程服务器,以及每个服务器上具有相同配置的静态文件。
该应用程序每天可以处理数百万个请求吗?
- 您对此类应用程序有什么建议?有人能告诉我建议架构的详细信息吗?
提前致谢。
答案1
关于 MySQL,
- mysqltuner对于任何产品盒来说都是必备的。
- 慢速查询日志将帮助您获得性能更佳的应用程序。
- 打开常规日志(简要地)可能是一件好事,然后对所有查询运行 EXPLAIN 以确保您有正确的索引(无覆盖、良好的基数等)
- 您是否在数据库中保留会话?如果可以避免,请不要这样做,但如果无法避免,请考虑使用 MEMORY 表。
- 在讨论表类型时,请考虑每个表的实际用途。具有高读/写需求的事务表可能更适合 InnoDB 存储引擎。主要用于写入的表或者读取可能最好以 MyISAM 形式提供。您也登录到数据库吗?请考虑为这些表使用 ARCHIVE 引擎。
答案2
您得到的任何答案都将是胡乱猜测。您确实需要对您的应用程序进行适当的负载测试,使用真实的数据和使用模式贯穿整个硬件和软件堆栈。使用负载测试中的数字来制定可扩展性计划和成本估算。没有什么可以完美地线性扩展,特别是在数据库层,因此即使您有确切的数字,也需要进行一些猜测,并且您可能会在特定组件(例如数据库)中遇到“障碍”。从JMeter,它可以捕获 HTTP 会话以生成负载。商业工具功能更强大,但也非常昂贵。
答案3
如果不确切了解你正在做什么,就不可能给出铁律般的建议。不过,我会说:
现在花点时间规划扩展。考虑虚拟化,它的好处是多方面的。
只需花费很少的钱,您就可以从 Slicehost、Linode、Rackspace Cloud 等公司租用一堆小型 VPS。六个月后,当您取得巨大成功时,您可以租用/购买自己的硬件,并运行自己的虚拟化,或者继续使用您的供应商,或者转移到“真实”服务器,或者其他方式。但如果您认为您将需要多台服务器,请针对集群设置编写应用程序。以专用机箱的成本,您可以运行 10 台“玩具”服务器。
通过利用廉价的虚拟化提供商,您可以确保您的架构可以向外扩展。
如果您考虑了自己的需求,并决定有一天您可能需要运行分段的 mysql 数据库,那么您现在就可以使用廉价的 VPS 对其进行建模。
如果您认为您需要在一堆 PHP 机器前面安装一定数量的负载均衡器,那么您现在就可以这么做。
设置一些服务器/平衡器来提供静态内容也是如此(或者您可以采用 s3/cloudfront 路线)。
但如果您确实预计会有高负载和大量流量,那么最好现在就将其分开,而不是购买最大的专用机箱并祈祷以后能够扩展。
答案4
我想说,考虑到用户群的规模,这里架构中最重要的部分是缓存和按需轻松扩展的能力。看看 Facebook,想一想,2009 年,他们的每日数据增长量为 12TB!是的,每天。