我的网站流量一直在增长,mysql 的负载也在增加。我需要一个解决方案,能够帮助处理由于流量增加而导致的 mysql 负载增加(所有查询都已优化),并且需要有备份服务器,以便在主服务器发生故障时充当故障转移。
我已经阅读了有关设置多个 Web 和数据库服务器的信息,但有几个问题:
1)如何在保持相同内容的同时设置多个 Web 服务器(每次更新文件时我是否都必须将文件上传到所有服务器,或者还有其他方法吗?)
2)同样,如果我必须将数据库扩展到多个服务器,除了复制之外还有其他方法吗,或者 mysql 复制是最好的方法。
3) 我读到过将数据库与 Web 服务器分离是个好主意,为什么呢?如果我有 2 台服务器,难道我不能同时在两台服务器上拥有数据库和文件吗?
4)是否需要所谓的负载平衡器?如果设置了复制,它是否也有助于平衡 mysql 查询?
只是非常困惑,希望得到一些帮助。
答案1
传统设置是将 Web/应用服务器与 DB 服务器分开。将它们放在同一个机器上会非常受限。如果您的 Web 应用程序由静态和动态内容混合组成,那么进一步的分离(单独的 Web 服务器、应用服务器和内容服务器)将提高性能。
就 MySQL 而言,您可能想尝试这些;
- 肯定在自己的专用服务器上有 MySQL。
- 在机器可以承受的范围内放入尽可能多的内存,MySQL爱记忆。
- 将您的操作系统、二进制日志和数据放在三个独立的物理磁盘上。
答案2
1)如何在保持相同内容的同时设置多个 Web 服务器(每次更新文件时我是否都必须将文件上传到所有服务器,或者还有其他方法吗?)
随着规模的扩大,情况会变得更加复杂。一开始,您只需手动将所有内容同时部署到所有服务器即可。您可以编写脚本来执行此操作。
你可以更大,配置管理软件可以提供帮助。此外,开放EFS将是一个合适的解决方案。
对于静态内容和某些类型的内容,可用的选项更多。当您尝试通过负载平衡应用程序本身修改或上传内容时,这些决定会更加明显,因为如果您处理不好,就会导致数据分区。例如,上传的文件只会位于其中一个负载平衡服务器上。
不分先后顺序:
- 用一个内容分发网络。
- 使用缓存自行代理静态内容。
- 将数据存储抽象为高可用性文件系统。
- 通常,理想的首选解决方案是将内容存储在数据库中。
2)同样,如果我必须将数据库扩展到多个服务器,除了复制之外还有其他方法吗,或者 mysql 复制是最好的方法。
这取决于你的最终目标:一致性、可用性或分区容忍度。妥协可能是必要的。这是一个广泛的主题,你可以从阅读以下书籍中受益:高性能 MySQL.常用选项:
- 双主复制采用类似技术Linux 高可用性,虚拟专用网络备份组, 或者多主 MySQL。这将有一个浮动 IP。您需要实现自动 ID 偏移并注意应用程序性能。
- 使用类似的解决方案DRBD用于块级存储复制,然后在发生故障时再次使用 Linux-HA 之类的技术来对资源进行故障转移。
MySQL 还有各种白皮书已发布。
3) 我读到过将数据库与 Web 服务器分离是个好主意,为什么呢?如果我有 2 台服务器,难道我不能同时在两台服务器上拥有数据库和文件吗?
最好将角色专用于目的,因为这样可以降低复杂性和安全风险。至少两个负载平衡器、两个数据库服务器和两个 Web 服务器可能会对您有所帮助。请注意其他故障点,因为高可用性不会止步于此。您的网络很可能是下一个明显的单点故障。
它还可以实现标准化构建、扩展和角色转移,并且更简单。不过,这些功能并非分离服务器角色所独有。
4)是否需要所谓的负载平衡器?如果设置了复制,它是否也有助于平衡 mysql 查询?
对于写入查询和 MySQL,垂直扩展通常更容易。要水平扩展(这是许多现代解决方案的首选),您需要采用以下架构:分片理想情况下,您的应用程序必须设计为支持这一点。此外,我通常对各种中间件解决方案持谨慎态度。
您可以轻松地将负载平衡到 MySQL 复制从属服务器,这将允许您使用负载平衡的 VIP 进行只读查询。