我对现实世界中的 Web 应用程序的架构方式感到有些困惑,如果能得到一些说明,我将非常高兴。我知道有很多方法和不同的方法,但来自 Facebook/Amazon/Youtube 等知名网站的示例就足够了。假设我正在提供 Web 内容。我假设我将拥有一组 Web 服务器和一组 DB,它们前面有一个负载平衡器。
我的问题是:
您如何存储 http 代码?它是存储在每台机器本地还是共享存储中?如果存储在本地,如果网站发生变化,我该如何更新代码
静态内容也是如此,我假设它位于共享存储中
如果我使用 CDN,它是否只是缓存所有静态访问的数据?缓存多长时间?
LB - 我可以拥有一个 LB 集群吗?如果可以,它是如何工作的?
你会为 YouTube/流媒体网站选择什么数据库?为什么
我知道问题很多,但如果能得到所有问题的答案,我将非常感激。谢谢!
答案1
您如何存储 http 代码?它是存储在每台机器本地还是共享存储中?如果存储在本地,如果网站发生变化,我该如何更新代码
有很多方法,您可以将代码存储在共享存储(例如 NFS/S3 挂载)上 - 这使得集中更新变得非常容易,显然您会引入单点故障,因此人们通常在不同的存储上拥有两个代码副本,因此他们只会丢失一半的节点 - 您也可以将其用于蓝/绿测试/部署。另一种选择是将其存储在分布式文件系统(例如 Ceph 或类似系统)上,显然存在相同的注意事项。
静态内容也是如此,我假设它位于共享存储中
一般来说这是正确的,很多人使用基于云的存储来存储静态内容,因为从网络角度来看,它通常离他们的 CDN 很“近”,如今很少看到直接存储在网络服务器上的内容。
如果我使用 CDN,它是否只是缓存所有静态访问的数据?缓存多长时间?
这当然是基本功能,它们通常可以做更多的事情,并且 TTL 几乎总是可以根据单个对象/文件进行配置。
LBs - 如何知道一台机器是否超载(平均负载)?
很多不同的方式,开放连接,响应时间,共享资源利用率统计 - LB 可以非常“可调”,我非常尊重优秀的 LB 经理。
LB - 我可以拥有一个 LB 集群吗?如果可以,它是如何工作的?
是的,它们实际上是分层的,并且按照您喜欢的方式分层 - 例如,我们使用 Global LB 根据多种因素将流量发送到特定数据中心,然后一旦流量到达该站点,它就会被分成不同的服务组(例如绿色/蓝色),然后发送到实际的服务 LB。
你会为 YouTube/流媒体网站选择什么数据库?为什么
抱歉,没有一个最好的数据库——有太多因素,成本是一个主要因素(我的意思是 MSSQL 和 Oracle 现在可能非常昂贵!)但主要要考虑的是你的数据库需求引用完整性,如果确实如此,那么你需要一个基于 SQL 的数据库(虽然也有免费的,MySQL 和 PostGRES 很流行),但如果你能正确设计你的数据,那么你可以使用“NoSQL”数据库,比如 Couchbase/Mongo/Cassandra,它们绝对飞,因此对于基本查询来说比 SQL 快得多 - 但显然它们的功能不那么丰富。另一件事是,您现在可以完全在云中完成数据库工作 - 尤其是 AWS 拥有强大的数据库类型组合,而 Azure 显然将 MSSQL 作为其产品组合的一部分。