heartbeat v2-GUI配置web高可用

--本文大纲
 
 
  • 前提

  • 前言

  • 实验拓扑

  • 安装相关软件

  • 配置 heartbeat(crm 资源管理器)

  • crm图形界面配置详解

  • crm配置资源(group resource)

  • crm资源约束(constraints)

  • crm资源配置总结

一、前提(前文己经提过如何设置)
1、设置主机名,要与uname -n 的名字一致,能够DNS解析
 
 
  • 此处要修改/etc/sysconfig/network中的hostname

  • 还要在/etc/hosts文件中为各节点做正向解析

2、节点间的时间必须一致

  • ntpdate

3、节点间无密码登录

#ssh-keygen -t rsa -P ''
#ssh-copy-id -i .ssh/id_rsa.pub node_name
二、前言
与1.x style不同的是,v2.x style会使用CRM来进行整个集群的管理。集群开始时,通过在各节点间选举产生一个节点成为DC(Designated Coordinator),配置应在该DC上进行,并由其分发到下面的各个节点上,其中haresource 资源管理器heartbeat v1内置的资源管理器,功能比较简单,不支持图形化管理。到了heartbeat v2时,有了更加强大的资源管理器crm,但同时为了兼容heartbeat v1,在heartbeat v2中是不兼容haresource资源管理器的配置文件haresource,所以在/etc/ha.d/haresources配置的资源都是不能使用的,所以得重新配置。需要在ha.cf中添加crm on 来开启 crm 功能,crm通过mgmtd进程监听在5560/tcp 。
注:需要启动hb_gui的主机为hacluster用户添加密码,并使用其登录hb_gui

三、实验拓扑

wKioL1NXRNWyMZ4WAAHphFV3p6Q774.jpg

四、安装相关软件
1、heartbeat 安装组件说明
  • heartbeat 核心组件  *    

  • heartbeat-devel 开发包    

  • heartbeat-gui 图形管理接口 *(这次就是用GUI来配置集群资源)

  • heartbeat-ldirectord 为lvs高可用提供规则自动生成及后端realserver健康状态检查的组件    

  • heartbeat-pils 装载库插件接口 *    

  • heartbeat-stonith 爆头接口 *

2、Xmanager Enterprise 4

wKiom1NXRTWzOPZ8AABxQWYQzNM040.jpg

五、配置 heartbeat(crm 资源管理器)

第一步、安装软件包

#yum install -y perl-TimeDate net-snmp-libs libnet PyXML
注:libnet是在epel源中,所以要下载EPEL源安装包即可
http://download.fedoraproject.org/pub/epel/6/i386/repoview/epel-release.html
下载对应的版本就可以的。
#rpm -ivh epel-release-6-8.noarch.rpm

之后就可以使用yum安装EPEL中的包了

#yum install -y libnet
#rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm  heartbeat-devel-2.1.4-12.el6.x86_64.rpm  heartbeat-gui-2.1.4-12.el6.x86_64.rpm
 
 
注:
以上步骤node4也要执行
开始配置node2

当安装完成后,查找到配置文件,拷贝到/etc/ha.d目录下

[root@essun download]# rpm -ql heartbeat-2.1.4 |grep ha.cf
 /usr/share/doc/heartbeat-2.1.4/ha.cf
进入到此目录下,将此目录下的authkeys,ha.cf拷贝到/etc/ha.d/目录下
[root@essun heartbeat-2.1.4]# cp authkeys ha.cf /etc/ha.


注解:
authkeys

集群节点的认证文件,以防有非集群内部节点进入此集群

ha.cf

heartbeat 的主配置文件

 
 

编辑authkeys

vim authkeys
#auth 1
#1 crc
#2 sha1 essun.org
# #3 md5 Hello!
auth 1
1 md5 $1$Oukjg1$aZS0Qb.PBg1Isv0cSJcxL/

修改此文件的权限为600

#chmod 600 authkeys

编辑主配置文件ha.cf

[root@essun ha.d]# grep -v "#" ha.cf |grep -v "^$"
logfile    /var/log/ha-log
keepalive 100ms
deadtime 10
warntime 4
udpport    694
mcast eth0 225.0.0.1 694 1 0
auto_failback on
node essun.node2.com
node essun.node4.com
crm on
ping 172.16.0.1
compression    bz2
compression_threshold 10

注:

crm on

开启crm功能
其余参数说明见前文

编辑完成将这两个配置文件拷贝到node4的对应目录下

[root@essun ha.d]# scp authkeys ha.cf essun.node2.com:/etc/ha.d/
The authenticity of host 'essun.node2.com (192.168.1.110)' can't be established.
RSA key fingerprint is b8:9d:cb:7b:4d:ad:c2:fb:a4:00:23:b0:f2:6b:3f:ad.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'essun.node2.com,192.168.1.110' (RSA) to the list of known hosts.
[email protected]'s password:
authkeys                                     100%  699     0.7KB/s   00:00 
ha.cf                                        100%   10KB  10.3KB/s   00:00

第二步、在node2与node4上安装http服务

#yum install -y httpd

测试服务可用性

 
 

node2

[root@essun ha.d]#echo "essun.node2.com" >/var/www/html/index.html
[root@essun ha.d]# service httpd start
Starting httpd:                                            [  OK  ]
[root@essun ha.d]# curl http://172.16.32.20
essun.node2.com

node4

[root@essun download]# echo "essun.node4.com" > /var/www/html/index.html
[root@essun download]# service httpd restart
Stopping httpd: [FAILED]
Starting httpd: [ OK ]
[root@essun download]# curl http://172.16.32.4
essun.node4.com

测试node2,node4可用后关闭http服务,禁止开机自动启动,使用crm来控制其启动与停止

[root@essun ha.d]# service httpd stop
Stopping httpd:                                            [  OK  ]
[root@essun ~]# chkconfig httpd off
第三步、在两个节点上启动heartbeat
在node2上启动 heartbeat
[root@essun ha.d]# service heartbeat start
Starting High-Availability services:
Done.
[root@essun ha.d]# ss -tnlp |grep 5560
LISTEN     0      10                        *:5560                     *:*      users:(("mgmtd",16231,10))
在node4上启动heartbeat
[root@essun ha.d]# ssh essun.node4.com "service heartbeat start"
 Starting High-Availability services:
Done.
[root@essun ~]# ss -tnlp |grep 5560
LISTEN     0      10                        *:5560                     *:*      users:(("mgmtd",1776,10))
查一下集群状态
#crm_mon
============
Last updated: Tue Apr 22 08:41:26 2014
Current DC: essun.node2.com (7188d63f-6350-4ab4-8c3e-831110e2b642)
2 Nodes configured.
0 Resources configured.
============
Node: essun.node2.com (7188d63f-6350-4ab4-8c3e-831110e2b642): online
Node: essun.node4.com (0df746b3-fdab-4625-99d2-659e9a5ef1c6): online
 
 

从上面的集群状态中我们可以看到,集群中有两个节点,分别为node2和node4状态是online全部在线,我们还可以看到,DC是node2。两个节点的资源是0,说明在我们这个集群中还没有资源。下面我们来详细的说明一下!

第四步、crm配置的方式

命令行配置:

[root@essun ~]# crm
crmadmin       crm_failcount  crm_resource   crm_uuid    
crm_attribute  crm_master     crm_sh         crm_verify  
crm_diff       crm_mon        crm_standby
图形配置:
[root@essun ~]# hb_gui
注:这次重点说这个a_c~~~~~~
前面提到了CIB,那么现在我们就去看看,CIB的文件格式
[root@essun crm]# pwd
/var/lib/heartbeat/crm
[root@essun crm]# cat cib.xml
 <cib generated="true" admin_epoch="0" epoch="6" have_quorum="true" ignore_dtd="false" num_peers="2" cib_feature_revision="2.0" crm_feature_set="2.0" ccm_transition="2" dc_uuid="7188d63f-6350-4ab4-8c3e-831110e2b642" num_updates="7" cib-last-written="Tue Apr 22 08:28:06 2014">
   <configuration>
     <crm_config>
       <cluster_property_set id="cib-bootstrap-options">
         <attributes>
           <nvpair id="cib-bootstrap-options-dc-version" name="dc-version" value="2.1.4-node: aa909246edb386137b986c5773344b98c6969999"/>
         </attributes>
       </cluster_property_set>
     </crm_config>
     <nodes>
       <node id="7188d63f-6350-4ab4-8c3e-831110e2b642" uname="essun.node2.com" type="normal"/>
       <node id="0df746b3-fdab-4625-99d2-659e9a5ef1c6" uname="essun.node4.com" type="normal"/>
     </nodes>
     <resources/>
     <constraints/>
   </configuration>
 </cib>

看到了吧,反正我是无法看得懂,还好有命令行与图形化配置。

第五步、配置crm 资源管理器

要想启用GUI配置界面,必须要为hacluster用户(heartbeat默认用户)创建一个密码(hacluster)。
[root@essun crm]# grep hacluster /etc/passwd
hacluster:x:496:493:heartbeat user:/var/lib/heartbeat/cores/hacluster:/sbin/nologin
[root@essun crm]# echo hacluster | passwd --stdin hacluster
Changing password for user hacluster.
passwd: all authentication tokens updated successfully.
注:

你想在那一个节点上进行配置,就在那一个节点上创建密码。

六、crm图形界面配置详解

启动hb_gui
#hb_gui &

wKiom1NXR5DTXzq0AAOB044yy6w024.jpg

己经启动图形了,现在我连接上去看一下效果

wKioL1NXR5XBolwoAAE4KENkaEQ490.jpg

看一下登录后的显示的界面

wKiom1NXR9myaxvjAAKihQQXjW8112.jpg

说明:
 
 
资源类型:
primitive, native: 主资源,只能运行于一个节点上
group: 组资源;
clone: 克隆资源(首先其必须是主资源);
                    参数:
                       总克隆数;

                       每个节点最多可运行的克隆数

stonith(资源隔离),cluster filesystem(依赖于分布式锁,其它进程能够看到,将不会写入操作)

master/slave: 主从资源 如DRBD(只有两份(主的可以读写,从的不能读不能写))
 
 
RA类型:( resource  class)
heartbeat legacy传统类型
LSB:位于 /etc/rc.d/init.d/*的所有程序
OCF:
STONITH
七、添加资源(组资源)
注:

在高可用Web集群中有三个资源分别为:

  • VIP

  • httpd

  • nfs

添加资源

wKioL1NXSR-COJQeAAFu8tGjEug634.jpg

增加native资源

wKiom1NXSW6w7kKLAAQehatyQSo218.jpg设置完成后点Add,结果如下

wKiom1NXSY6gghutAAGgahT-wGk625.jpg

 
 
Resources中,定义一个组,名字叫webservice,组中一条资源记录(服务)及其当前的状态

继续添加httpd服务

wKiom1NXScHztvgqAAKZ2cgmr_s917.jpg

添加后的结果如下:

wKioL1NXSbWxtwl0AAHDFV_K7dw903.jpg启动服务,测试一下效果

wKiom1NXSg-y36cbAAI_hrKcXF8146.jpg经验证,所有的资源的确运行于node2上,这次我将模拟故障后一下是不是所有的资源都会转移到node4上呢?

wKioL1NXSgjz3Y-IAAGp-0OPbBc202.jpg

看一下效果

wKioL1NXSi6hBPpyAAOB044yy6w079.jpg

 
 
资源直接切换到node4上去了,下面我在node3上做一个nfs共享存储,做一个简单的测试页面看一下文件系统资源是如何在高可用中使用。

essun.node3.com节点上安装nfs

#yum install -y nfs
#mkdir -p /www/share
#vim /etc/exports
/www/share *(rw)
#exportfs -r
# service nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
# echo "cluster server nfs" > /www/share/index.html
[root@essun ~]# service nfs stop
Shutting down NFS daemon:                                  [  OK  ]
Shutting down NFS mountd:                                  [  OK  ]
Shutting down NFS quotas:                                  [  OK  ]
Shutting down NFS services:                                [  OK  ]
Shutting down RPC idmapd:                                  [  OK  ]

开始添加资源

wKioL1NXSo-TwaHmAAHc1TygeoE338.jpg

启动nfs资源看一下效果

wKiom1NXStyAtJ0aAAJHNaALz4g865.jpg


现在模拟node4故障,将资源切换回node2上

wKioL1NXStDBEccYAAH2S-J4S1w618.jpg

 
 
看到效果了吧!!!
说明:

组资源是将多个资源组合在一起对外提供服务,如果这里不定义组资源,每一种资源将平均到每一个节点上,显然这不符合我们的业务逻辑,如是我们想将多个资源运行于同一个节点上对外提供服务,该如何做到呢,这个时候就用到了资源约束了,向下看吧~~~

八、crm资源约束(constraints)

wKioL1NXS0bR6r3NAAAxvO_KG4g103.jpg

资源约束(3种类型):

位置约束(locations):资源更倾向于哪个节点上 ,使用数值表示;    

inf: 无穷大

n: 表示数值,要对节点间的做比较来决定最后落在那个节点上(此处n为正值)

-n: 同上,如果节点间的位置约束均为负值,则最后运行于接近正值的节点上

-inf: 负无穷(只要有其它选择,就不会选择此节点 )

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

inf: 无限倾向于在一起

-inf: 无限倾向于不在一起

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

下面我将图解这三种约束在高可用中的运用,现在所有的资源都被清空了。

wKioL1NXS-PzrL5pAAEvW1iJmAc572.jpg

 
 
如前面提到的步骤添加三个资源ip、httpd、nfs
七、添加资源(约束)
排列约束(那一个资源一那一个资源必须在一起的可能性),由于前面定义过的资源己经清空,所在要再建立一次

wKiom1NXTD7jDSzOAAFLBZh3GnE717.jpg

创建排列约束

wKioL1NXTD2AIqfAAAF1S_s2Va8650.jpg

定义webip资源与webserver资源在一起的可能性

wKiom1NXTJKgbBG1AAGq-84pVgU278.jpg

 
 
说明:
ID:表示为约束记录起一个名字
from to:表示那一个资源与那一个资源(此处写上面定义资源名字即可)
score:在一起的可能性(也可以是数值)
INFINITY:ip必须要和webserver在一个节点上
定义webserver与webnfs在一起的可能性

wKioL1NXTImCTVjNAAKQzwjXArs184.jpg

只有这样定义还不够,这样定义过,仅能保证这三个资源在同一个节点上运行;我们知道一个web对外提供服务首先要有一个对外的地址,如果有web存储的话,还要将存储挂载到对应节点的目录上,最后才是服务本身,所以还要定义在一下顺序。
定义顺序约束

wKioL1NXTLWx9pSeAAHK9jNc__4491.jpg

webip与webnfs顺序约束

wKiom1NXTQCSjwfcAALTCXVV4Ss626.jpg

webnfs与webserver约束

wKiom1NXTUCyCEmtAALf-K6_-JA773.jpg

webip与webserver约束

wKioL1NXTV-jNjz_AAL_zhKM2BA484.jpg

说明:
ID、from、to与前面代表的意思一样

建立位置约束(更倾向于那一个节点)

wKiom1NXTanibdrNAAHeOCcVhYE372.jpg

注:

只在将第一个启动的资源服务定义在位置约束之中,那么后面的所有的资源都将在此节点运行

wKioL1NXTazwY9mXAAIIt2dZoiU308.jpg

全部约束整合之后的样子

wKiom1NXTgGCK1nPAAH7qGzzt0c018.jpg

启动资源,测试访问

wKioL1NXTf6CCgNoAALpGTRSDXc498.jpg

模拟node2故障

wKioL1NXTlHxgDheAAKx8M8kWbI403.jpg

当node2重新上线后,所有的资源将再一次转移到node2上

wKiom1NXTpzhUufaAAJweQaJPgc902.jpg

回到命令行看一看
#crm_mon
============
Last updated: Wed Apr 23 12:15:05 2014
Current DC: essun.node2.com (7188d63f-6350-4ab4-8c3e-831110e2b642)
2 Nodes configured.
3 Resources configured.
============
Node: essun.node2.com (7188d63f-6350-4ab4-8c3e-831110e2b642): online
Node: essun.node4.com (0df746b3-fdab-4625-99d2-659e9a5ef1c6): online
webip   (ocf::heartbeat:IPaddr):        Started essun.node2.com
webnfs  (ocf::heartbeat:Filesystem):    Started essun.node2.com
webserver    (lsb:httpd):    Started essun.node2.com
再看一眼CIB
[root@essun crm]# cat cib.xml
 <cib generated="true" admin_epoch="0" have_quorum="true" ignore_dtd="false" num_peers="2" cib_feature_revision="2.0" crm_feature_set="2.0" ccm_transition="4" dc_uuid="7188d63f-6350-4ab4-8c3e-831110e2b642" epoch="116" num_updates="1" cib-last-written="Wed Apr 23 12:05:43 2014">
   <configuration>
     <crm_config>
       <cluster_property_set id="cib-bootstrap-options">
         <attributes>
           <nvpair id="cib-bootstrap-options-dc-version" name="dc-version" value="2.1.4-node: aa909246edb386137b986c5773344b98c6969999"/>
           <nvpair name="last-lrm-refresh" id="cib-bootstrap-options-last-lrm-refresh" value="1398221371"/>
         </attributes>
       </cluster_property_set>
     </crm_config>
     <nodes>
       <node uname="essun.node2.com" type="normal" id="7188d63f-6350-4ab4-8c3e-831110e2b642">
         <instance_attributes id="nodes-7188d63f-6350-4ab4-8c3e-831110e2b642">
           <attributes>
             <nvpair name="standby" id="standby-7188d63f-6350-4ab4-8c3e-831110e2b642" value="off"/>
           </attributes>
         </instance_attributes>
       </node>
       <node id="0df746b3-fdab-4625-99d2-659e9a5ef1c6" uname="essun.node4.com" type="normal">
         <instance_attributes id="nodes-0df746b3-fdab-4625-99d2-659e9a5ef1c6">
           <attributes>
             <nvpair id="standby-0df746b3-fdab-4625-99d2-659e9a5ef1c6" name="standby" value="off"/>
           </attributes>
         </instance_attributes>
       </node>
     </nodes>
     <resources>
       <primitive id="webip" class="ocf" type="IPaddr" provider="heartbeat">
         <meta_attributes id="webip_meta_attrs">
           <attributes>
             <nvpair id="webip_metaattr_target_role" name="target_role" value="started"/>
           </attributes>
         </meta_attributes>
         <instance_attributes id="webip_instance_attrs">
           <attributes>
             <nvpair id="2e4cd4a7-222b-4db9-93a8-7277ca287e92" name="ip" value="192.168.1.100"/>
             <nvpair id="f72cf044-813a-4dee-b679-fdc20b12f09a" name="nic" value="eth0"/>
             <nvpair id="f79817da-3169-4a4a-b64c-30ce668e0c5d" name="cidr_netmask" value="24"/>
           </attributes>
         </instance_attributes>
       </primitive>
       <primitive id="webnfs" class="ocf" type="Filesystem" provider="heartbeat">
         <meta_attributes id="webnfs_meta_attrs">
           <attributes>
             <nvpair id="webnfs_metaattr_target_role" name="target_role" value="started"/>
           </attributes>
         </meta_attributes>
         <instance_attributes id="webnfs_instance_attrs">
           <attributes>
             <nvpair id="76c25557-53ac-47dc-bd5f-3712a990928e" name="device" value="192.168.1.107:/www/share"/>
             <nvpair id="57dbdea6-3541-45cd-b076-d52f4b078196" name="directory" value="/var/www/html"/>
             <nvpair id="6ebe586c-cdc8-4519-a592-d0f5d6cb59a5" name="fstype" value="nfs"/>
           </attributes>
         </instance_attributes>
       </primitive>
       <primitive id="webserver" class="lsb" type="httpd" provider="heartbeat">
         <meta_attributes id="webserver_meta_attrs">
           <attributes>
             <nvpair id="webserver_metaattr_target_role" name="target_role" value="started"/>
           </attributes>
         </meta_attributes>
         <instance_attributes id="webserver_instance_attrs">
           <attributes>
             <nvpair id="097dd5e7-36ae-4aeb-ab9f-ad06485c5886" name="httpd" value="/etc/rc.d/init.d/httpd"/>
           </attributes>
         </instance_attributes>
       </primitive>
     </resources>
     <constraints>
       <rsc_colocation id="webip_with_webserver" from="webip" to="webserver" score="INFINITY"/>
       <rsc_colocation id="webserver_with_webnfs" from="webserver" to="webnfs" score="INFINITY"/>
       <rsc_order id="webip_before_webnfs" to="webnfs" from="webip"/>
       <rsc_order id="webnfs_before_webserver" to="webserver" from="webnfs"/>
       <rsc_order id="webip_before_webserver" to="webserver" from="webip"/>
       <rsc_location id="webip_on_node2" rsc="webip">
         <rule id="prefered_webip_on_node2" score="0"/>
       </rsc_location>
     </constraints>
   </configuration>
 </cib>
九、总结
在高可用集群中,将资源定义于同一个节点上的方法有两种,第一种是使用group resoruce之后每一种资源都是primitive、native,那么在组中定义的顺序将决定资源启动顺序,第二种是将资源都定义成为primitive、native,由约束为其限定倾向性,排列约束,启动顺序;如在此实验中,高可用的web集群的资源启动顺序为webip---->[webnfs]--->webserver.





你可能感兴趣的:(高可用,crm,heartbeat,约束)