Storage 如何使ZFS高可用性

Storage 如何使ZFS高可用性,storage,cluster-computing,high-availability,zfs,Storage,Cluster Computing,High Availability,Zfs,我正在从事一个项目,我们使用ZFS作为存储卷管理器。在ZFS之上,ISCSI tgt守护进程正在运行,并将ZFS设备作为SCSI磁盘公开。现在的问题是ZFS的高可用性。事实上,ZFS不能集群化。下面的解决方案有一些问题,这就是我避免使用它们的原因 :需要服务器启动,以便在故障切换期间导出zpools元数据 使用快照:快照适用于备份,但不适用于高可用性。事实上,我在故障切换期间丢失了数据,因为两个池没有同步。(第二个池只有在第一台服务器死机之前的最后一个快照,以及在创建快照之后和故障转移丢失之前

我正在从事一个项目,我们使用ZFS作为存储卷管理器。在ZFS之上,ISCSI tgt守护进程正在运行,并将ZFS设备作为SCSI磁盘公开。现在的问题是ZFS的高可用性。事实上,ZFS不能集群化。下面的解决方案有一些问题,这就是我避免使用它们的原因

  • 需要服务器启动,以便在故障切换期间导出zpools元数据

  • 使用快照:快照适用于备份,但不适用于高可用性。事实上,我在故障切换期间丢失了数据,因为两个池没有同步。(第二个池只有在第一台服务器死机之前的最后一个快照,以及在创建快照之后和故障转移丢失之前写入的所有数据)


有没有办法通过使ZFS池高可用来使这些SCSI磁盘高可用?在ZFS上添加群集文件系统是否有意义?

看看它是否适合您。

Andrew Henle的评论是最明显的方法:在辅助服务器上使用
zpool import-f
强制导入池,并防止主服务器重新导入存储。第二部分是最难的部分

如果您可以在服务器死机后立即从物理上分离存储,那就太完美了。如果不是,大多数系统都是这样,那么您将需要某种方法来管理服务器之间的池所有权转移,可能需要某种keepalive/所有权租赁协议。您可以在存储本身中执行此操作,也可以在更高级别上执行此操作

  • 在存储中执行此操作意味着您可以通过在执行写入操作之前先检查您是否拥有所有权来防止主池重新连接池(或者如果它从未真正死过,则阻止主池继续写入该池!eek!)。租约对这一点很有意义,因为在您必须续订租约之前,租约为您提供了一段固定时间的确保所有权,比如N秒,因此您不必在每次IO之前检查所有权。当辅助服务器想要接管时,您在磁盘上写入一个新租约,以便在将来某个时间T(通过T+N秒)获得它的所有权,然后等待N秒,等待写入磁盘的任何先前租约过期(这确保旧系统将看到您的新租约并停止发出写入),最后完全导入文件系统。在ZFS中,为给定的
    txg
    创建租约而不是使用基于时间戳的租约可能是有意义的,因为时间戳意味着您的服务器需要非常相似的时间,或者您的互斥可能无法工作(尽管ZIL为此产生了问题,因为它可以在
    txg
    IIRC之外进行更新)。理想情况下,这将是ZFS本身的一个特性,但我认为还没有人实现它(尽管我知道已经讨论过)
  • 不过,在更高的层上执行此操作也有好处,因为您可以使用可能的最高层症状来触发故障切换。例如,可能您的主设备能够与存储设备通信,但无法与网络通信,或者可能由于某些性能问题/某些已启动但仍在缓慢进行的后台任务而变得无响应。要涵盖这些情况,您需要执行由试图通过网络访问存储的客户端报告的keepalives,而不是由存储服务器本身报告的keepalives
最终,最好的解决方案是使用高级症状来决定是否进行故障切换,而使用低级互斥强制。但是,如果ZFS内部不支持互斥,则可能需要在ZFS层上执行这两项操作,例如,在向ZFS发出写操作之前,制作一个检查所有权的填充层


如果您认为与机器崩溃/重新启动相比,网络分区和性能问题不是真正的问题(可能是小型数据中心的合理假设,因为这些事件的概率较低),那么您可能根本不需要存储级互斥,而且更高层的解决方案也会很好。

ZFS不能群集化,这不是真的。ZFS可以像任何其他非共享文件系统一样进行集群—一次在集群的任何一台主机上装载共享“磁盘”(实际上是SCSI LUN)。故障转移不必导出ZFS池-只需使用
ZFS import-f…
强制导入即可。然后,最困难的部分是以一种不尝试导入池的方式恢复故障服务器。最简单的方法是将其从用于访问ZFS池的网络上拔下。这样的恢复必须是手动的,所以这不是你想经常做的事情。很有趣。。。你最后做了什么?