我们的生产环境通常由 4-8 个 Apache Web 服务器和 2 个 (My)SQL 服务器组成:
每个 Web 服务器都附属于一个 SQL 服务器 SQL 服务器具有循环复制设置 所有 Web 服务器都经过负载平衡,例如由 Pound 进行负载平衡。每天晚上,都会有一项作业备份其中一个 SQL 服务器,锁定附属的 Web 服务器约 10-15 分钟。
有没有办法配置平衡以避免短时间内到达那些锁定的服务器?
除了备份非生产的第三台服务器之外,还有其他方法来处理这个锁吗?
PS:我们设想在备份之前和之后使用适当的配置文件重新加载 Pound 配置,但感觉有点奇怪......
这个问题已经在 StackOverflow 上被问过了但因“不以开发为中心”而关闭。事实上,这更像是一场生产和运行讨论。
答案1
卸载服务器以进行备份并非闻所未闻。如何执行此操作完全取决于您的负载均衡器。例如,Kemp 负载均衡器有一个 Web API,您可以调用它来禁用特定服务器,而 haproxy 有一个基于管道的管理界面,您可以从 Linux Shell 编写脚本。我确信 Pound 有一种禁用服务器的等效方法,但我不知道那是什么。
使用 haproxy 禁用服务器的另一种流行方法是让检查操作查找特定文件。当您想要禁用服务器时,只需删除或重命名该文件即可。您应该能够使用 pound 轻松完成此操作,并且它满足了您将脚本保留在我们的 Web 层而不调用负载平衡器的要求。
答案2
如果您在进行备份的主机上停止 apache,pound 应该在 30 秒内检测到后端处于离线状态并将访问者引导至其他主机。
答案3
如果您的从服务器运行在任一主服务器上,那么您可以在从服务器上进行备份,而无需进行超过 2 个节点的主-主复制。这将是我的首选。
但您也可以将当前 2 个主服务器之一标记为“隔离”,强制所有 Web 流量进入仍然活动的服务器。具体如何操作取决于与数据库通信的内容。如果只是 PHP(没有持久连接 - 在这种设置下这样做很愚蠢),则只需换入不同的包含文件,等待几秒钟(几分钟?)让当前连接完成,然后运行备份。备份完成后,再次切换包含文件。
或者,如果您拥有网络服务能力,请将您的 wbservers 分成 2 个池 - 每个 DBMS 一个,并告诉 pound 隔离一个银行,同时您使用 RRDNS 备份/运行 2 个 pound 实例,并添加一个 iptables 表以在您想要备份时拒绝备份银行上的新连接。
如果您有持久连接,那么银行切换可能是唯一可行的解决方案。