我是 Web 开发领域的新手,目前正在面试公司,人们最喜欢问的问题是:
如果你的网络服务器规模达到百万级,你该如何扩展它?要求?
如果当时只有一个数据库实例在运行,您会怎么做?您如何管理它?
这些问题真的很有趣,我想了解一下。请针对此类情况提出你的建议/做法(你遵循的)
谢谢
編輯- 这是一个一般查询,可能会有多个瓶颈。我有兴趣了解它们。谢谢
答案1
哦天哪,我想知道这个问题是否可以更通用。但这是一个非常有趣的话题,我将分享我的想法:
静态内容的瓶颈
提供静态内容相对容易。您看到的第一个瓶颈很可能是网络带宽。如果您有大量内容需要提供,磁盘 I/O 可能是另一个瓶颈。
配置错误也会导致静态内容出现瓶颈。如果您有一个 Apache 实例提供动态内容、静态内容(小对象,如导航图形)和大型静态内容(视频流等),则会看到静态内容存在严重问题。这样,如果有很多客户端下载视频流,它们将在下载期间占用 Apache 进程。通常,这会消耗更多的资源(尤其是内存),而不是使用带有 mod_php 或动态内容所需的任何模块的单独 Apache,以及使用单独的、配置更简单的 Apache(或者最好是 lighttpd 或 nginx)来处理静态内容。
动态内容的瓶颈
动态内容则完全不同,查找导致速度缓慢的根源可能非常繁琐。不过,存在一些典型的瓶颈:
代码臃肿。我看到一个 PHP 框架加载了几十个非常繁重的类,并在每次页面加载期间初始化所有类型的缓存等等。臃肿导致缓慢。缓慢导致痛苦。一个简单的“hello world”页面用这个框架就让一台 8 核服务器不堪重负——Apache 基准测试、Siege 和 JMeter 每秒只能处理不到 10 个请求。大约每核每秒一个请求,比我预期的要少一点……
SQL 查询过多。如果查询数量足够多,即使是简单的查询也会堆积起来。如果您的首页在每次页面加载时生成 100 个 SQL 查询,那么有一天这会给您带来麻烦。
臃肿的 SQL 查询。如果您的查询通常包含 17 个 JOIN、UNION 和所有这些,那么您可以肯定某些地方可以进行优化。
缺少缓存。如果您的内容变化不频繁(例如,您的网站是新闻网站),则缓存内容而不是在每次加载页面时从数据库中提取所有内容是有意义的。另请参阅memcached。
数据库臃肿。有时将项目从活动数据库表存档到某个存档表并仅在搜索或其他需要访问所有数据的操作期间使用该存档表可能是有意义的。活动内容的较小表意味着数据库可以将其中的所有内容缓存到 RAM 中。
缺少数据库索引. 全表扫描不是什么好事。
服务器太慢。有时您的服务器(服务器场)可能太慢,无法执行当前任务。确定是否因为 RAM 不足、CPU 性能不足或其他原因,然后进行相应升级。
我希望这至少能回答你的部分问题。:)
答案2
这应该是一个 wiki,而且问题不清楚(查询建议使用数据库,但网络服务器建议您指的是页面请求)。
无论如何,这是我通常会做的事情,但它并不适用于所有情况:
Internet -> 冗余防火墙对 -> Squid 代理 -> 冗余负载均衡器对 -> 多个 Web 服务器 -> 主从 MySQL 复制设置中的多个数据库。
所有数据库写入都发往主服务器(如果写入很多,则发往多个主服务器),然后传播到多个从服务器。数据库读取/查询仅发送到从服务器。
顺便说一句,1M 次点击量是非常不准确的流量测量方法。1M 次静态内容请求可能比对 PHP 文件的 1k 次请求要好,后者每次都会导致数据库锁定几秒钟。
答案3
瓶颈到底在哪里?HTTP 请求、NFS,有很多要讨论的。
磁盘如何连接到数据库服务器?SAN、NFS 挂载目录等...
答案4
第一个问题的简短答案可能是负载平衡和反向代理,第二个问题的简短答案可能是 memcached。显然,您希望对此进行补充、激励、解释等。