当集群中的所有节点node都活跃的时候,每个节点都有一个vote(我们称之为票)。

临界值(quorum):集群能正常运行所需的最少的票数

当集群中的总票数为奇数时:quorum=(总票数+1)/2

当集群中的总票数为偶数时:quorum=总票数/2+1

注:对于只有两个节点的集群,不适用上面的公式,两节点集群比较特殊


查看集群节点持有的票数(vote值):

在node1上运行: #corosync-quorumtool -l   显示每个vote为1,结果如下图:

    wKioL1bG7zTjKCzKAABzVnAw4qk648.jpg

接下来我们测试以上公式的正确性:

   首先我们需要搭建一个环境: 

   在集群中添加一个资源,我们以vip为例,在宿主机上运行

    #firefox https://node1:2224&  

    输入用户名和密码进入集群配置界面,会发现第一天配置的集群,如下图:

    wKioL1bG8nqh_5eEAACDRdHAGcc082.png

    此时点cluster properties,这里面的stonith enable一定得关闭,如下图:

    wKioL1bG8xbAPqukAAEIwP3P0F0018.png

    因为我们还没有配置fence,可以点resources添加资源了,点add,然后弹出界面, Class/Provider:ocf:heatbeat  Type:IPaddr2    ResourceID:vip   ip:192.168.100.100(此ip一定是没被使用的)  点开Option Arguments,填写cidr_netmask:24

其他的都默认,然后提交,如下图:

    wKioL1bG9AiRHwZ4AAJn8fkrJL8395.jpg

    此时资源(vip)已经添加成功,如下图:

    wKiom1bG9MuTMq8AAAHdstKpGiI177.jpg

    此时可以在node1上执行 #crm_mon -1 查看vip运行在哪个节点上,如下图:

    wKioL1bG9gmQ77vSAADkEC5OxFA564.jpg

    到此,vip资源已经添加成功,我们可以测试节点中出现故障,vip资源怎么转移的了。


  1. 集群中只有两个节点的情况,当其中一个节点出问题了,vip如何转移的

    刚刚上图发现vip资源运行在node1上,在node1上运行  #ip -4 a   可以发现多了一个ip地址,如下图:

     wKioL1bG95riDnESAAEx9vabZEs821.jpg

  此时在物理机上ping 192.168.100.100是正常通信的。

  将node1关机,vip自动转移到node2,vip的地址依然能ping通,证明两个节点只要有一个正常,集群 就能正常,如下图:

     wKioL1bG-EWhnOXNAAEI1XGOEM0178.jpg
2.当集群中有三个节点的时候,有一个或者两个节点出现问题

    首先我们需要添加一个节点,在物理机上新建一个kvm虚拟机node3,在node3上运行如下:

    #yum install pcs -y

    #systemctl enable pcs

    #systemctl start pcs

    #echo redhat | passwd --stdin hacluster

    在node1上运行 #pcs cluster stop --all   关闭集群,如下图所示:

    wKioL1bG-mPhq_eyAACvwtcG1Qw040.jpg

    在node1,node2,node3上运行如下:

    #pcs cluster auth node1 node2 node3

    在node1中添加node3节点,运行 #pcs cluster node add node3

    在node1中启动集群,运行 #pcs cluster start --all

    设置集群开机自启动,运行 #pcs cluster enable --all

    此时集群中已经成功加入了node3节点,如下图所示:

    wKiom1bG-ybSp1_0AAD99Zt05s0575.jpg

    如何测试,和两个节点的集群一样,经测试正常情况下符合最上面的公式。

    在集群中删除节点:#pcs cluster node remove node3


    刚刚测试了每个节点有一张票(vote)的情况,可以配置成一个节点有多于

    一张票(vote)的情况:

    1.先关闭集群:#pcs cluster stop --all

    2.修改节点的vote值,在node1上编辑:#vim /etc/corosync/corosync.conf  ,在需要添加vote值得节点的node{ }中加入q uorum_vote:3  ,如下图所示:

    wKioL1bKfDWSjYwuAAD-Mgy4OL8961.jpg

    在node1上执行:#pcs cluster sync   将刚刚修改的配置文件同步到其他的节点。

    然后查看一下每个节点的vote值:#corosync-quorumtool -l  此时发现node3的vote值已经更改为3了,如下图所示:

    wKiom1bKf8Lhs9HuAACKr7i0cak295.jpg

    注:为了方便测试,我们有时候需要将资源(例如vip)从一个节点转移到另一个节点,使用命令:# pcs resource move vip node1   ,如下图所示,原来vip在node1上,我将vip移动到node2上运行:

    wKiom1bKgQXQHbUUAAGnWTrSBbE658.jpg

    如何测试,和两个节点的集群一样,经测试正常情况下符合最上面的公式。



    如果不想让集群遵守上面的公式,不想收到quorum的影响,执行如下操作:

    #pcs property list --all|grep quorum  查看quorum的状态

    #pcs property set no-quorum-polity=ignore  忽略quorum

    如下图所示:

    wKioL1bKgu-wm1HYAAB_Ql-hQHg122.jpg

    此时集群不受quorum的限制


模拟脑裂现象:

    我们只使用2个节点的集群,包括node1和node2,发现vip运行在node1,如下图:

    wKioL1bKhHqDnx14AAHdYTj4Ypw853.jpg

    使用 #ifconfig eth0 dwon  暂停node1中的网卡,此时node1认为网卡是正常工作的

     此时node1和node2都认为自己没有问题,认为对方出现问题,查看集群状态出现如下图所示:

    wKiom1bKqSKz6AWuAAOo9cB-QNM063.jpg

    这时脑裂现象就出现了,这是我们不想看到的,所以就要使用fence来控制。

    1.在宿主机,node1,node2安装fence  

    #yum install fence* -y

    #systemctl enable fence_virtd

    #systemctl start fence_virtd

    2.在宿主机做如下操作

    #mkdir /etc/cluster

    #dd if=/dev/zero  of=/etc/cluster/fence_xvm.key bs=4k count=1 创建一个key,一会配置fence时候用

    #fence_virtd -c   开始配置fence,所有的都默认,就接口改为宿主机对应的接口virbr1

    至此,宿主机成功配置为fence

    3.将宿主机中的key复制到node1和node2中

    #scp node:/etc/cluster/fence_xvm.key node1:/etc/cluster

    #scp node:/etc/cluster/fence_xvm.key node2:/etc/cluster

    手动尝试给fence发命令,让node1重启

    #fence_xvm -o reboot -H node1

    3.手动测试成功,在集群中添加一个fence

    添加fence,需要将stonith打开,#pcs property set stonith-enabled=true

    宿主机中,#firefox https://node1:2224

    点击fence devices,TYPE:fence_xvm     Name:fence_test1    Advance中pcmk_host_list:node1,node2  ,如下图所示:

    wKiom1bKvIWCaeeRAAHrTA9E5_A547.jpg

    至此,fence配置成功,在任何一台节点上运行:#ifconfig eth0 down 暂停网卡,不会出现脑裂,直接会将有问题的节点重启。


   至此Day 2的课程总结完毕。