假设我们正在启动一个旨在为全世界提供服务的项目
我该如何分配数据库和服务器负载,并增加(优化)面向大量受众的服务?
我了解反向代理、负载平衡、使用子域名的 DNS 来定位可以提供相同内容的多个 IP。
我目前感兴趣的是,是否有任何简单的方法来分发我的整个数据库和服务(目前是单个虚拟机)以分配负载。
我的一些想法/问题
- 如果我确实需要在每个区域启动 VPS,然后在后台合并数据
- 如果我可以用单台服务器实现这一点,并且只使用 CDN 来提供静态资源
- 如果有任何平台,我可以分离 MVC 层,这样每个层将在单独的服务器上运行,或者可以进行优化,单独分发
- 如果我可以在某些云服务上托管我的应用程序,它将处理不断增加的负载并单独分发服务。需要 IaaS 提供商吗?
我认为这个问题不容易回答,所以最好的回答方式可能是给我指出一些与这个主题相关的白皮书。
答案1
这是一个非常广泛的问题,没有灵丹妙药可以解决这个问题。设置多个站点的最大挑战是数据库,尤其是多主数据库。Mysql 和一堆 nosql 数据库确实支持多主复制,您需要评估并找出哪一个最适合您的要求。
稍微偏离主题,但您的设置中可以接受多少延迟?CDN、反向代理可以帮助加快您的网站速度。Google/Yahoo/Facebook 等公司可以在洲际间提供动态内容,且延迟不会太高。
答案2
如何分发我的整个数据库的简单方法
想一想锁定一秒钟。当 2 个客户端想要写入数据库中的同一行时,数据库会使用写锁来避免竞争条件和无效数据。在“分布式数据库”场景中,获取和释放锁的行为本身需要分布式。当其他节点可能相距 0.300 秒时,您将如何做到这一点,如何创建高性能锁定系统?
这个问题没有好的答案,这是计算机科学中最难的问题之一。你可以阅读以下文章来了解一下CAP 定理。
单台服务器,仅使用 CDN 来交付静态资源
是的,这是最常用的方法。将所有动态数据保存在单个数据中心(即 Web 应用服务器和数据库服务器位于同一设施中),然后对静态数据使用全局 CDN。这种设置很容易理解,并且通常效果很好。
是任何平台,我可以分离 MVC 层,因此每个层将在单独的服务器上运行,或者可以进行优化,单独分发
在彼此距离非常近的情况下,网络连接非常快,并且延迟始终很低:没有问题。在地理分散的情况下,网络连接速度很慢,这是不可能的。
将我的应用程序托管在某些云服务上,这将处理不断增加的负载并分发服务
在某种程度上,Google App Engine 做到了这一点。在我看来,这是 App Engine 最大的优势。为了实现这一点,您必须针对 App Engine 非常简化的数据模型(即没有 SQL,只有 BigTable)进行编程,这会带来很大的负面影响。
您的问题很杂乱,而且问题很复杂,因此很难只给您推荐一本书来读。
- 我认为分布式计算的计算机科学课程很棒。
- 我还记得Cal Henderson 的书《构建可扩展的网站》。它与上面的完全不同,它更像是一些过时的扩展 Web 应用程序策略的集合。虽然它已经过时了,但我仍然认为它很好地介绍了扩展 Web 应用程序的常见问题以及分析和解决问题的心态。