我有 2 个 CentOS linux 服务器,分别位于该国家/地区每个站点的不同数据中心。这些 linux 机器在带有 MySQL 后端的 Apache 上运行一个小型网站。目前他们之间没有 VPN 连接,他们唯一可以通信的方式是通过公共 IP 空间。
我的问题是,如果其中一个失败,另一个将接管(主/从关系),那么最好的方法是什么?我希望能够在不添加第三台的情况下使用我目前拥有的两台服务器来执行此操作。我猜我需要在两者之间创建一个 VPN,然后使用 DRDB for MySQL 之类的东西。
你会推荐什么?
MySQL 具有内置的复制功能——不需要 DRBD。看这里。
此复制通过正常的 MySQL 协议在 TCP 端口 3306 上进行。本机协议支持 TLS 加密,但鉴于最近的漏洞,VPN 也可能不是一个坏主意。由你决定!
从那里开始,您只需要使用 MySQL 的应用程序以某种方式了解这两个服务器,或者根据您的应用程序制定其他类型的故障转移机制 - 听起来您的 Web 应用程序的本地实例在每个位置,因此只需将每个位置指向其本地 MySQL 实例即可。
但是要小心——如果你在两个方向上进行复制,你可能不希望同时写入两个 MySQL 服务器;可以对不同的服务器进行相互冲突的更改。
DRDB 只真正用作故障转移解决方案。正如 Shane 所说,MySQL 复制是更明智的方法。虽然您可以将其作为主/从实现,但当您检测到中断时,您会遇到升级从属的复杂情况。更好的解决方案是使用主-主复制。
但是这样做的有效性是有限的——复制写入是由单个线程实现的——所以“从”必须比主更努力地工作才能应用它们。不可避免地会有延迟——尽管通常延迟很小,不会成为问题。
尽管 mysql 支持 SSL 加密,但它并没有提供大量用于调整访问控制的功能。设置 stud 或 stunnel 以在 SSL 中包装特定端口是微不足道的。并且复制连接保持打开状态,因此带宽开销非常低。或者甚至只是使用 iptables 将对 MySQL 端口的访问限制为远程 IP 地址。
但是您仍然必须解决检测故障和隔离故障节点的问题。大概您正在跨 HTTP 服务器进行循环平衡 - 在这种情况下,客户端将倾向于在会话期间停留在同一台服务器上。Web 服务器将从本地 DBMS 实例获得最佳性能 - 因此应该只在检测到本地系统中断时尝试访问远程系统。不要担心尝试自动恢复 - 只要您可以编写脚本即可。
请仔细阅读 MySQL 复制 - 如果您做了基础工作,那么写入冲突应该非常非常少见。
DRBD 的主要缺点是通信不会被加密。所以去 mySQL 复制。
在您的设置中,我不会使用任何自动集群,因为我看不到避免裂脑情况的安全方法。
但是您可以手动触发一个脚本
另一方面,如果启动重新上线,您必须阻止启动 - 并且您需要一个回退策略。