一、高可用集群基本概念

  什么是高可用技术呢?在生产环境中我既要保证服务不间断的服务又要保证服务器稳定不down机,但是异常还是会发生,比如说:服务器硬件损坏...导致服务器down机,我该如何保证服务器down机后继续提供服务呢?这时我就应该请出高可用技术来帮忙了,当我们的服务器发生故障后不能继续时,高可用集群技术解决将业务及服务自动转移至其他主机服务器上继续服务,保证服务架构不间断运行。


高可用集群的架构层次:

后端主机层: 这一层主要是正在运行在物理主机上的服务。
2.Message layer: 信息传递层,主要传递心跳信息
2.Cluster Resources Manager(CRM): 集群资源管理器层,这一层是心跳信息传递层管理器。用于管理信条信息的传递和收集
3.Local Resources Manager(LRM): 本地资源管理器层, 用于对于收集到的心跳信息进行资源决策调整。是否转移服务等等
4.Resource Agent(RA):资源代理层,这一层主要是具体启动或停止具体资源的脚本。遵循{start|stop|restart|status}服务脚本使用格式


wKiom1eOxp3DhWZXAACybb-1as4723.png


各层次实现的软件和对应关系
1.Message layer层:
  1)heartbeat v1
  2)heartbeat v2
  3)heartbeat v3
  4)(OpenAIS)corosync
  5)cman

2.CRM层
1)heartbeat v1:
    使用文本配置接口haresources

2)heartbeat v2:
    通过一个crmd服务来实现配置,各节点都需要运行crmd服务,并且使用crmsh或者heartbeat-gui来进行配置

3)heartbeat v3: heartbeat + pacemaker + cluster-glue
    pacemaker: 集群资源管理器服务

    CLI: crm(SuSE), pcs(redhat)

    GUI: hawk, LCMC, pacemaker-mgmt

    cluster-glue: 可以做为中间粘合层,使用其他资源管理器例如crmsh

4)cman:
    使用rgmanager(resource group manager)实现管理, 具有Failover Domain故障转移域这一特性

    也可以使用RHCS(Redhat Cluster Suite)套件来进行管理: Conga的全生命周期接口

5)corosync:
    使用rgmanager或者pacemaker

3.LRM层通常和CRM层在实现上是通过CRM的一个组件实现

4. RA层
    1)heartbeat legacy: heartbeat的传统类型
    2)LSB:/etc/rc.d/init.d/*
    3)OCF(Open Cluster Framework):有提供商提供,有pacemaker,linbit
    4)STONITH: 用来联合硬件设备工作,可以把故障机电源强制关闭。

5. keepalive的组合: keepalive不同于上面所述的重量级构架,比较独特使用vrrp接口实现,配置简单轻量级。通常与一下服务同时使用
    1)keepalive + ipvs
    2)keepalive + haproxy


RHEL OR CentOS高可用集群解决方案:

1. RHEL(CentOS)5:
    1) 自带: RHCS(cman+rgmanager)
    2) 选用第三方:corosync+pacemaker, heartbeat(v1或v2), keepalived

2. RHEL(CentOS)6:
    1) RHCS(cman+rgmanager)
    2) corosync+rgmanager
    3) cman+pacemaker
    4) heartbeat v3 + pacemaker
    5) keepalived

应用方式:
    1) 做前端负载均衡器的高可用:keepalived
    2) 做大规模的高用集群:corosync(cman)+pacemaker

资源隔离:解决资源征用问题
1. 场景一:

    当集群中分裂出两组子集群,并且两个子集群之间并不能通信时, 两个子集群会发生资源征用。如果两集群同时征用后端存储系统,则会造成灾难性的文件系统崩溃。

    为了解决此问题,集群系统引入了投票机制,只有拥有半数以上合法票数的集群才能存活,否则退出集群系统。

    votes: 投票权

    total: 总票数

    quarum: 满足法定人数,半数以上

2. 场景二:

    如果集群为偶数时,如果集群分裂,两边可能都掌握相等的票数,因此集群系统不应该为偶数,如果是偶数则需要一个额外的ping节点参与投票。

3. 当分裂的票数不足集群退出集群系统后,为了保证它们永远不会征用资源需要STONITH机制来进行资源隔离。

    STONITH具体来说,就是通过硬件设备,使得退出的主机重启或者关机。或者通过交换机阻断推出集群主机的向外通信和资源通信网络.


-----如下图所示:


wKioL1eO5Byh2CQbAAEwyre6EaI209.png


HA集群的工作模型:
   1. A/P: two node: 主被模型,要借助于ping node 工作

   2. N-M: N个节点M个服务, N>M, 活动节点为N, 备用节点为N-M

   3. N-N: N个节点N个服务, N节点都有服务,如果一个坏了,会有一个节点运行多个服务

   4. A/A: 双主模型,两个节点都是活动的。两个节点运行两个不同的服务。也可以提供同一个服务,比如ipvs, 前端基于DNS轮询。

资源转移的限定方式:

   1. rgmanager:

       failover domain: 故障转移域,设定一个资源只能在哪些主机上面转移

       priority: 设定,在一个转移域中,哪些主机优先被转移资源

   2. pacemaker: 通过资源约束,和粘性来限定资源转移方式。

   资源黏性: 如果两个节点倾向性位置约束一致,资源对哪个节点粘性为正值,则留在哪个节点。

   资源约束(3种类型):

   位置约束:资源更倾向于哪个节点上;通过一个数值来表示。

       1) inf: 无穷大

       2) n: 倾向于运行在某节点

       3) -n: 倾向于离开某节点

       4) -inf: 负无穷,如果所有节点全不可选,只能在此节点。

    排列约束:资源运行在同一节点的倾向性;

       1) inf: 两者永远在一起

       2) -inf: 两者永远不再一起

    顺序约束:资源启动次序及关闭次序;

        例子:如何让web service中的三个资源,vip, httpd, filesystem运行在同一节点

        1. 排列约束,说明三个在一起可能性inf

        2. 资源组(resource group), 三个资源定义在一个组内,然后这个组决定在某一个节点上启动

        3. 定义顺序约束,保证启动顺序,vip–filesystem–httpd

     对称性与非对称性:

                    对称性: 默认所有节点都能转移资源。

                    非对称性; 有些节点不能转移资源。

如果节点不再成为集群节点成员时,如何处理运行于当前节点的资源:

        stoped:直接停止服务

        ignore: 忽略,以前运行什么服务现在还运行什么。

        freeze:事先建立的连接,接续保持,不再接收新的请求。

        suicide: kill掉服务。

    一个资源刚配置完成时,是否启动。

        target-role: 目标角色,可以为启动,也可以为不启动。

资源代理类型(RA):

        heartbeat legacy: 传统类型

        LSB: /etc/rc.d/init.d/ 下面的服务脚本

        OCF:

        STONITH: 专门用来实现资源隔离的

资源类型:

        primitive, native : 主资源,只能运行于一个节点。

        group: 组资源

        clone: 克隆资源,所有节点都运行的资源,首先是主资源。

        通常为STONITH资源, Cluster filesystem, 分布式锁

            1) 最多运行的最大数。 总clone数

            2) 每一个节点上最多运行几个。

           master/slave: 主从资源内容,只能克隆两份,主的能读能写,从的不能做任何操作。


二、配置heartbeat2基于haresource配置实现http高可用集群服务

集群环境如下:

节点数:3 分别为:node1 node2 node3

node1:172.16.100.6 node1.samlee.com

node2:172.16.100.7 node2.samlee.com

node3:172.16.100.8 node3.samlee.com

vip:172.16.100.1

nfs:172.16.100.9 nfs.samlee.com

timeserver:172.16.100.10 time1.samlee.com

集群架构图如下所示:

wKiom1ePHP2RTNEEAAEi3PvnOiI318.png


配置前准备:

1.节点名称:集群每个节点的名称都得能互相解析, 保证/etc/hosts中主机名的正反解析结果必须跟“uname -n”的结果保持一致。
2.时间必须得同步,使用网络时间服务器同步时间,可以使用ntpd服务实现。
3.为方便起见:各节点间能基于ssh密钥认证通信。

配置过程如下:

(1)配置NFS共享文件服务器

--配置资源服务器与节点之间名称互相解析
# vim /etc/hosts
172.16.100.6 node1.samlee.com node1
172.16.100.7 node2.samlee.com node2
172.16.100.8 node3.samlee.com node3
172.16.100.9 nfs.samlee.com nfs
172.16.100.10   time1.samlee.com time1

--配置NFS主机名
# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=nfs.samlee.com

--搭建NFS文件服务
# mkdir -pv /web/htdocs
# vim /etc/exports 
/web/htdocs    172.16.0.0/16(ro)    

--创建共享访问文件
# echo "nfs server" >> /web/htdocs/index.html
# service nfs start

--测试NFS
# showmount -e 172.16.100.9
Export list for 172.16.100.9:
/web/htdocs 172.16.0.0/16

--设置5分钟自动同步时间
# crontab -e
*/5 * * * * /sbin/ntpdate 172.16.100.10 &> /dev/null

(2)配置时间服务器:用于同步节点之间时间

--配置资源服务器与节点之间名称互相解析
# vim /etc/hosts
172.16.100.6 node1.samlee.com node1
172.16.100.7 node2.samlee.com node2
172.16.100.8 node3.samlee.com node3
172.16.100.9 nfs.samlee.com nfs
172.16.100.10   time1.samlee.com time1

--配置timeserv主机名
# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=time1.samlee.com

--安装ntp server
# yum -y install ntp
--修改ntp.conf配置文件
vim /etc/ntp.conf
--第1种配置:允许任何IP的客户机都可以进行时间同步(这里我们选用第1种)
#restrict default kod nomodify notrap nopeer noquery
restrict default modify notrap
--第2种配置:只允许172.16.0.0
在#restrict -6 default kod nomodify notrap nopeer noquery(表示默认拒绝所有IP的时间同步)之后添加下行:
restrict 172.16.0.0 mask 255.255.0.0 nomodify notrap

--启动NTP服务
# service ntpd start

--加入开机自启动服务列表中
# chkconfig --level 35 ntpd on
ntpd启动后,客户机要等几分钟再与其进行时间同步,否则会提示“no server suitable for synchronization found”错误。

(3)配置集群节点----安装heartbeat2, 由于heartbeat-pils在CentOS 6.5 后已经被cluster-glue取代了,因此需要手动解决依赖关系。

node1节点配置:

--配置资源服务器与节点之间名称互相解析
# vim /etc/hosts
172.16.100.6 node1.samlee.com node1
172.16.100.7 node2.samlee.com node2
172.16.100.8 node3.samlee.com node3
172.16.100.9 nfs.samlee.com nfs
172.16.100.10   time1.samlee.com time1

--配置NFS主机名
# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node1.samlee.com

--配置node1 node2 node3 nfs time1主机之间双机互信
# ssh-keygen -t rsa -P ''
# ssh-copy-id -i .ssh/id_rsa.pub root@node2.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@node3.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@nfs.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@time1.samlee.com
--测试
# ssh node2.samlee.com 'date';date
# ssh node3.samlee.com 'date';date
# ssh nfs.samlee.com 'date';date
# ssh time1.samlee.com 'date';date

--安装heartbeat
--解决依赖关系
# yum -y install perl-TimeDate net-snmp-libs libnet PyXML
# yum -y install libnet-1.1.6-7.el6.x86_64.rpm 
--安装heartbeat主要组件
# rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm

--设置5分钟自动同步时间
# crontab -e
*/5 * * * * /sbin/ntpdate 172.16.100.10 &> /dev/null

--配置heartbeat实现web服务高可用:
# yum -y install httpd
# echo "<h1>node1.samlee.com</h1>" >> /var/www/html/index.html
# service httpd start
# service httpd stop
# chkconfig httpd off
# cp -p /usr/share/doc/heartbeat-2.1.4/{authkeys,ha.cf,haresources} /etc/ha.d/

node2节点配置:

--配置资源服务器与节点之间名称互相解析
# vim /etc/hosts
172.16.100.6 node1.samlee.com node1
172.16.100.7 node2.samlee.com node2
172.16.100.8 node3.samlee.com node3
172.16.100.9 nfs.samlee.com nfs
172.16.100.10   time1.samlee.com time1

--配置NFS主机名
# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node2.samlee.com

--配置node1 node2 node3 nfs time1主机之间双机互信
# ssh-keygen -t rsa -P ''
# ssh-copy-id -i .ssh/id_rsa.pub root@node1.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@node3.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@nfs.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@time1.samlee.com
--测试
# ssh node1.samlee.com 'date';date
# ssh node3.samlee.com 'date';date
# ssh nfs.samlee.com 'date';date
# ssh time1.samlee.com 'date';date

--安装heartbeat
--解决依赖关系
# yum -y install perl-TimeDate net-snmp-libs libnet PyXML
# yum -y install libnet-1.1.6-7.el6.x86_64.rpm 
--安装heartbeat主要组件
# rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm

--设置5分钟自动同步时间
# crontab -e
*/5 * * * * /sbin/ntpdate 172.16.100.10 &> /dev/null

--配置heartbeat实现web服务高可用:
# yum -y install httpd
# echo "<h1>node2.samlee.com</h1>" >> /var/www/html/index.html
# service httpd start
# service httpd stop
# chkconfig httpd off
# cp -p /usr/share/doc/heartbeat-2.1.4/{authkeys,ha.cf,haresources} /etc/ha.d/


node3节点配置:

--配置资源服务器与节点之间名称互相解析
# vim /etc/hosts
172.16.100.6 node1.samlee.com node1
172.16.100.7 node2.samlee.com node2
172.16.100.8 node3.samlee.com node3
172.16.100.9 nfs.samlee.com nfs
172.16.100.10   time1.samlee.com time1

--配置NFS主机名
# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node3.samlee.com

--配置node1 node2 node3 nfs time1主机之间双机互信
# ssh-keygen -t rsa -P ''
# ssh-copy-id -i .ssh/id_rsa.pub root@node1.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@node2.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@nfs.samlee.com
# ssh-copy-id -i .ssh/id_rsa.pub root@time1.samlee.com
--测试
# ssh node1.samlee.com 'date';date
# ssh node2.samlee.com 'date';date
# ssh nfs.samlee.com 'date';date
# ssh time1.samlee.com 'date';date

--安装heartbeat
--解决依赖关系
# yum -y install perl-TimeDate net-snmp-libs libnet PyXML
# yum -y install libnet-1.1.6-7.el6.x86_64.rpm 
--安装heartbeat主要组件
# rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm

--设置5分钟自动同步时间
# crontab -e
*/5 * * * * /sbin/ntpdate 172.16.100.10 &> /dev/null

--配置heartbeat实现web服务高可用:
# yum -y install httpd
# echo "<h1>node3.samlee.com</h1>" >> /var/www/html/index.html
# service httpd start
# service httpd stop
# chkconfig httpd off
# cp -p /usr/share/doc/heartbeat-2.1.4/{authkeys,ha.cf,haresources} /etc/ha.d/


heartbeat配置文件有以下三个:

1、密钥文件:600,authkeys
2、heartbeat服务的配置ha.cf
3、资源管理配置文件haresources

配置heartbeat认证密钥文件

# openssl rand -hex 8
f1c99c892775d3e9

# vim /etc/ha.d/authkeys 
auth 1
1 sha1 f1c99c892775d3e9 

Tips:注意两行中的数字1是相对应的,如果修改为其它数字,两行要同时修改。

--修改文件权限为600,否则heartbeat不会让你启动的
# chmod 600 /etc/ha.d/authkeys

配置heartbeat核心配置文件

# vim /etc/ha.d/ha.cf 
logfile    /var/log/ha-log
logfacility    local0
keepalive 1000ms
deadtime 30
warntime 10
udpport    694
mcast eth0 225.0.8.1 694 1 0    ##使用组播传递心跳信息
auto_failback on
node    node1.samlee.com
node    node2.samlee.com
ping 172.16.0.1
compression    bz2
compression_threshold 2

配置集群资源文件

# vim /etc/ha.d/haresources 
node1.samlee.com IPaddr::172.16.100.1/16/eth0 httpd
注意:node1.samlee.com必须与uname -n所显示内容相同,172.16.100.1为VIP,即客户端访问的IP地址,httpd即指明高可用所针对的服务


同步配置文件及集群资源文件至node2\node3节点上:

# scp -p /etc/ha.d/{authkeys,haresources,ha.cf} node3:/etc/ha.d/
# scp -p /etc/ha.d/{authkeys,haresources,ha.cf} node2:/etc/ha.d/

启动heartbeat服务:

# service heartbeat start
# ssh node2 'service heartbeat start
# ssh node3 'service heartbeat start

测试如下:

(1)第一次测试:

wKiom1eQQQ3Dd8H6AADh-16hlfE207.jpg

(2)第二次访问

使用脚本使node1节点变成备节点--测试节点异常--模拟资源转移

# /usr/lib64/heartbeat/hb_standby

wKiom1eQQ2HxyBLCAADydiKdl3Q957.jpg

(3)第三次访问

使用脚本使node3节点变成备节点--测试节点异常--模拟资源转移

# /usr/lib64/heartbeat/hb_standby

wKioL1eQhLvg_6d2AADV3F_1kVQ734.jpg



配置集群服务使得三个node共享后端nfs文件系统的资源,导出/web/htdocs文件夹。

配置集群资源文件:

# vim /etc/ha.d/haresources
node1.samlee.com IPaddr::172.16.100.1/16/eth0 Filesystem::172.16.100.9:/web/htdocs::/var/www/html::nfs httpd

#同步配置文件及资源文件至其他两个节点
# scp -p /etc/ha.d/{authkeys,haresources,ha.cf} node2:/etc/ha.d/
# scp -p /etc/ha.d/{authkeys,haresources,ha.cf} node3:/etc/ha.d/

wKiom1eQl0KRdYC-AAC9P57SmaI673.jpg




三、配置heartbeat2使用gui图形界面管理

(1)修改配置启动crm管理

--停止heartbeat各集群节点配置
# service heartbeat stop
# ssh node2 'service heartbeat stop'
# ssh node3 'service heartbeat stop'

--修改ha.cf启动crm管理
#vim /etc/ha.d/ha.cf
crm    on

--通过脚本ha内置脚本同步配置文件
# /usr/lib64/heartbeat/ha_propagate

(2)安装heartbeat gui图形(各个集群都要安装)

# rpm -ivh heartbeat-gui-2.1.4-12.el6.x86_64.rpm

(3)启动heartbeat服务并配置gui图形环境

--启动各集群节点heartbeat服务
# service heartbeat start
# ssh node2 'service heartbeat start'
# ssh node3 'service heartbeat start'

--检查gui监听的5560端口(如果5560端口未监听,打开gui工具将会报错)
# ss -tnl | grep 5560
LISTEN     0      10                        *:5560                     *:*

--设置集群管理用户密码(hacluster):这个用户是我们在安装gui工具时自动创建,设置密码方便我们更安全的管理集群工作
# passwd hacluster
# ssh node2 'passwd hacluster'
# ssh node3 'passwd hacluster'

--进入gui图形界面
# hb_gui &

测试如下:

wKiom1eRbvHC-9_EAAJaLYRcEZc367.jpg


wKiom1eRh4ui_L-6AANxbhxwftw554.jpg


案例一:主\备模式搭建web高可用集群--使用GUI图形模式配置(独立资源类型)

(1)配置资源VIP:webip 如下图所示:wKiom1eStp_CkdiGAAO4nVCVz1w800.jpg

(2)配置资源webserver 如下图所示:

wKioL1eRvyvSogdaABhRmEkMC1k166.gif

资源配置完成后启动资源,发现资源webip和webserver运行在不同的节点上,应该怎么解决这个问题呢?

wKioL1eRwDXQe06tABWADy_iDBk066.gif

定义排列约束Colocations使用webserver资源跟随webip资源启动,保证webserver资源和webip资源运行在同一个节点上,设置如下图:

wKiom1eSuQ-iaI2cAARcx2QlktA410.gif

定义位置约束Locations使服务及资源倾向于运行指定服务节点服务上,下面定义webip资源倾向运行于node1节点上

wKioL1eSwDSA55qnAAeRUvHSGzA508.gif

定义顺序约束Orders配置资源之间启动顺序

wKiom1eSvxGTooakAAQHb8vV1j4810.gif

查询VIP位置:

# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:c1:18:36 brd ff:ff:ff:ff:ff:ff
    inet 172.16.100.7/16 brd 172.16.255.255 scope global eth0    --VIP位置信息
    inet 172.16.100.2/16 brd 172.16.255.255 scope global secondary eth0
    inet6 fe80::20c:29ff:fec1:1836/64 scope link 
       valid_lft forever preferred_lft forever


案例二:主\备模式搭建web高可用集群+NFS共享存储--使用GUI图形模式配置(组资源类型)

(1)添加webservice组并配置资源VIP:webip 如下图所示:

wKioL1eTN4WhPNoIAAjNytIUbDE235.gif

(2)添加NFS共享存储资源webstore资源,共享主页文件文件。配置如下图:

wKioL1eTO_njZoFaAAQsc7S_9aw871.gif

(3)配置资源webserver 如下图所示:

wKiom1eTPW7yPC3-AAXBKErM3GA635.gif

最后测试如下:

wKioL1eTQEKTzqmsAAciob1ld7s753.gif


配置stonith设备,如下图所示:

wKiom1eUiNOjb82yAAbL7zrwPt0475.gif

以上是heartbeat应用详解(一)所有内容。