原文章: Ganesha-rados-cluster-design man page|mankierclusteredradosrecoverybackenddesign 3359 www.man kier.com/8/ganerer
ganesha有三种类型的恢复后端。
1. rados-kv
2. rados-ng
3.rados -集群
目录
单个Ganesha服务器恢复
单一服务器宽限期
重新启动epochs
客户端恢复数据库
导出群集文件系统
宽限期数据库
群集客户端恢复数据库
设立新的宽限期
解除宽限期
单个ganesha server恢复NFSv4是基于租赁的合同。 客户端与服务端建立连接后,必须定期更新租用以保持临时状态(文件打开、锁定、委托或布局)
当单个NFS服务器重新启动时,所有临时状态都将丢失。 当服务端恢复在线时,NFS客户端会检测到服务端重新启动,并尝试重用与服务端交互的临时状态
为了防止单个宽限期以冲突告终,客户端在恢复阶段将被禁止获取新状态(open、setattr等),并且只允许回收操作。 这个时间叫做宽限期。
大多数NFS服务器大约有两个租赁期,但如果nfs-ganesha确定不再允许客户端恢复,则可以提前取消宽限期。
宽限期结束后,服务器将进入正常运行状态。 在此期间,不允许进一步恢复,NFS客户端可以获得新状态。
重新启动epochs单个NFS服务器的生命周期可以视为从恢复期到恢复正常操作的一系列迁移。 本手册的其馀部分将此类时段视为epoch,并为每个时段分配一个以1开头的数字。
在视觉上,可以像这样指示每次Normal – Recovery变换时epoch值的变化。
—————–状态| r|n|r|r|n—r|n epoch|1|2|3|4———- -宽限期
epoch都会变长。新epoch仅在从恢复 -> 正常转换期才声明。
客户端恢复数据库
可能会发生一些涉及网络分区和多次重启的潜在边缘情况。为了防止这些,服务器必须维护一个在任何给定时间在服务器上持有状态的客户端列表。此列表必须保存在可靠的存储中。如果某个客户端发送请求以回收某些状态,则服务器必须在允许请求之前检查确保它在该列表中。
因此,当服务器允许回收请求时,它必须始终针对前一个时期epoch的恢复数据库进行记录检查。当客户进来回收时,我们在与当前epoch相关联的新数据库中为他们建立新记录。
从恢复期到正常期操作的转换应该执行恢复数据库的原子切换。恢复数据库仅在恢复到正常过渡时才变得合法。在那之前,上一epoch的恢复数据库才是规范的数据库。
导出集群文件系统
让我们考虑一组独立的 NFS 服务器,它们都从任何风格的集群后端文件系统提供相同的内容。在这种情况下,每个 NFS 服务器本身都可以被视为一个集群文件系统的客户端。这意味着 NFS 服务器实际上只是集群文件系统上状态的代理。
文件系统必须对 NFS 服务器做出一些保证。第一个文件系统保证:
1. 文件系统确保 NFS 服务器(也称为 FS 客户端)无法获得与另一个 NFS 服务器的状态冲突的状态。
这有点明显,也是我们对任何集群文件系统的期望,超出 NFS之外的任何要求。如果集群文件系统可以提供这一点,那么我们知道在正常操作期间不能授予冲突状态。
恢复期有一套不同的规则。如果 NFS 服务器崩溃并重新启动,那么我们有一个时间窗口,该 NFS 服务器不知道其客户端保持什么状态。
如果崩溃的 NFS 服务器保持的状态在崩溃后立即释放,另一个 NFS 服务器可能会在原始 NFS 客户端有机会恢复它之前分发冲突状态。
必须防止这种情况。第二个文件系统保证:
2. 在集群中的所有服务器都执行宽限期之前,文件系统不得释放服务器在前一个时期持有的状态。
实际上,我们希望文件系统为 NFS 服务器提供一种方法来告诉它何时可以安全地释放由它自己的前一个实例持有的状态。一旦服务器知道它的所有兄弟都在执行宽限期,它就应该这样做。
请注意,我们不要求所有服务器都重新启动并允许在那时回收。一旦一台服务器需要它,他们只需尽快开始实施宽限期就足够了。
集群宽限期数据库
此时集群中的NFS服务球不再完全独立,宽限期已成为集群范围的属性。这意味着我们必须在服务器都可以访问的某种共享存储上跟踪当前epoch。
此外,我们还必须跟踪集群范围的宽限期是否有效。当这些信息中的任何一个发生变化时,任何正在运行的节点都应该被通知,以便它们在发生时采取适当的步骤。
在rados_cluster后端,我们使用两个epoch值跟踪这些:
C : 是当前epoch。这代表集群的当前纪元值
R:是恢复epoch。这代表了从哪个epoch开始允许客户恢复。此处的非零值表示集群范围的宽限期有效。将此设置为0结束宽限期。
为了决定何时进行宽限期转换,每个服务器还必须向其他节点通告其状态。具体来说,每个服务器必须能够确定关于它的每个兄弟的这两件事:
该服务器是否有需要恢复的上一纪元的客户端?(NEED)该服务器是否通过拒绝不可回收锁来强制执行宽限期?(ENFORCING)
我们对每个NFS服务器成员使用一对标志(NEED 和 ENFORCING来做到这一点。每个服务器通常管理自己的标志。
rados_cluster 后端将所有这些信息存储在使用读/修改/写周期修改的单个 RADOS 对象中。通常我们会读取整个对象,修改它,然后尝试将其写回。如果读取和写入之间发生了某些变化,我们会重做读取并再次尝试。
集群客户端恢复数据库
在 rados_cluster 中,客户端恢复数据库存储为 RADOS 对象。每个 NFS 服务器都有自己的一组,它们的名称中嵌入了当前的epoch值 (C)。这确保了恢复数据库针对特定epoch对应特定的对象。
通常,当 R 不为零时,删除 R 之前的任何恢复数据库是安全的,并且当宽限期无效时,删除除当前数据库(名称中带有 C 的数据库)之外的任何恢复数据库都是安全的( R==0)
建立新的宽限期
当服务器重新启动并希望允许客户端回收其状态时,它必须通过增加当前epoch值建立新的epoch来声明新的宽限期(R=C;C=C+1)。
此规则的例外情况是集群已处于宽限期。如果服务器已经处于活动状态,则服务器可以加入正在进行的宽限期,而不是建立新的宽限期。
在任一情况下,服务器还应同时设置其 NEED 和 ENFORCING 标志。
其他活着的集群兄弟应该采取措施尽快开始宽限期实施。这需要逐渐排除任何正在进行的状态变形操作,然后阻止任何新状态的获取(通常将 NFS4ERR_GRACE 返回给尝试它的客户端)。同样,前一纪元的幸存者不需要在这里恢复。
然而,幸存的服务器此时必须建立一个新的客户端恢复数据库,以确保他们的客户端可以在之后发生崩溃时进行恢复。
一旦所有兄弟都执行了宽限期,恢复服务器就可以请求文件系统释放旧状态,并允许客户端开始回收它们的状态。在 rados_cluster 后端驱动程序中,我们通过停止服务器启动来做到这一点,直到集群中的所有主机都执行宽限期。
解除宽限期
从恢复到正常操作的转换实际上包括两个不同的步骤:
服务器决定不再需要宽限期,要么是因为它超时,要么是没有任何客户端可以回收。服务器停止执行宽限期并转换到正常操作
这些概念通常在单例服务器中混为一谈,但在集群中我们必须独立考虑它们。
当服务器完成自己的本地恢复期时,它应该清除其 NEED 标志。该服务器应该继续执行宽限期,直到宽限期完全解除。但是,服务器在清除其 NEED 标志后不得允许回收。
如果服务器自己的 NEED 标志是最后一个设置,那么它可以解除宽限期(通过设置 R=0)。此时,集群中的所有服务器都可以结束宽限期强制执行,并通过清除它们的 ENFORCING 标志将该事实传达给其他服务器。
一分快三计划导师QQ群号告其状态。具体来说,每个服务器必须能够确定关于它的每个兄弟的这两件事:
该服务器是否有需要恢复的上一纪元的客户端?(NEED)该服务器是否通过拒绝不可回收锁来强制执行宽限期?(ENFORCING)
我们对每个NFS服务器成员使用一对标志(NEED 和 ENFORCING来做到这一点。每个服务器通常管理自己的标志。
rados_cluster 后端将所有这些信息存储在使用读/修改/写周期修改的单个 RADOS 对象中。通常我们会读取整个对象,修改它,然后尝试将其写回。如果读取和写入之间发生了某些变化,我们会重做读取并再次尝试。
集群客户端恢复数据库
在 rados_cluster 中,客户端恢复数据库存储为 RADOS 对象。每个 NFS 服务器都有自己的一组,它们的名称中嵌入了当前的epoch值 (C)。这确保了恢复数据库针对特定epoch对应特定的对象。
通常,当 R 不为零时,删除 R 之前的任何恢复数据库是安全的,并且当宽限期无效时,删除除当前数据库(名称中带有 C 的数据库)之外的任何恢复数据库都是安全的( R==0)
建立新的宽限期
当服务器重新启动并希望允许客户端回收其状态时,它必须通过增加当前epoch值建立新的epoch来声明新的宽限期(R=C;C=C+1)。
此规则的例外情况是集群已处于宽限期。如果服务器已经处于活动状态,则服务器可以加入正在进行的宽限期,而不是建立新的宽限期。
在任一情况下,服务器还应同时设置其 NEED 和 ENFORCING 标志。
其他活着的集群兄弟应该采取措施尽快开始宽限期实施。这需要逐渐排除任何正在进行的状态变形操作,然后阻止任何新状态的获取(通常将 NFS4ERR_GRACE 返回给尝试它的客户端)。同样,前一纪元的幸存者不需要在这里恢复。
然而,幸存的服务器此时必须建立一个新的客户端恢复数据库,以确保他们的客户端可以在之后发生崩溃时进行恢复。
一旦所有兄弟都执行了宽限期,恢复服务器就可以请求文件系统释放旧状态,并允许客户端开始回收它们的状态。在 rados_cluster 后端驱动程序中,我们通过停止服务器启动来做到这一点,直到集群中的所有主机都执行宽限期。
解除宽限期
从恢复到正常操作的转换实际上包括两个不同的步骤:
服务器决定不再需要宽限期,要么是因为它超时,要么是没有任何客户端可以回收。服务器停止执行宽限期并转换到正常操作
这些概念通常在单例服务器中混为一谈,但在集群中我们必须独立考虑它们。
当服务器完成自己的本地恢复期时,它应该清除其 NEED 标志。该服务器应该继续执行宽限期,直到宽限期完全解除。但是,服务器在清除其 NEED 标志后不得允许回收。
如果服务器自己的 NEED 标志是最后一个设置,那么它可以解除宽限期(通过设置 R=0)。此时,集群中的所有服务器都可以结束宽限期强制执行,并通过清除它们的 ENFORCING 标志将该事实传达给其他服务器。