上篇文章简单介绍了下基于Heartbeat的虚拟IP配置,个人觉得简单易用已经能够应付大部分场景了。但是既然花时间研究HA,如果仅限于一个虚拟IP飘来飘去未免有点糊弄任务了,因此这篇文章打算介绍下基于Pacemaker和CMAN如何构建高可用的TFS NameServer,之所以为什么没有采用Heartbeat+Pacemaker,是因为我花了好大功夫按照官方文档和这篇博客都没有搞定,最后寻思应该是使用的Heartbeat版本和环境不同,这篇文章作者也没对环境做过多交代,因此我一上来会先介绍下上下文环境,至于什么是Heartbeat、Pacemaker和CMAN打算另写一篇介绍。Linux-HA非常繁杂,涉及的东西非常多,这个项目不同的版本差距也很大,本文本着实用的原则记录下这几天我折腾的结果和路上遇到的各种坑。
友情提示:TFS坑比较多。
内容导航
上下文环境
操作系统
[root@jdzhan1 /]# uname -a Linux jdzhan1 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
软件包
[root@jdzhan1 /]# rpm -q pacemaker cman pcs ccs resource-agents pacemaker-1.1.10-14.el6_5.2.x86_64 cman-3.0.12.1-59.el6_5.1.x86_64 pcs-0.9.90-2.el6.centos.2.noarch ccs-0.16.2-69.el6_5.1.x86_64 resource-agents-3.9.2-40.el6_5.6.x86_64
tfs
[1]TFS安装:http://zhanjindong.info/2014/03/06/tfs-installation/
[2]TFS部署:http://zhanjindong.info/2014/03/06/tfs-deploy/
[3]TFS部署问题汇总:http://zhanjindong.info/2014/03/05/tfs-deploy-questions/
我安装是一个叫做dev_for_outer_users版本的TFS,这个版本可能精简了一些东西,比如ha_monitor这个工具,小坑了我一下。
集群
在自己本子的虚拟机上搭建了两个节点:
IP | 节点名(uname -n) |
192.168.129.129 | jdzhan1 |
192.168.129.130 | jdzhan2 |
Pacemaker安装
为了简单起见,Pacemaker直接通过yum安装, 在CentOS6.4上直接执行下面的命令就可以了。
# yum install pacemaker cman pcs ccs resource-agents
注意CMAN
是必须,pcs和css命令方便我们对集群进行配置。
现网应该将pacemaker加入开机启动项:
# chkconfig pacemaker on
安装crmsh资源管理工具(可选)
从pacemaker 1.1.8开始,crmsh 发展成一个独立项目,pacemaker中不再提供。crmsh提供了一个命令行的交互接口来对Pacemaker集群进行管理,但这个不是必须的通过pcs和ccs通常就OK了。
# yum install -y python-dateutil python-lxml # yum install redhat-rpm-config # wget http://apt.sw.be/redhat/el6/en/i386/rpmforge/RPMS/pssh-2.3-1.el6.rf.noarch.rpm # rpm -ivh pssh-2.3-1.el6.rf.noarch.rpm # wget http://tux.rainside.sk/opensuse/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/crmsh-1.2.6-6.1.x86_64.rpm # rpm -ivh crmsh-1.2.6-6.1.x86_64.rpm
安装完成后直接crm就可以进入命令行,具体用法可以man下。
Pacemaker配置简单介绍
其实对Pacemaker的配置就是对cib.xml文件的配置,文件分为configuration
和status
两个部分,status节点用来维护一个节点上所有资源的历史信息,依据这些信息集群可以构建完整的当前状态。
configuration节点主要用来配置集群需要监控的资源,我们一般主要关心的就是这个部分。
cib.xml组成:
<cib admin_epoch="0" epoch="0" num_updates="0" have-quorum="false"> <configuration> <crm_config/> <nodes/> <resources/> <constraints/> </configuration> <status/>
</cib>
官方强烈建议不要手动的修改这个文件,而是通过提供的一系列命令,比如cibadmin
,我们可以利用这个命令先copy一个副本出来修改,修改完了再提交回去,向下面这样:
# cibadmin --query > tmp.xml # vi tmp.xml # cibadmin --replace --xml-file tmp.xml
大部分情况我们只需要关心configuration的resources配置:
# cibadmin --query --obj_type resources > tmp.xml # vi tmp.xml # cibadmin --replace --obj_type resources --xml-file tmp.xml
将ha.cf和haresouce转换为cib.xml
默认通过yum安装Pacemaker是没有cib.xml这个文件的(一般在/var/lib/pacemaker/cib/路径)
如果之前已经基于Heartbeat 1.x style构建过了集群,那么可以通过Heartbeat2.x提供的一个叫做haresources2cib.py的工具将ha.cf和haresource转换为cib.xml
# /usr/lib/heartbeat/haresources2cib.py --stdout -c ha.cf
haresources > cib.xml
但是不建议采取这样的方式,因为不同版本的格式可能有点差异(Heartbeat2.x对应应该是Pacemaker1.0.x),可以通过crm_verify进行验证,向下面这样:
# crm_verify -Vx var/lib/pacemaker/cib/cib.xml
比如我将上篇文章中Nameserver虚拟IP配置信息转换成的cib.xml。
启动Pacemaker
启动Pacemaker之前需要先启动cman
,启动cman之前需要先配置集群的信息(即默认在/etc/luster下生成cluster.conf)可以按照下面的步骤来:
创建名为jdzhan的集群,注意这个名词不能超过15个字符:
#ccs -f /etc/cluster/cluster.conf --createcluster jdzhan
将jdzhan1和jdzhan2两个节点添加到集群当中:
# ccs -f /etc/cluster/cluster.conf --addnode jdzhan1
# ccs -f /etc/cluster/cluster.conf --addnode jdzhan2
以及其他一些配置:
# ccs -f /etc/cluster/cluster.conf --addfencedev pcmk agent=fence_pcmk # ccs -f /etc/cluster/cluster.conf --addmethod pcmk-redirect jdzhan1 # ccs -f /etc/cluster/cluster.conf --addmethod pcmk-redirect jdzhan2 # ccs -f /etc/cluster/cluster.conf --addfenceinst pcmk jdzhan1 pcmk-redirect port=jdzhan1 # ccs -f /etc/cluster/cluster.conf --addfenceinst pcmk jdzhan2 pcmk-redirect port=jdzhan2
启动:
# echo "CMAN_QUORUM_TIMEOUT=0" >> /etc/sysconfig/cman # service cman start # service pacemaker start
启动之后可以进一步设置。
不需要使用STONITH功能:
# pcs property set stonith-enabled=false 大部分情况下集群只有两个节点,忽略下面这个配置 # pcs property set no-quorum-policy=ignore 当单点故障时候进行服务迁移 # pcs resource defaults migration-threshold=1
启动成功后,就会发现/var/lib/pacemaker/cib/下面已经生成cib.xml文件了。
输入crm_mon -1
可以查看集群的状态:
因为jdzhan2节点上面的pacemaker还没启动,所以显示offline。
按照上面的步骤配置jdzhan2后(scp一下cluster.conf),cib.xml文件会自动在集群各个节点上进行同步。
# scp root@192.168.129.129:/etc/cluster/cluster.conf /etc/cluster/
启动cman的时候可能会遇到一些小麻烦,可以看下下面的FAQ部分。
OK,至此Pacemaker已经启动了,下面就是把我坑的最惨的TFS Nameserver HA配置了。
TFS Nameserver HA配置
我这里按照我的顺序说下具体步骤,其中遇到的一些其他问题和需要用到的资源参考后面的FAQ和资源下载。
Step0:通过yum安装好CMAN和Pacemaker。
强调yum
是因为如果编译安装的话一些路径可能会跟我下面描述的有出入。
Step1:配置nameserver的ns.conf
# vi /home/tfs/conf/ns.conf
关注几个重要参数如下:
#listen port 端口 port = 8100 #work directoy tfs的安装路径 work_dir=/home/tfs #device name 绑定的网卡一般是ifconfig显示的第一个 dev_name= eth0 #ip addr(vip) 虚拟IP ip_addr = 192.168.129.133 [nameserver] # 主备nameserver的IP ip_addr_list = 192.168.129.129|192.168.129.130 group_mask = 255.255.255.255
Step2:拷贝文件
执行TFS自带的nsdep
之前(这个命令或将/home/tfs/scripts/ha下的NameServer
拷贝到/usr/lib/ocf/resource.d/heartbeat/),NameServer是一个OCF资源文件(参考这里),Pacemaker正是利用这个文件来监控、启动和关闭资源的,但是我安装的这版TFS里提供的NameServer脚本貌似有点版本不兼容,我做了下修改(下载)
还有一个很需要注意的地方是,NameServer这个脚本里需要用到一个ha_monitor
的脚本来监控Nameserver进程,但是我安装的TFS里也没有,需要从TFS其他版本源码里找下放到/home/tfs/bin路径下(下载)。
另外需要注意的是要设置下OCF_ROOT
这个环境变量,OCF脚本需要引用:
#vi /etc/profile 加入export OCF_ROOT=/usr/lib/ocf #source /etc/profile
准备好后直接执行下面命令或者手动复制就行了。
# cd /home/tfs/scripts/ha/
# ./nsdep
Step3:修改ns.xml
ns.xml(在$TFS_HOME/scripts/ha/路径下)其实就是前面提到的cib.xml中的resources节点,配置有两个资源需要监控:一个是和NameServer绑定的虚拟IP有一个是NameServer本身(依赖NameServer脚本和ha_monitor工具)。
主要修改如下:
ip的属性值设置为192.168.129.100 nic的属性值为eth0:0 basedir配置为/home/tfs (设置为tfs的安装目录) nsip配置为192.168.129.129 (ns vip)主备指定一样的 nsport配置为8100 (ns port) user设置为root (用于启动服务的用户)
需要特别注意的ns.xml中虚拟IP和NameServer是作为一个资源组绑定在一起的,这样才能实现当进程挂掉了,虚拟IP能够跟随的漂移到另外一个节点上。
Step4:按照如上步骤配置好另外一个节点。
ns.xml是一模一样的,通过scp拷过去就可以了。
Step5:修改主备hosts
# vi /etc/hosts 分别加上对方主机和ip的映射: # 192.168.129.129 jdzhan1 # 192.168.129.130 jdzhan2 考虑防火墙可能有影响可以关闭防火墙: # service iptables stop
# chkconfig iptables stop
Step6:添加haclient组和hacluster用户(主备都需要,如果通过yum安装的Pacemaker那么应该已经添加过了)
# groupadd haclient
# useradd -g haclient hacluster -M -s /sbin/nologin
Step7:启动cman和Pacemaker
# service cman start
直接启动pacemaker也可以
# service pacemaker start
Step8:集群初始化
一切就绪后执行下面的命令(只需要在一个节点上执行)。
crm_attribute --type crm_config --attr-name symmetric-cluster --attr-value true crm_attribute --type crm_config --attr-name stonith-enabled --attr-value false crm_attribute --type rsc_defaults --name resource-stickiness --update 100 cibadmin --replace --obj_type=resources --xml-file /home/admin/tfs/scripts/ha/ns.xml 上述命令做到主要工作包含 1. 配置所有的节点为对等关系,即所有的节点都能接管服务 2. 禁用stonish 3. 应用ns.xml里的配置
Step9:检查集群状态
执行pcs status
或crm_mon -1
查看集群状态:
Step10:测试
测试之前的状态是虚拟IP和NameServer都在jdzhan1节点上。
1)模拟NameServer进程被kill掉。
# ps -ef | grep tfs # kill -9 2833 # pcs status
可以看到NameServer在jdzhan2节点起来了,同时虚拟IP也漂移到jdzhan2。
1) 模拟机器宕机
接着上面,reboot jdzhan2。很快(快慢在ns.xml中配置)jdzhan1接管了服务。
FAQ
Q:启动cman报如下错误:
A:如下关系Network Mannager服务和启动项就可以了:
# service NetworkManager stop
# chkconfig NetworkManager off
Q:启动cman报如下错误:
A:修改/etc/hosts配置好需要添加到集群的节点名(uname -n)和IP地址的映射关系,并且保证localhost地址不要映射成节点名。
Q:为什么启动Pacemaker后发现两个节点之间总是显示对方offline,监控的资源(比如虚拟IP)都在本机启动了。
A:可能是出现脑裂了,尝试关闭防火墙和SELinux试试:
# service iptables stop # vi /etc/selinux/config
将SELinux
置为disabled
也有可能是两个节点之前的时间不同步导致的。
资源下载
[1]cib.xml示例文件
[2]ha_monitor
[5]ns.xml示例文件
参考链接
[1]Pacemaker Explained:http://clusterlabs.org/doc/en-US/Pacemaker/1.1/html-single/Pacemaker_Explained/
[2]Pacemaker安装:http://clusterlabs.org/quickstart-redhat.html,http://clusterlabs.org/wiki/Install#Installing_on_RHEL-6
[3]将haresources转换为cib.xml:http://linux-ha.org/ClusterInformationBase/Conversion
[4]OCF资源脚本书写方法:http://www.cnblogs.com/haohao-jishuzhilu/archive/2012/12/18/2823271.html
欢迎访问我的个人博客:http://zhanjindong.info/2014/03/22/tfs-ha-pacemaker-cman/