gpt4 book ai didi

storage - 如何使 ZFS 高可用

转载 作者:行者123 更新时间:2023-12-04 15:41:02 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

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

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

关于storage - 如何使 ZFS 高可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57787875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com