使用 MySQL 复制在 DMZ 中启用数据库的只读副本

使用 MySQL 复制在 DMZ 中启用数据库的只读副本

我需要在 DMZ 中设置一个 MySQL 数据库实例,它是安全网络内实时主数据库的只读副本。

MySQL 复制似乎是实现此目的的理想方式,只不过它的工作方式是从服务器“拉”主服务器的更改。这意味着 DMZ 中的从服务器必须能够打开与主服务器的连接,而安全人员不会允许这样做。

我曾尝试过从主服务器设置 ssh 隧道,但从属服务器似乎保持连接打开(即使在调用“SLAVE STOP”之后),这意味着隧道始终打开(某种程度上打破了安全限制)。

有没有办法强制 mysql 断开连接,而不是停止 mysqld?

还有其他我还没有想到的方法可以达到同样的目标吗?

从主服务器到从服务器的更新需要接近实时(即,几分钟的延迟是可以接受的,但不能更多)。

答案1

另一个想法,与您所描述的略有不同:

  • 从主服务器设置隧道
  • 从主服务器启动从服务器(注意主服务器的binlog位置)
  • 运行从属设备直到达到或超过主设备的 binlog 位置
  • 停止从属设备
  • 关闭隧道
  • 每 x 分钟重复一次

这里的关键是隧道由主机创建和销毁,并定期运行更新。

答案2

从属设备与主设备保持永久连接,但是当您发出“STOP SLAVE”时会关闭该连接。

如果您的数据非常小,并且您可以容忍几分钟的延迟,那么您可以使用 Maatkit 的 mk-table-sync 工具编写一些脚本来完成这项工作。它将对您的表进行校验并找出更改的内容以应用它们。您可以从主服务器运行它并定期连接到 DMZ 中的从服务器,从安全角度来看,这会更安全 - 即使攻击者破坏了 DMZ 计算机并将其完全替换为他们自己的软件,他们获得的访问权限仍然不会超过数据库的快照。

答案3

这很丑陋但仍然 - 如果主服务器上没有发生太多事情,您可以定期在主服务器上运行[甚至每分钟一次]:

  • FLUSH LOGS;[我假设您在主服务器上有 bin-logging。如果是这样 - 这将关闭旧日志文件并强制主服务器创建新的日志文件]
  • 使用 ssh 隧道或仅使用 mysql 和 binlog 命令在 dmz 中的从属上“回复”日志文件

所以您不需要依赖 mysql 复制机制。

您需要考虑到服务器在一分钟内可能会创建多个日志文件的事实。

答案4

这里有很多精彩内容。然而,每个人都把拼图的不同部分弄得太复杂了。

mroe 说:
...从属设备似乎保持连接打开(即使在调用“SLAVE STOP”之后),这意味着隧道始终打开......

1.终止传入的 SSH 会话不是从属 mysqld 的职责。(这更接近于使用 netcat 进行隧道传输的工作方式,但这不是讨论这个问题的地方,所以我们不要混淆这个问题。)主服务器应该终止连接,因为 [a] 它发起了该连接 [b] 它是您希望保护的网络内部的连接。如果您想终止从属端的连接,请调用“ kill -s HUP $pid_of_the_sshd_owned_by_mysqlmaster”。我再说一遍,我看不出有什么用处。

2.为什么你要调用“ SLAVE STOP”?从服务器就是从服务器。既然我们谈到了这个话题...从服务器永远不应该自行停止。如果要停止从服务器,主服务器(请参阅要点4.)或管理员应该执行此操作。

mroe 说: 从主服务器到从服务器的更新需要接近实时(即,几分钟的延迟是可以接受的,但不能更多)。

你不能同时拥有这两种方式。你要么让从属 IO 线程运行,要么它已经过时了。

3.不必担心“主服务器的 binlog 位置”,这是内置复制所做的。

4.如果你真的想每分钟断开连接并重新连接,请在主服务器上编写一个 cron 脚本。它应该执行以下操作:

  • 测试锁定文件并退出或创建它。
  • 像这样创建你的隧道ssh -N -R 3333:127.0.0.1:3306 [email protected] &
  • mysql -hslave.server -e 'SLAVE START'
  • 现在你必须做出选择:
    1. 保持连接,直到从属设备赶上主设备。您可以在以下输出中测试“0”(一行,忽略换行):mysql -hslave.server -e 'show slave status\G'|awk '/Seconds_Behind_Master/{print $2}'
    2. 保持一定时间的连接。也许你会这样做sleep。研究一下你的系统,确保它不消耗任何 CPU。
  • MySQL 可以很好地处理断开的连接,因此这是可选的:(mysql -hslave.server -e 'SLAVE STOP'事实上,SLAVE START如果你使用主连接重试
  • kill第二项中的 ssh 客户端的 pid。

这样就行了。现在请记住,您必须先让从服务器准备好进行复制,然后才能正常工作。既然您提到发出SLAVE STOP,我会认为这意味着您能够从主服务器到从服务器获得一致的备份并获取命令的日志位置CHANGE MASTER。我只想补充一点,您需要指定MASTER_HOST='127.0.0.1, MASTER_PORT=3333

显然,我愿意花时间研究并详细解释。我也尽量不解释太多而冒犯任何人。如果你想了解更多细节,就问我吧。

相关内容