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

我需要在DMZ中设置一个MySQL数据库实例,DMZ是安全networking中活动主服务器的只读副本。

MySQL的复制似乎是理想的,除了它的奴隶“拉”从主人的变化。 这意味着在DMZ中的奴隶必须能够打开与主人的连接,这是安全人员不允许的。

我已经开始设置从主站的SSH隧道,但奴隶似乎保持连接打开(即使在调用“SLAVE STOP”后),意味着隧道总是打开(有些挫败安全限制)。

有没有办法强制mysql删除连接,停止mysqld的短?

有没有另外一种方法来实现我没有想到的同样的目标?

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

另一个想法,你所描述的一个小小的变化:

  • 从主站安装隧道
  • 从master开始slave(注意master的binlog位置)
  • 运行从站,直到达到或超过主站的binlog位置
  • 停止奴隶
  • closures隧道
  • 每x分钟重复一次

这里的关键是隧道是由主设备创build和销毁的,定期运行更新。

从站与主站保持永久连接,但在发出“停止从站”时closures。

如果你的数据非常小,你可以容忍几分钟的延迟,你可以使用Maatkit的mk-table-sync工具编写脚本。 它将校验你的表格,并找出应用它们的变化。 你可以从主设备上运行,并定期连接到DMZ中的从设备,从安全angular度来看这将更加安全 – 即使攻击者损害了DMZ设备,并用自己的软件完全替代了它们,它们仍然会没有比db的快照更多的访问权限。

这是丑陋的,但仍然 – 如果主人没有太多的事情发生,你可以定期运行在主人(即使每分钟一次):

  • FLUSH LOGS; [我假设你有主logging箱。 如果是的话 – 这将closures旧的日志文件,并强制主创build新的日志文件]
  • 使用ssh隧道或只是mysql和binlog命令“回复”在dmz从属的日志文件

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

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

过去我不得不处理类似的事情。 你有几个select。

  1. MySQL复制使用SSL,证书和IP限制。 这很容易设置,你可以locking下来相当不错。 您仍然打开到服务器的连接,但您确实严格控制访问。 安全人员可能不够好。

  2. 正如别人提到的,将log-bin文件复制到slave,然后使用mysqlbinlog来获取它们。 我最终使用这个来将一些新的收购转移到公司networking。 然而,这是一个临时措施,我们只用了一个月,并且很less运行。 此外,您将有数据到达DMZ服务器的时间。

  3. 使用Mysql Proxy同时写入两个Mysql服务器。 http://dev.mysql.com/downloads/mysql-proxy/index.html这可能会有一些有趣的问题,如果你的架构有怪癖。 缺点,安装和学习的新工具,以及相当不错的testing版。 上行,解决你的大部分问题。

这里有很多很棒的食物。 然而,每个人都在复杂化拼图的不同部分。

mroe说:
…奴隶似乎保持连接打开(即使在调用“SLAVE STOP”后),意味着隧道总是打开…

1.终止一个传入的SSH会话不是从属mysqld的angular色。 (这更接近netcat的隧道工作方式,但这并不是那个地方,所以我们不要混淆这个问题)。主机应该终止连接,因为[a]它起源于[b]它是networking中的一个你希望保护。 如果要终止从端侧的连接,请调用“ kill -s HUP $pid_of_the_sshd_owned_by_mysqlmaster ”。 我会再说一遍,我没有看到使用。

2.为什么你会打电话“ SLAVE STOP ”? 奴隶是奴隶。 既然我们在谈论这个话题,奴隶就永远不应该停下来。 如果从站将被停止,主服务器(见第4.点)或pipe理员应该这样做。

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

你不能双方都有。 您要么正在运行从IO线程,要么已经过期。

3.不要担心复制内置的“master的binlog位置”。

4.如果你确实每分钟都要断开连接并重新连接,请在主服务器上写一个cron脚本。 它应该做到以下几点:

  • testing一个锁文件,并退出或创build它。
  • 像这样创build你的隧道ssh -N -R 3333:127.0.0.1:3306 [email protected] &
  • mysql -hslave.server -e 'SLAVE START'
  • 现在你必须做出select:
    1. 保持联系,直到奴隶赶上主人。 你可以在下面的输出中testing'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' (事实上​​,如果使用MASTER_CONNECT_RETRY,则从服务器是可选的)
  • 从第二个子弹kill ssh客户端的pid。

这应该做到这一点。 现在请记住,在这个工作开始之前,你必须准备好复制副本。 既然你提到发出一个SLAVE STOP ,我SLAVE STOP意思是你能够从主机到从机获得一致的备份,并获得CHANGE MASTER命令的日志位置。 我只是补充一点,你需要指定MASTER_HOST='127.0.0.1, MASTER_PORT=3333

显然我没有时间花时间去研究,并且详细解释。 我也试图不要侮辱任何人解释太多。 如果你想要更多的细节,只要问我。