2.10. Red Hat Virtualization 中的排它性资源和 Sanlock

Red Hat Virtualization 环境中的一些资源具有排它性,每个排它性资源只能同时被一个对象访问。
SPM 就是一个具有排它性的资源。在一个数据中心中,只能同时有一个主机具有 SPM 角色,如果数据中心中存在多个具有 SPM 角色的主机,就会出现同一个数据同时被不同的主机进行修改的情况,从而造成数据被破坏。
在 Red Hat Enterprise Virtualization 3.1 之前,SPM 的排它性是通过 VDSM 中的一个名为 safelease 的功能来实现的。这个租約被写到数据中心中的所有存储域中的一个特殊区域中,而数据中心中的所有主机都可以通过它来检查 SPM 的 状态。VDSM 的 “safelease” 的唯一功能就是来维持 SPM 的排它性。
Sanlock 可以通过“锁定(lock)" SPM 角色来提供相同的功能,但它还可以“锁定”其它资源。因此,Sanlock 具有更高的灵活性。
需要进行资源锁定的应用程序可以在 Sanlock 中进行注册,已经注册的应用程序可以请求 Sanlock 锁定某个资源,从而使其它程序无法访问被锁定的资源。例如,VDSM 可以请求 Sanlock 锁定 SPM 资源,而不需要自己锁定它。
每个存储域都有一个 lockspace 区,锁定状态被记录在 lockspace 的磁盘中。因为 SPM 资源只能分配给一个“活跃的”主机,因此 Sanlock 就需要检查具有 SPM 的主机是否是“活跃的”。当 SPM 主机连接到存储域时,它会更新从 Manager 获得的 hostid,并且会定期在 lockspace 中写一个时间戳(timestamp)。ids 逻辑卷会记录每个主机的 ID,并在每个主机更新它的 hostid 时进行相应的更新。Sanlock 会根据主机的 hostid 刷新和时间戳来决定它是否处于“活跃”状态。
资源的使用情况被记录在 leases 逻辑卷的磁盘中。当磁盘中代表某个资源的数据被更新为带有某个进程的 id 时,系统就认为这个资源被这个进程所 占用。具体到 SPM 角色资源,当它被占用时,它的数据会被更新为带有成为 SPM 的主机的 hostid.
每个主机上的 Sanlock 只需要检查资源一次来决定它们是否被占用。在初始的检查后,Sanlock 只需要监测 lockspaces 中的相应主机的时间戳的状态。
Sanlock 需要监测使用资源的应用程序。对于 VDSM,它会监测 SPM 的状态和 hostid。如果主机无法从 Manager 重复获得它的 hostid,这个主机就会失去它所占有的、在 lockspace 中记录的所有资源的排它性。Sanlock 会更新相应的资源记录来标识这些资源不再被占用。
当 SPM 主机在一定的时间内无法在存储域的 lockspace 中写时间戳时,这个主机上的 Sanlock 会要求 VDSM 进程释放它所占用的资源。如果 VDSM 进程接受了这个请求,它将释放它所占用的资源,lockspace 中的 SPM 资源就可以被其它主机使用。
如果 SPM 主机上的 VDSM 无法接受释放资源的请求,主机上的 Sanlock 就会使用 kill 命令来终止VDSM 进程。如果 kill 命令运行失败,Sanlock 会使用 sigkill 命令来终止 VDSM 进程。如果 sigkill 命令仍然无法终止进程,Sanlock 将会依赖 watchdog 守护进程 来重启这个主机。
每次当主机的 VDSM 更新它的 hostid 并在 lockspace 中写时间戳时,watchdog 守护进程都会收到一个 pet。当 VDSM 不能进行这些操作时,watchdog 守护进程将无法收到 pet。如果 watchdog 守护进程在一定时间内仍然没有收到 pet,它将会重启主机。这将保证 SPM 资源可以被释放,从而可以被其它主机使用。