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.-.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文件的配置,文件分为configuration和status两个部分,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 status或crm_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
[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的更多相关文章
- linux -- 基于zookeeper搭建yarn的HA高可用集群
linux -- 基于zookeeper搭建yarn的HA高可用集群 实现方式:配置yarn-site.xml配置文件 <configuration> <property> & ...
- Linux-HA实战(2)— TFS Nameserver HA之虚拟IP
对TFS的Nameserver做机器级别的HA通过虚拟IP机制就可以了,只需要一个Heartbeat就可以搞定,下面简单说下步骤. 操作系统:CentOS 6.4 x86_64 Heartbeat: ...
- iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备
安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理
沪江CCtalk视频地址:https://www.cctalk.com/v/15114923887518 处理错误请求 爱能遮掩一切过错. 当我们在访问一个站点的时候,如果访问的地址不存在(404), ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志
沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 log 日志中间件 最困难的事情就是认识自己. 在一个真实的项目中,开发只是整个投入的一小部分 ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON
视频地址:https://www.cctalk.com/v/15114923886141 JSON 数据 我颠倒了整个世界,只为摆正你的倒影. 前面的文章中,我们已经完成了项目中常见的问题,比如 路由 ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 处理静态资源
视频地址:https://www.cctalk.com/v/15114923882788 处理静态资源 无非花开花落,静静. 指定静态资源目录 这里我们使用第三方中间件: koa-static 安装并 ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 视图Nunjucks
视频地址:https://www.cctalk.com/v/15114923888328 视图 Nunjucks 彩虹是上帝和人类立的约,上帝不会再用洪水灭人. 客户端和服务端之间相互通信,传递的数据 ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 代码分层
视频地址:https://www.cctalk.com/v/15114923889408 文章 在前面几节中,我们已经实现了项目中的几个常见操作:启动服务器.路由中间件.Get 和 Post 形式的请 ...
随机推荐
- Apache Flink Training and sample code
http://training.data-artisans.com/ https://github.com/dataArtisans/blog-post-code-samples https://gi ...
- win7 LR11.0 启动controller报:Failed to create Online:无效指针
win7 LR11.0 启动controller报:Failed to create Online:无效指针 运行lr setup.exe 进行修复后问题解决 修复完成后,覆盖lr安装目录“bin”文 ...
- 使用线性回归识别手写阿拉伯数字mnist数据集
学习了tensorflow的线性回归. 首先是一个sklearn中makeregression数据集,对其进行线性回归训练的例子.来自腾讯云实验室 import tensorflow as tf im ...
- 不要问我有多懒,写个脚本跑django
写django的都知道,要跑起django测试环境,只需要 python manage.py runserver 就可以了,但是时间一长,就觉得敲这个命令太浪费时间了,而我又是个懒人. 同事用的是ct ...
- C#学习笔记(29)——Linq的实现,Lambda求偶数和水仙花数
说明(2017-11-22 18:15:48): 1. Lambda表达式里面用了匿名委托,感觉理解起来还是挺难的.求偶数的例子模拟了Linq查询里的一个where方法. 2. 蒋坤说求水仙花数那个例 ...
- tongjiword,write / read file demo
1.tong ji letter demo mport sys def tongjiword(): fi =open(paht,'r') cont=fi.read() wl={} for line i ...
- Android Studio占用C盘内存
使用Android Studio的时候,会发现,在各种下载导入的时候,C盘内存耗费的非常的快,于是我看了下配置.
- php 验证所传参数为必填的时候的验证逻辑
此段代码摘自lumen框架: xx/vendor/illuminate/validation/Validator.php /** * Validate that a required attribut ...
- Python MQTT订阅获取发布信息字典过滤
起因是因为 订阅的时候,获取到的 MQTT 信息时,第一条信息好像是连接信息,所以需要过滤他. 接收到的数据如下 必须要过滤这个 name : 1 的字典,操作如下: def on_message(c ...
- Using the SAMA5D2-compatible ADC device
Introduction Kernel Software triggers Unsigned single-ended channel conversion Setup Test procedure ...