【问题标题】:How to make ZFS high available如何使 ZFS 高可用
【发布时间】:2020-01-07 07:36:10
【问题描述】:

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

  • https://github.com/ewwhite/zfs-ha/wiki:需要服务器在故障转移期间启动以导出 zpools 元数据

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

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

【问题讨论】:

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

标签: storage cluster-computing high-availability zfs


【解决方案1】:

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

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

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

最终最好的解决方案是使用高级症状来决定是否进行故障转移,但使用低级互斥执行。但是,如果 ZFS 内部不支持互斥,您可能需要在 ZFS 层之上同时执行这两项操作,例如通过创建一个 shim 层来检查所有权,然后再向 ZFS 发出写入。

如果您认为与机器崩溃/重启相比,网络分区和性能问题不会成为真正的问题(在小型数据中心中可能是一个合理的假设,因为这些事件的概率较低),那么您可能不会完全需要存储级别的互斥,上层的解决方案就可以了。

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 1970-01-01
      • 2020-05-31
      • 2018-10-07
      • 2017-05-29
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 2017-08-31
      相关资源
      最近更新 更多