我不太了解服务器,但我知道在硬件方面有很多方法可以提高运行 Web 应用程序的性能。
例如,从单个服务器开始,您可以:
- 将数据库移至另一台服务器。
- 将静态文件移至 CDN
- 在负载均衡器后面使用多个 Web 服务器。
但是如何扩展数据库服务器?可以让多台服务器运行同一个数据库吗?如果可以,它通常如何工作?
我了解负载平衡器/多个 Web 服务器的工作原理,但是同样的方法可以应用于数据库服务器吗?
答案1
这是一个非常广泛的问题。
一般的答案是,有多种方法可以做到这一点;其中主要两种如下:
- 复制
- 聚类
复制是将数据库从一台机器复制到另一台机器的地方。使用这种方法,理论上你应该至少有两个相同的数据库。使用复制数据库,你可以查询其中任何一个数据库来获取数据;你只需要小心写入,以免服务器之间发生冲突。
聚类使用共享数据存储和数据库服务器,数据库服务器可以识别数据存储是共享的并对其进行正确处理。它还建议使用集群文件系统,例如 GFS。
答案2
您可以进行一些负载平衡;但很快就会变得棘手。我发现最有用的是了解您的数据库通常执行哪种操作。如果您有一个网站;通常是读取。对于跟踪应用程序(作为示例),您将有很多写入操作。
如果您有大量读取操作,则可以创建大量只读镜像,在前面放置一个负载平衡器,这样就大功告成了。每个请求都经过平衡,因此每个请求都能获得最大数量的资源。
对于写入繁重的系统来说,这有点困难,因为当您添加新服务器时,它们需要知道其他服务器在做什么 - 这就是锁定的作用所在。如果您有服务器 A 和 B;A 收到更新或插入请求,在修改表之前,它必须说“嘿 B,请确保您不要更改此表,我即将更改它”(锁定),然后提交更改。这一切都发生在网络上(通常),这意味着它可能会很慢(毫秒而不是微秒),从而会影响性能。随着您添加服务器,性能会下降。对于 A、B 和 C;A 必须在提交之前与 B 和 C 进行通信。
希望这可以作为数据库扩展的介绍。我目前正在研究 Citrix Netscalers 数据库负载平衡产品,它们可以帮助解决这些问题;我建议至少查看他们关于该主题的文档 :)
答案3
这实际上取决于数据库技术,但通常是通过分片、主-主复制或主-从复制来实现的,其中所有写入都发送到主服务器,所有读取都来自从服务器。
还有很多其他方法,但这些是最常见的。