群集系统靠 心跳线传递信息,早期的心跳线是 RS232串口线,后来改用网线,也可以用网络+串口线,或是多根网线,除了专用的心跳线,也可以用公网传递信息。如果这些线路都断了呢?就会出现“ 脑裂”的现象,为了避免这种情况,群集还可以使用共享存储来传递信息,在心跳线路中断时仲裁节点对存储设备的访问权。早期是单一的 仲裁磁盘(Quorum Disk),后来为了避免单点失败,采用多个仲裁盘,还可以使用阵列的控制器来传递集群信息。 I/O Fencing就是这样的技术。
 
I/O Fencing使用 SCSI-3 persistent reservations (PR)技术来实现共享存储保护。它需要一个或多个 协作磁盘(Coordinator Disks),每个节点都要注册自己节点ID到协作磁盘,如节点A注册为A-------,节点B注册为B-------,这个注册Key并没有写到磁盘上,而是在磁盘的芯片或是RAID控制器中,所有的注册节点都能看到所有节点注册的Key,共同构成一个群集环境。
 
接下来群集开始启动服务,加载资源组,加载磁盘后,节点会向数据磁盘写入注册信息,节点A向它所控制的磁盘写入Key A,节点B向它所控制的磁盘写入Key B。此后只有注册的系统可以向数据磁盘写入数据。各节点排它使用数据磁盘。
 
如果节点B失效,则节点A使用SCSI-3 Preempt and Abort命令清除节点B在协作磁盘上注册的ID,群集管理软件导入原来由节点B控制的数据磁盘,清除节点B注册信息,写入节点A的注册信息。实现资源转移。
 
如果节点A与B之间的心跳线失效,则节点A和B都开始清除对方在协作磁盘上的注册,但是只能有一个节点胜出。我们假设有三块协作磁盘,在第一块上,节点A胜出,失败的节点B要等1秒钟才可以去争剩下的协作磁盘,所以第二三块上,节点A也会胜出。这样节点B就会 P anic,立刻重新启动,节点A接管所有的数据磁盘。节点B重新启动之后,无法找到群集中的另一节点(心跳线失败),群集不工作,如果管理修改节点数为1强行启动群集,节点B会发现协作磁盘中有节点A的注册信息,节点B将停止工作,不会争夺磁盘控制权。
 
多节点的情况下,脑裂时群集将分裂为两个 mini cluster,每个mini cluster中的节点号最小的节点参与协作磁盘的竞争,I/O fencing的算法会保证活动节点多的mini cluster优先胜出。