高可用的解决方案keepalived只是提供了最简单的高可用功能,真正高级的功能keepalived很难完成。openAIS规范提供完善的解决方案,但是很重量级很多功能考虑的很全面、很细致,了解这些我们才可以更加深入的理解高可用的完整的体系,当遇到特殊的高可用场景我们必须使用这些方案才可以解决。

OpenAIS规范的解决方案

     这个规范一直迭代到今天,形成的完整的体系如图1.1

corosync和pacemaker高可用mariadb和haproxy_第1张图片

图1.1

     既然多个主机要组成一个集群,那么就要有一个软件帮助多个主机间实现心跳信息通告,这个实现通告的在OpenAIS规范中被定义为message layer。

     整个集群的服务管理需要一个软件,被规范定义为cluster resource manager集群资源管理。这只是集群资源管理,但是真正到执行操作的时候需要一个可以管理主机服务的接口,这个接口软件被规范定义为location resource manager本地资源管理。这一层才是真正执行操作的,产生这一层的原因基本上所有的服务设计时都没考虑被高可用,但是我们有需要操控这些服务只好制造一个可以调用其他服务器的管理层。

     message layer常用组件有:heartbeatv1,2,3,corosync(suse研发),cman(redhat)

     cluster resource manager常用组件有:pacemaker(Redhat),heartbeatv1,2

     管理接口常用组件:crmsh(suse),pcs(Redhat)

     网页管理接口:hawk, LCMC, pacemaker-mgmt

    

centos6还有RHCS

     

高级功能

之所以说keepalived的功能简单是因为以下这些

quorum投票功能

法定票数(大于总票数的一半也可以设定不用大于一半) ,用来判定集群分裂的场景中,某些节点是否可以继续以集群方式运行;

当偶数个机器组成的机器分裂,投票可以借助仲裁设备:

ping node

ping node group

quorum disk: qdisk 

without quorum之时,如何采取对资源管控的策略:

                stopped

                ignore

                freeze

                suicide

资源隔离机制

当计算机故障,防止服务抖动和或者防止同时向共享存储写数据导致存储破坏

     节点级别:STONITH

电源交换机

服务硬件管理模块

虚拟化软件关闭虚拟机

     资源级别:

          共享存储器禁止写数据

资源粘性

资源倾向于留在当前的分数(-oo, +oo)

资源约束

          位置约束:资源对某节点运行的倾向性(-oo, +oo)

                    inf: 正无穷

                    -inf: 负无穷

                    n:

                    -n:

          排列约束:定义资源彼此间的倾向性(是否在一起)

                    inf:

                    -inf:

                    n, -n

          顺序约束:属于同一服务的多个资源运行在同一节点时,其启动及关闭的次序约束;

                    A --> B --> C

                    C --> B --> A

资源组组:组内资源将会组内顺序启动和关闭

RA

resource Agent真正管理service的工具

     大致有一下分类lsb,ocf,service,stonith,systemd

     由于资源可以这样灵活的组合配置,那么我们可以打造一个极端的应用场景,五台计算机提供四种不同的服务,我们把五台计算机直接组成一个集群,根据资源粘性把四个服务分布运行在不同的计算机上,然后留一台计算机做给其他四个计算机做backup。不仅如此,当五台计算机中两台计算机宕机,我们可以让四种服务运行在三台计算机之上。

corosync和pacemaker

实践

     目前有两个比较常用的配置接口一个是crmsh一个pcs,这里我首先使用crmsh构建一个mariadb高可用集群,然后使用pcs构建一个haproxy集群,这里都使用双节点。如图1.2

corosync和pacemaker高可用mariadb和haproxy_第2张图片

图1.2

     如图vip172.16.29.11在两个node间流转

准备配置

node1的配置

#下载crmsh的yum源的配置文件,以为crmsh没有被被收录到源中
wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/network:ha-clustering:Stable.repo -P /etc/yum.repos.d/
yum install pacemaker crmsh mariadb-server haproxy pcs -y
vim /etc/corosync/corosync.conf
#配置文件事例
totem {
    version: 2
    crypto_cipher: aes256
    crypto_hash: sha1
    interface {
        ringnumber: 0
#集群主机所在的网段
        bindnetaddr: 172.16.0.0
#多播地址
        mcastaddr: 239.255.101.99
        mcastport: 5405
        ttl: 1
    }
}
logging {
    fileline: off
    to_stderr: no
    to_logfile: yes
    logfile: /var/log/cluster/corosync.log
    to_syslog: no
    debug: off
    timestamp: on
    logger_subsys {
        subsys: QUORUM
        debug: off
    }
}
quorum {
    provider: corosync_votequorum
}
#配置组成集群的两个主机
nodelist {
    node {
        ring0_addr: 172.16.29.10
        nodeid: 1
    }
    node {
        ring0_addr: 172.16.29.20
        nodeid: 2
    }
}
#使用这个命令生成corosync通信的秘钥
corosync-keygen
vim /etc/hosts
#添加域名解析
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.29.10 node1.org node1
172.16.29.20 node2.org node2
#主机间使用秘钥通信
ssh-keygen -t rsa #这个命令一路按回车就可以了
ssh-copy-id -i .ssh/id_rsa.pub node2
#复制配置文件到node2,这一步需要在node2安装pacemaker后执行
scp -p authkey corosync.conf node2:/etc/corosync/
scp /etc/hosts node2:/etc/
#开启服务,并授权用户登录,创建数据库jim
systemctl start mariadb.service
mysql < 
    

node2的配置

#下载crmsh的yum源的配置文件,以为crmsh没有被被收录到源中
wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/network:ha-clustering:Stable.repo -P /etc/yum.repos.d/
yum install pacemaker crmsh mariadb-server pcs -y
#开启服务,并授权用户登录,创建数据库tom,两个主机的数据库故意创建不一样方便查看服务器迁移
systemctl start mariadb.service
mysql < 
    

mariadb集群服务配置

     mariadb集群服务的配置使用crmsh配置,crmsh配置的集群服务会自动同步到集群的每一个节点,同步的机制是配置信息是首先传送到DC节点,然后通告给其他节点。

crmsh的使用方法是输入crm进入交互接口然后输入配置,这个配置接口和交换机的配置接口使用类似,并且拥有强大的补全功能。具体怎么使用我不介绍了,可以使用help [command]查看帮助信息,帮助信息最底下还有事例。

crm configure #进入crm配置接口
property stonith-enabled=false #关闭stonith,因为我们没有具体的设备
property no-quorum-policy=ignore #不使用法定票数,因为我们配置的是双节点的集群,一个节点故障另一个节点拥有的票数就不会大于半数
primitive vip ocf:heartbeat:IPaddr params ip="172.16.29.11" #定义vip集群资源
primitive mariadb systemd:mariadb #定义mariadb集群资源
group dbservice vip mariadb #把vip和mariadb资源定义为组,一群两个资源运行在同一台主机之上
monitor vip 20s:20s #定义vip的监控,每20s监控一次,延迟20s
monitor mariadb 20s:20s
commit #保存配置,并使其生效

haproxy集群服务配置

     haproxy集群配置使用pcs,pcs不是交互式管理接口,我们可以直接输入管理命令管理

node1的配置

systemctl start pcsd.service #开启pcsd进程
systemctl enable haproxy.service #设置haproxy开机启动,这一项是pacemaker控制systemd管理的服务根本
vim /etc/haproxy/haproxy.cfg #在default中添加如下内容
    stats enable
    stats hide-version
    stats uri     /ha10

node2的配置

systemctl start pcsd.service #开启pcsd进程
systemctl enable haproxy.service #设置haproxy开机启动,这一项是pacemaker控制systemd管理的服务根本
vim /etc/haproxy/haproxy.cfg #在default中添加如下内容
    stats enable
    stats hide-version
    stats uri     /ha20

集群的配置的配置

pcs resource create vip2 ocf:heartbeat:IPaddr params ip="172.16.29.12" op monitor interval=20s timeout=20 #定义vip2资源,并定义监控
pcs resource create haproxy systemd:haproxy op monitor interval=20s timeout=20 #定义haproxy资源,并定义监控
pcs constraint order set vip haproxy #使用顺序约束把vip2和haproxy绑定在一起

测试

然后我们就可以根据两台主机的ip地址情况,测试高可用情况了