corosync.conf

##totem定义集群内各节点间是如何通信的,totem本是一种协议,专用于corosync专用于各节点间的协议,协议是有版本的
totem {
##版本号
        version: 2
##安全认证on|off,使用corosync-keygen命令生成密钥
        secauth: on
##用于安全认证开启的线程,0为不基于线程模式工作
        threads: 0
##接口设置
        interface {
##环数量,如果一个主机有多块网卡,避免心跳信息回流
            ringnumber: 0
##多播监听的网络地址(本机网段为192.168.0.0/24)
            bindnetaddr: 192.168.0.0
##多播地址,可设置为239.255.x.x
            mcastaddr: 239.165.17.17
##多播地址监听的端口
            mcastport: 5405
##生存时间为1
            ttl: 1
                  }
      }
##定义日志信息  
logging { 
##是否记录fileline    
        fileline: off
##是否将日志发往标准错误输出(屏幕)
        to_stderr: no
##是否记录在日志文件中
        to_logfile: yes
##日志文件目录
        logfile: /var/log/cluster/corosync.log
##是否将日志发往系统日志
        to_syslog: no 
##调试
        debug: off
##是否打开时间戳
        timestamp: on
##是否包含AMF组件的日志信息
        logger_subsys {
                subsys: AMF
                debug: off
        }
}
service {
        ver:    0
        name:   pacemaker
##是否让pacemaker独立启动mgmtd进程(可省略)
        use_mgmtd:      yes
}
##指明运行插件的用户与组(可省略)
aisexec{
        user:  root
        group:  root
}

 

corosync集群的选举算法

集群中的概念有:

  1. subcluster,子集群。集群中发生了脑裂,分裂成若干个子集群,每个子集群众多节点无法与其他子集群的节点联系
  2. fencing,栅栏。值像栅栏一样,将子集群与资源隔离开,使子集群无法访问资源
  3. quorum,法定票数,只有达到法定票数的子集群才能继续工作,无法达到法定票数的子集群备栅栏隔离开
  4. vote,投票,每个节点拥有一票,计算某个子集群中的总票数,就是这个子集群中有多少个节点。

法定票数=大于集群节点总数的一半的最小整数。例如,节点总数是3,节点总数的一半数1.5,大于1.5的最小整数是2,即法定票数是2,。如果节点是4,则发送票数是3.

假如有一个9个节点的集群:{a0, a1, a2, a3, a4, a5, a6, a7, a8},则法定票数是5,若因为网络问题发生脑裂,以下是所有可能性的其中几种:

可能性一:{a0, a1, a2}, {a3, a4, a5}, {a6, a7, a8},分裂成了3个子集群,则每个子集群的票数是3、3、3,都小于法定票数5,不满足法定票数的子集群被栅栏隔离,全部子集群都被隔离,整个集群处于无法工作的状态。

可能性二:{a0, a1, a2, a3, a4}, {a5, a6, a7, a8},分裂成了2个子集群,则每个子集群的票数是5、4,只有一个子集群的票数达到法定票数5,该集群得以继续工作,不满足法定票数的子集群被栅栏隔离,整个集群可以继续工作。

可以看出,一个集群中,能够达到法定票数的子集群最多只能有一个。

对于集群中一些不支持并发的资源,如磁盘资源,在发生脑裂时,如果不使用栅栏,每个子集群都具有写入磁盘资源的权限,这将破坏磁盘数据。

注意:

  脑裂概念和子集群中的节点不可用的概念不要混淆起来。例如法定票数=3,子集群{a0, a1, a2},达到了法定票数,能够继续工作,但a2节点可能已经处于不可用状态,但a2还是属于这个子集群。子集群是一个逻辑概念,其实子集群{a0, a1, a2}相当于a0只知道a1、a2的存在,a1只知道a0、a2的存在,a2只知道a0、a1的存在。即使a2节点处于不可用状态,只要满足前的“知道存在”关系,a2就还在这个子集群中。子集群中的资源还是能在可用节点上转移。

对于只有2个节点的集群,法定票数是2,当发生脑裂时,两个子集群的票数都是1,不满足法定票数,此时整个集群都无法工作。这也是官网推荐的最小集群节点数量为3的原因。个人认为,如果不存在不能并发的资源,其实脑裂也无妨。如果想两个节点都能工作,编辑corosync.conf,在quorum语块中显示指定“two_node: 1”:

quorum {
    provider: corosync_votequorum
    two_node: 1
    }

如果超过2个节点加入集群,two_node自动失效。

posted @ 2019-12-11 18:38  百鬼之主  阅读(927)  评论(0编辑  收藏  举报