Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

上篇文章简单介绍了下基于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了。

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA
# 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
Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

安装完成后直接crm就可以进入命令行,具体用法可以man下。

 

Pacemaker配置简单介绍 

其实对Pacemaker的配置就是对cib.xml文件的配置,文件分为configurationstatus两个部分,status节点用来维护一个节点上所有资源的历史信息,依据这些信息集群可以构建完整的当前状态。

configuration节点主要用来配置集群需要监控的资源,我们一般主要关心的就是这个部分。

cib.xml组成:

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA
<cib admin_epoch="0" epoch="0" num_updates="0" have-quorum="false">
     <configuration>
        <crm_config/>
        <nodes/>
        <resources/>
        <constraints/>
     </configuration>
     <status/>
</cib>
Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

官方强烈建议不要手动的修改这个文件,而是通过提供的一系列命令,比如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

以及其他一些配置:

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA
# 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
Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

启动:

# 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文件了。

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

输入crm_mon -1可以查看集群的状态:

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

因为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

关注几个重要参数如下:

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA
#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 
Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

 

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工具)。

主要修改如下:

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA
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                (用于启动服务的用户)
Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

 

需要特别注意的ns.xml中虚拟IP和NameServer是作为一个资源组绑定在一起的,这样才能实现当进程挂掉了,虚拟IP能够跟随的漂移到另外一个节点上。

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

 

Step4:按照如上步骤配置好另外一个节点。

ns.xml是一模一样的,通过scp拷过去就可以了。

 

Step5:修改主备hosts

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA
# vi /etc/hosts
分别加上对方主机和ip的映射:
# 192.168.129.129 jdzhan1
# 192.168.129.130 jdzhan2
考虑防火墙可能有影响可以关闭防火墙:
# service iptables stop
# chkconfig iptables stop
Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

 

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:集群初始化

一切就绪后执行下面的命令(只需要在一个节点上执行)。

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA
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里的配置
Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

 

Step9:检查集群状态

执行pcs statuscrm_mon -1查看集群状态

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

 

Step10:测试

测试之前的状态是虚拟IP和NameServer都在jdzhan1节点上。

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

1)模拟NameServer进程被kill掉。

#  ps -ef | grep tfs
# kill -9 2833
# pcs status

 Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

可以看到NameServer在jdzhan2节点起来了,同时虚拟IP也漂移到jdzhan2。

 

1)  模拟机器宕机

接着上面,reboot jdzhan2。很快(快慢在ns.xml中配置)jdzhan1接管了服务。

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

 

FAQ

Q:启动cman报如下错误:

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

A:如下关系Network Mannager服务和启动项就可以了:

# service NetworkManager stop

# chkconfig NetworkManager off

 

Q:启动cman报如下错误:

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

A:修改/etc/hosts配置好需要添加到集群的节点名(uname -n)和IP地址的映射关系,并且保证localhost地址不要映射成节点名。

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

 

Q:为什么启动Pacemaker后发现两个节点之间总是显示对方offline,监控的资源(比如虚拟IP)都在本机启动了。

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

A:可能是出现脑裂了,尝试关闭防火墙和SELinux试试:

# service iptables stop

# vi /etc/selinux/config

将SELinux置为disabled

也有可能是两个节点之前的时间不同步导致的。

 

资源下载

[1]cib.xml示例文件

[2]ha_monitor

[3]haresources2cib.py

[4]NameServer OCF脚本

[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/

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA,布布扣,bubuko.com

Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

上一篇:Linux 常用壓縮與解壓縮指令整理


下一篇:Linux(ubuntu)下安装JDK