第三章:stonith

stonith — Shoot The Other Node In The Head

stonith 的使用是为了防止脑裂,就是一个节点没有问题,但是没有应答另一个节点告诉它说自己还活着是正常的,另一个节点以为前面这节点挂了,所以要启动抢占资源,比如把vip弄到自己身上,把自己的服务启起来,存储挂起来等。
这种情况下,两边在抢占资源,就是发生脑裂了。
而我们使用stonith, stonith 全称是 Shoot The Other Node In The Head,就是爆你的头,爆头哥,由他来判断各节点是否真的有问题。
stonith的功能我们通过fence设备来实现,一般它是一个硬件设备,通过串口线来管理,不在乎被它管理的那些机器是否有网络,就是比如说目标节点的网络都断掉了,网卡是eth0,目标服务器执行ifdown eth0了,IP都没了,
这个时候fence就开始对它做一些事情了,至于做什么事情,就是由我们如何配置来决定的,比如我们让它重启。那当指定节点出问题了,fence就会让那个节点重启。
下面的实验中,我们用’物理机’来作为fence,这里的’物理机’其实也是台虚拟机,只不过是那几台node的宿主机,那几台node都是通过这个虚拟机做kvm虚拟化做出来的。所以他可以通过virsh shutdown node1 来关闭node1。扮演物理机的角色。

各节点与fence通信的时候,使用key来通信,各节点在检查不到其他节点时,会通过key让fence设备来处理那台它检查到不正常的节点。

安装fence软件包

先看一下fence的rpm包,如果你的物理设备是某些品牌的设备,比如cisco的,ibm等品牌的,那你可能需要安装一些相应的软件包,参考列表里出现的那个

yum list fence*

这里我们是个虚拟化的物理机,所以我们执行如下命令

yum install fence-virt* -y

同步key

首先我们要将目录创建出来

mkdir /etc/cluster

然后创建key,这里我们使用如下命令创建key,经过测试,如果我们创建的key不是4k的,则这个key是不会生效的。

dd if=/dev/zero of=/etc/cluster/fence_xvm.key bs=1024 count=4

那么如果定义它就是一个key呢?所以我们来设置一下,执行fence_virtd -c,相应的一些选项中多一般默认的配置和我们的实际环境信息是一样的,那就不用特地设置了,用默认的就好了。

fence_virtd -c

然后重启服务fence_virtd

systemctl restart fence_virtd

然后我们需要在每个节点上都创建一个/etc/cluster目录

mkdir -p /etc/cluster

然后我们将可以传到三个node节点上去

scp /etc/cluster/fence_xvm.key node1:/etc/cluster/
scp /etc/cluster/fence_xvm.key node2:/etc/cluster/
scp /etc/cluster/fence_xvm.key node3:/etc/cluster/

查看我们可以管理的节点

[root@server1 ~]# fence_xvm -o list
node1                c56fb624-9d7a-4870-976b-ca2c2a2dad11 on
node2                0ee3c3b6-92d2-4210-9660-698e651d863b on
node3                1ac1efd2-551b-4bb4-a2cb-5a3b3db564a1 on
node4                66afbc63-2af3-4435-8b7c-9cf9f301f114 off
node5                14761fe7-aacf-4e2a-87ec-0788231a4e1c off

在每个节点上都安装fence

在每个节点上都安装fence,节点可以使用fence-virt的各种脚本利用key和我们的物理机fence通信,告诉它你要关掉谁关掉谁。

yum install fence-virt* -y

启动Stonith

然后我们切换到dashboard里去,点到cluster properties里,勾选Stonith Enabled

../../../_images/ha9.jpg

这里有一个选项是Stonith Action,也就是当Stonith触发时做的事情,这里当前的选项是Reboot,也就是当触发Stonith时,我们Reboot目标节点。

添加fence设备

然后添加一个fence,dashboard管理界面点击FENCE DEVICES,然后点ADD 添加。
这里我们选择fence类型是fence_xvm,这里出现的各种类型,就是我们刚才安装的那些包。
../../../_images/ha10.png

然后再过一小会,就running了

../../../_images/ha11.png

手动fence指定节点

现在我们来尝试手动fence一个节点

在node1上执行

[root@node1 ~]# fence_xvm -o reboot -H node2

然后发现,node2在重启了,也就是fence掉了,触发了fence的操作,重启。

使用集群命令触发fence

前面我们是直接用fence的命令来fence一个节点,现在我们通过集群发送fence指令。

pcs stonith fence node2

模拟节点故障,触发fence

现在我们来模拟一个故障,让集群触发fence,node2的主要网卡是eth0,我们在node2上执行ifdown eth0, 这样node2就没有IP地址了。

如下图所示

../../../_images/ha12.png

然后,我们发现,node2就自动重启了。 可见fence被触发了,生效了。