上篇文章简单介绍了下基于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.-.el6.x86_64 # SMP Fri Feb :: UTC x86_64 x86_64 x86_64 GNU/Linux

软件包

[root@jdzhan1 /]# rpm -q pacemaker cman pcs ccs resource-agents
pacemaker-1.1.-.el6_5..x86_64
cman-3.0.12.1-.el6_5..x86_64
pcs-0.9.-.el6.centos..noarch
ccs-0.16.-.el6_5..x86_64
resource-agents-3.9.-.el6_5..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-.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.1.x86_64.rpm

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

Pacemaker配置简单介绍

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

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

cib.xml组成:

<cib admin_epoch="" epoch="" num_updates="" 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=

启动成功后,就会发现/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 = #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.
nic的属性值为eth0: basedir配置为/home/tfs (设置为tfs的安装目录)
nsip配置为192.168.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
cibadmin --replace --obj_type=resources --xml-file /home/admin/tfs/scripts/ha/ns.xml 上述命令做到主要工作包含
. 配置所有的节点为对等关系,即所有的节点都能接管服务
. 禁用stonish
. 应用ns.xml里的配置

Step9:检查集群状态

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

Step10:测试

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

1)模拟NameServer进程被kill掉。

#  ps -ef | grep tfs
# kill -
# 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

[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的更多相关文章

  1. linux -- 基于zookeeper搭建yarn的HA高可用集群

    linux -- 基于zookeeper搭建yarn的HA高可用集群 实现方式:配置yarn-site.xml配置文件 <configuration> <property> & ...

  2. Linux-HA实战(2)— TFS Nameserver HA之虚拟IP

    对TFS的Nameserver做机器级别的HA通过虚拟IP机制就可以了,只需要一个Heartbeat就可以搞定,下面简单说下步骤. 操作系统:CentOS 6.4 x86_64 Heartbeat: ...

  3. iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备

    安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...

  4. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923887518 处理错误请求 爱能遮掩一切过错. 当我们在访问一个站点的时候,如果访问的地址不存在(404), ...

  5. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 log 日志中间件 最困难的事情就是认识自己. 在一个真实的项目中,开发只是整个投入的一小部分 ...

  6. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON

    视频地址:https://www.cctalk.com/v/15114923886141 JSON 数据 我颠倒了整个世界,只为摆正你的倒影. 前面的文章中,我们已经完成了项目中常见的问题,比如 路由 ...

  7. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 处理静态资源

    视频地址:https://www.cctalk.com/v/15114923882788 处理静态资源 无非花开花落,静静. 指定静态资源目录 这里我们使用第三方中间件: koa-static 安装并 ...

  8. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 视图Nunjucks

    视频地址:https://www.cctalk.com/v/15114923888328 视图 Nunjucks 彩虹是上帝和人类立的约,上帝不会再用洪水灭人. 客户端和服务端之间相互通信,传递的数据 ...

  9. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 代码分层

    视频地址:https://www.cctalk.com/v/15114923889408 文章 在前面几节中,我们已经实现了项目中的几个常见操作:启动服务器.路由中间件.Get 和 Post 形式的请 ...

随机推荐

  1. performance Counter

    Logman https://technet.microsoft.com/en-us/library/bb490956.aspx http://blogs.technet.com/b/askperf/ ...

  2. linux命令返回值的妙用

    什么是返回值 在shell终端中,你所输入的一切命令其实都有返回值,而这个返回值默认保存在"$?"中,举例看一下 [root@localhost ~]# touch [root@l ...

  3. Shell脚本判断内容为None的方式

    1.判断变量 read -p "input a word :" word if [ ! -n "$word" ] ;then echo "you ha ...

  4. 每日英语:Pediatricians Set Limits on Screen Time

    Parents should ban electronic media during mealtimes and after bedtime as part of a comprehensive 'f ...

  5. win10下安装redis 服务

    Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择, ...

  6. 【DIOCP3-说明书】DIOCP3的输出日志

    DIOCP3除了有详细的监控面板之外,还有详细的输出日志,当然需要打开日志编译开关! 在工程选项加入DEBUG编译指令,这样在运行中就可以看到DIOCP3的运行详细日志 日志输出在EXE相同目录的LO ...

  7. c++11并发机制

    传统意义上OS提供的并发机制包含进程和线程两个级别.考虑到实际复杂性,c++11仅提供了线程并发机制. c++11提供的线程并发机制主要位于四个头文件中:..... 线程并发机制包括线程管理.原子操作 ...

  8. 【Python】微博自动抢红包

    # -*- coding: utf-8 -*- import requests import js2xml from lxml import etree headers = { # 这边cookie替 ...

  9. Eigen教程(1)

    整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html 简介 Eigen是C++中可以用来调用并进行矩阵计算的一个库,简单了说它就是一个c+ ...

  10. ORA-12541:TNS:无监听程序 配置Oracle Myeclipse无法连接上 花费一天时间解决掉的

    背景:自己机子做oracle服务器,其他机子可以ping得通我的机子,但是jdbc就是连不上,后来用plsql连出现无监听程序.... 我昨天重新安装Oracle后,用PL/SQL Developer ...