使用 Corosync 和 Pacemaker 配置高可用性

所有用于提高系统或服务的可用性和增加容错能力的技术和方法都称为高可用性,例如 example 我们可以提到的故障:硬件冗余、集群、热物理(RAID 1 和 RAID 5)或软件(快照、DRBD)或危机场景(降级模式、应急计划)中的数据复制。 在一家大公司,它可以导致一个全职的责任职位。 您将在本文中看到实现此问题的一个方面的图片:确保应用服务可用性的主动/被动集群。

关于 GNU / Linux,本文测试了两个可以管理集群基础设施的软件:

  • Heartbeat 有它的证据,但它是有限的:没有超过 2 个节点的集群,没有资源管理和从一个节点切换到另一个节点的规则。
  • Corosync 和 Pacemaker:它是 Red Hat 发行版的选择,本文稍后将对其进行概述。

我们已经安装了一个由两个虚拟机 Debian Wheezy 组成的代表性模型,该虚拟机具有 4 个网络接口,运行一个 Apache 由集群管理的 IP 地址访问的服务。

下图为网络图:

eth0 和 eth1 接口是逻辑链路聚合的一部分,它们帮助集群检查其他节点的状态。 它们与网络 10.20.13.0/255.255.255.252 中的其他节点构成一个专用网络。 接口 eth2 和 eth3 是另一个逻辑聚合的一部分,它们在 192.168.1.0/24 网络的外部提供服务。

逻辑聚合(也称为绑定)提供了额外的冗余。 如果网络适配器 eth0 燃烧殆尽,车流依旧通行 eth1. 它可以配置为主动/被动模式或负载平衡模式。

这是“/etc/network/interfaces/”中vm-node1机器上的接口配置:

auto bond0
iface bond0 inet static
  address 10.20.13.1
  netmask 255.255.255.252
  bond_mode active-backup
  bond_miimon 100
  bond_downdelay 200
  bond_updelay 200
  slaves eth0 eth1
auto bond1
iface bond1 inet static
  address 192.168.1.61
  netmask 255.255.255.0
  gateway 192.168.1.1
  bond_mode active-backup
  bond_miimon 100
  bond_downdelay 200
  bond_updelay 200
  slaves eth2 eth3

以及“/etc/modprobe.d/bonding”中bonding的配置:

alias bond0 bonding 
alias bond1 bonding

vm-node2机器的网络配置与10.20.13.2中的bond0和192.168.1.62中的bond1对称。 当网络配置完成后,我们就可以处理集群了。 首先您需要在 Debian 上安装 Corosync 和 Pacemaker,您将执行以下操作:

apt-get install corosyncpacemaker

然后配置 Corosync。 它管理集群基础设施,这意味着节点的状态及其在组中的功能。 为此,我们必须生成一个用于身份验证的密钥,该密钥将由集群中的所有节点共享。 corosync-keygen 实用程序从伪随机击键生成此密钥,然后必须保护并复制到其他节点。

# generation of the key from vm-node1
corosync-keygen
mvauthkey/etc/corosync/authkey
chownroot:root/etc/corosync/authkey
chmod400/etc/corosync/authkey
 
# copy of the key to vm-node2
scp/etc/corosync/[email protected]:/etc/corosync/authkey

Corosync 提出了连接环的概念来实现节点之间的通信。 作为模型的一部分,我们定义了两个环:ring0,使用专用网络的默认通信环和 ring1,一个备用环,通过交换机与其余的流量。 Corosync 允许您根据 IP/网络掩码而不是定义 IP 地址来定义环。 这很重要,因为可以在所有节点上部署相同的配置文件而无需更改任何内容。

totem {   
    version:2    
    
    #How long before declaring a token lost(ms)   
    token:3000    

    #How many token retransmits before forming a new configuration   
    token_retransmits_before_loss_const:10    

    #How long to wait for joining messages in the membership protocol(ms)   
    join:60    

    #How long to wait for consensus to be achieved before starting a new round of membership configuration(ms)    consensus:3600    

    #Turn off the virtual synchrony filter   
    vsftype:none    

    #Number of messages that may be sent by one processor on receipt of the token   
    max_messages:20    

    #Limit generated nodeids to 31-bits(positive signed integers)   
    clear_node_high_bit:yes    

    #Disable encryption   
    secauth:off    

    #How many threads to use for encryption/decryption   
    threads:0    

    #Optionally assign a fixed nodeid(integer)   
    #nodeid:1234    

    #This specifies the mode of redundant ring,which may be none,active,or passive.   
    rrp_mode:passive    

    interface {       
        ringnumber:0       
        bindnetaddr:10.20.13.0       
        mcastaddr:226.94.1.1       
        mcastport:5405   
    }   

    interface {       
        ringnumber:1       
        bindnetaddr:192.168.1.0       
        mcastaddr:226.94.1.1       
        mcastport:5407   
     }
} 

amf {   
     mode:disabled
} 

service {   
     #Load the Pacemaker Cluster Resource Manager   
     ver:       0   
     name:     pacemaker
} 

aisexec {   
    user:  root   
    group: root
} 

logging {   
    fileline:off   
    to_stderr:yes   
    to_logfile:no   
    to_syslog:yes   
    syslog_facility:daemon   
    debug:off   
    timestamp:on   
    logger_subsys {       
          subsys:AMF       
          debug:off       
          tags:enter|leave|trace1|trace2|trace3|trace4|trace6   
    }
}

此时,集群基础设施就位,但不管理任何资源。 这是起搏器的作用。

它具有以下操作限制:

  1. 资源 (Apache 服务和集群 IP 地址)在正常情况下运行在服务器 vm-node1 上。
  2. Apache 如果我们的服务无法访问,服务和集群 IP 地址必须运行在同一台服务器上。
  3. 如果 Apache 服务在主服务器上崩溃,它切换到辅助服务器。
  4. 如果主服务器通过 Internet 网关连接,则它切换到辅助服务器。

Pacemaker 在文本模式下提供了一些实用程序来进行交互。

  • CRM 来管理所有方面的配置。
  • crm_mon 显示集群的状态。

首先我们定义全局配置。 淬火 STONITH(射击头部的另一个节点)和法定人数。 STONITH 是在另一个节点不再满足 infra 集群时杀死另一个节点的能力。 和法定人数,它不适用于 3 节以内的集群。

property stonith-enabled=false
property no-quorum-policy=ignore

我们现在可以定义我们的第一个资源:附加到活动节点的集群 IP 地址。

primitive vip ocf:heartbeat:IPaddr2 params ip=192.168.1.60 cidr_netmask=24nic="bond1"op monitor interval="10s"

那么 Apache 资源,我们想在这个模型中提供的关键服务:

primitive httpd ocf:heartbeat:apache params configfile="/etc/apache2/apache2.conf"statusurl="https://localhost/server-status"op start timeout="60s"op stop timeout="60s"op monitor timeout="20s"

的开始和停止 Apache 现在由集群管理。 因此,我们现在必须删除服务的自动启动:

update-rc.d-fremoveapache2

你会注意到这超出了一个的定义 Apache 资源。 Pacemaker STATUSURL 属性允许使用 Apache 状态页来确定摇杆。 所以不要忘记在 Apache:

<Location/server-status>    
    SetHandler server-status    
    Order deny,allow    
    Deny from all    
    Allow from 127.0.0.1
</Location>

在我们构建配置步骤时,crm_mon 返回可能在某些资源上存在一些错误,因为它无法运行。 有一个失败计数器会在出现警告时通知我们。 我们可以使用以下命令为资源 http 重置此计时器:

crm resource clean up httpd

在这个阶段,我们有一个集群地址和一个 HTTP 资源,但不一定在同一个节点上。 如果节点下降,vip 资源将切换。 如果节点掉线或者apache服务上升,httpd资源就会切换(通过URL/server-status监控)。

让我们更进一步,强制两个资源在同一个节点上运行:

colocation httpd-with-vip inf : httpd vip

我们也希望在正常情况下,资源运行在我们的主节点 vm-node1 上:

location preferred-node vip 100 : vm-node1

最后,我们添加一个比例条件。 如果节点没有通过 Internet 到达网关,我们希望将资源移动到另一个节点。为此,我们定义了一个在所有节点上运行的 ping 类型的资源(通过克隆资源的概念)。 如果活动节点没有看到网桥,则添加一个假期规则进行切换。

primitive ping-gateway ocf:pacemaker:ping params host_list="192.168.1.1"multiplier="1000"op monitor interval="10s"
clone cloned-ping-gateway ping-gateway
location vip-needs-gateway vip rule-inf:not_defined pingd or pingd lte 0

这是我们的运营模式。 我们希望我们能帮助您做到这一点。

相关阅读:

Posted in: LinuxTags: ,