基于corosync+pacmaker实现高可用集群

目前,corosync功能和特性已经非常完善了,所以pacmaker独立出来之后通常都将pacmaker和corosync结合来使用,corosync并没有通用的资源管理器,因此要借助pacmaker来实现

常用的资源管理器:

・cman:rgmanager

・crm:

crm的资源约束有:

・location :资源对节点的偏好

・colocation:排序约束;资源运行在同一节点上的可能性,需要一定评估的

・order: 资源采取动作的次序

 

资源有很多属性,以下为最常见的几类

・集群属性

・资源属性

・全局属性

 

资源属性:

Failover:比如一个资源默认运行在node1上,那么node1故障则将其由node2来管理,被称为failover

Failback:如果node1恢复,那么资源是否可以转移回来,这需要根据定义资源的粘性来实现,被称为failback

 

但问题来了:假如我们的资源有共享的存储设备的话,一般他们间的争用会带来一些麻烦,所以要引用一些隔离机制

隔离: 

・node : stonith

・resource : fencing

 

一般对于集群来说事先假设一定支持共享存储的,所以上来就假设必须支持stonith设备不然立即发送警告信息,所以如果没有stonith设备,可以将其忽略

但是一般集群出现分裂的时候,不能让一个节点自行运行一个集群,所以一个高可用集群通常要有3个节点,也就意味着当整个集群节点彼此之间不能互相通信的时候只能有一方是合法的,能够代理原来的集群来运行,我们被称为法定票数:

・with quorum 

・without quorum

 

集群属性

双节点集群如果没有采取ping node机制或仲裁机制的话很显然一旦任何节点出现故障,那么整个集群彻底挂掉

即便如此,即时不具备ruprum也必须让其正常运行

所以这些通常被称为集群属性

 

全局属性

心跳信息传递

ucast

mcast

bcast

双节点集群可以是单播,但是多节点集群最好是多播的,而不要使用广播。最好使用固定的多播地址

这里我们使用第一种方法

 

在高可用集群当中,一般而言一个资源只能运行于一个节点,这也是说明为什么不让服务开机自动启动的原因

在6.3之前是crmsh 6.4之后crmsh被废弃了转而使用了pcs

crmsh与pcs两者间对比

优势:某些配置语法理解起来比crm简单的许多

劣势:有些调用机制没有crm好

 

部署corosync+pacmaker

环境规划

IP地址

服务器角色

10.0.10.61

Node1

10.0.10.62

Node2

配置前提:

・时间同步

[root@node1~]# ntpdate time.windows.com

・主机名称解析

以node1为例

更改network文件中的主机名

[root@node1~]# cat /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=node1

更改hostname

[root@node1~]# hostname node1

・在双节点都建立双机互信

[root@node1~]# cat /etc/hosts
10.0.10.61 node1
10.0.10.62 node2

[root@node1~]# ssh-keygen -t rsa -P ''

[root@node1~]#cd

[root@node1~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2

 

接下来在2个节点安装配置corosync 和pacemaker

[root@node1~]# yum install corosync �Cy

[root@node1 ~]# yum install pacemaker -y

pacemaker是作为corosync的插件来使用的,所以只需要在corosync配置文件中启动pacemaker插件即可;

但是真正启动corosync并且配置它需要命令行接口进行调用,没配置pcs那么这里我们只能使用crm工具来对其进行资源的管理

 

安装crmsh

新建yum源,指定suse官方源

[root@node1~]# cat /etc/yum.repos.d/ha-clustering.repo 

[haclustering]

name=HAClustering

baseurl=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/

enabled=1

gpgcheck=0

清理yum缓存

[root@node1~]# yum clean all

安装crmsh和pssh 两者去缺一不可,这里使用yum进行安装其会自动补全依赖关系

[root@node1~]# yum install crmsh

配置corosync

Corosync安装完成之后,会在etc下生成corosync目录,如下所示

[root@node1network-scripts]# cd /etc/corosync/

[root@node1corosync]# ls

corosync.conf.examplecorosync.conf.example.udpuservice.duidgid.d

可以看到,都是模板文件,我们将其复制并改名

[root@node1corosync]# cp corosync.conf.example corosync.conf

修改配置参数

红色部分为被修改的参数

[root@node1 corosync]# grep -v '#'corosync.conf | grep -v '^$'

# Please read the corosync.conf.5 manual page

compatibility: whitetank#是否兼容whitetank版本(其是0.8版本的corosync,0.8之后的版本做了很大的改动,因此兼容0.8意味着很多新功能无法使用了),

totem {                     #用来监听集群之间的心跳信息传递机制的

     version: 2#版本号

     secauth: on           #是否启用安全认证功能的,我们开启此功能

     threads: 0          #启动几个线程来进行心跳信息传递,如果节点比较多而当前主机是多核的,可以多启动几个,0为默认配置


     interface {                  #
定义心跳信息传递的接口,接口是上下文,需要自己定义属性
          ringnumber: 0          #表示循环次数为几次,同时结合ttl来判断报文发送几次并不循环来回发送
          bindnetaddr: 
10.0.10.0#绑定的网络地址,因此打算在哪个网卡传递心跳信息就在网卡所在的网络地址写在这里,(网段)
          mcastaddr: 
239.255.1.100#只要不使用禁忌地址就可以,随意地址
          mcastport: 5405        #服务监听端口
          ttl: 1
     }
}

logging { #定义日志功能

     fileline: off#不用管

     to_stderr: no                #是否将错误日志信息输出,一般为no,不将其打开
     to_logfile: yes              #将本地日志信息打开 保存至logfile参数
     to_syslog:
 no#一旦开启syslog由/var/log/memegess接收,因此该为no
     logfile: /var/log/cluster/corosync.log

     debug: off                   #不需要调试
     timestamp: on                #是否使用时间戳,如果确认双方节点的时间是同步的,可将其关闭,因为两个节点互相传递心跳信息的时候,只要通过多播地址能收到,都会将其记录日志的,没记录一次日志都会写一次信息,每一次操作都会进行系统调用,所以对于系统资源无非是一种无谓的消耗

定义pacemaker插件功能

编辑corosync.conf,添加如下内容:

service {
  ver:  0
  name: pacemaker
  # use_mgmtd: yes
}

#下面这几行可加可不加,表示以进程以哪个身份运行,都是以默认身份操作

aisexec {
  user: root
  group:  root
}

保存退出

corosync的认证

corosync必须使用认证功能,所以必须给其生成秘钥

使用corosync-keygen命令对其生成秘钥,如下所示:

[root@node1 corosync]#corosync-keygen 

Corosync Cluster Engine Authentication keygenerator.

Gathering 1024 bits for key from /dev/random.

Press keys on your keyboard to generateentropy.

Press keys on your keyboard to generateentropy (bits = 848).

其提示必须满足1024个字符,比较郁闷

#这里随机数不够用,我们需要1024个但是我们只有848位这时要么我们敲键盘够1024个即可

或则执行其他的命令,比如使用yum安装某个程序包等

新建会话窗口,随便键入命令,比如yum或则ab压力所示等一系列长时间的操作

 yum install httpd*

最后提示”Writing corosynckey to /etc/corosync/authkey.表示秘钥创建成功

文件保存于/etc/corosync/authkey

这时,我们将其配置文件以及秘钥文件拷贝到node2节点中

[root@node1 corosync]# scp -p authkeycorosync.conf root@node2:/etc/corosync/

authkey                         100%  128     0.1KB/s  00:00   
corosync.conf                   100%  545     0.5KB/s   00:00 

启动之前将networkmanager关闭

[root@node1 corosync]#/etc/init.d/NetworkManager stop

[root@node1 corosync]# chkconfigNetworkManager off

接下来只需要将配置文件和秘钥文件复制到另一个节点中去,复制过程中保持原始权限

[root@node1 corosync]# scp authkeycorosync.conf root@node2:/etc/corosync/

将networkmanager关闭

[root@node1 corosync]#/etc/init.d/NetworkManager stop

[root@node1 corosync]# chkconfigNetworkManager off

启动corosync

[root@node1 corosync]# /etc/init.d/corosyncstart

Starting Corosync Cluster Engine(corosync):[OK]

查看其日志信息

查看corosync引擎是否正常启动:

[root@node1 corosync]# egrep "Corosync Cluster Engine|configuration file"/var/log/cluster/corosync.log 

May 12 16:09:23 corosync [MAIN  ]Corosync Cluster Engine ('1.4.1'): started and ready to provide service.
May 12 16:09:23 corosync [MAIN  ] Successfully read main configurationfile '/etc/corosync/corosync.conf'.          #
确实是读取的我们定义的配置文件

查看初始化成员节点通知是否正常发出

[root@node1 corosync]#  grep TOTEM  /var/log/cluster/corosync.log

#已初始化UDP的多播地址并向外传递信息
May 12 16:09:23 corosync [TOTEM ] Initializing transport (UDP/IP Multicast).

#我们的数据传输已经被加密,基于HAMAC
May 12 16:09:23 corosync [TOTEM ] Initializing transmit/receive security:libtomcrypt SOBER128/SHA1HMAC (mode 0).

#我们的本地主机ip已经启动起来了
May 12 16:09:23 corosync [TOTEM ] The network interface [10.0.10.61] is now up.

#现在已经我们有一个新的成员
May 12 16:09:24 corosync [TOTEM ] A processor joined or left the membership anda new membership was formed.

检查启动过程中是否有错误产生,下面的错误信息表示packmaker不久之后将不再作为corosync的插件运行,因此,建议使用cman作为集群基础架构服务;此处可安全忽略。

[root@node1 corosync]# grep ERROR:/var/log/cluster/corosync.log | grep -v unpack_resources

#使用了pacmaker集群插件的方式和corosync结合进行工作,这种机制可能将来不会被支持,如果想获得信息请参考http://www.clusterlabs.org/doc 第八章,之后将结合CMAN

May 12 16:09:24 corosync [pcmk  ] ERROR:process_ais_conf: You have configured a cluster using the Pacemaker plugin forCorosync. The plugin is not supported in this environment and will be removedvery soon.
May 12 16:09:24 corosync [pcmk  ] ERROR: process_ais_conf:  Pleasesee Chapter 8 of 'Clusters from Scratch' (http://www.clusterlabs.org/doc) fordetails on using Pacemaker with CMAN

查看pacemaker是否正常启动

[root@node1 corosync]# grep pcmk_startup/var/log/cluster/corosync.log
May 12 16:09:24 corosync [pcmk  ] info: pcmk_startup: CRM: Initialized
May 12 16:09:24 corosync [pcmk  ] Logging: Initialized pcmk_startup
May 12 16:09:24 corosync [pcmk  ] info: pcmk_startup: Maximum core filesize is: 18446744073709551615
May 12 16:09:24 corosync [pcmk  ] info: pcmk_startup: Service: 9
May 12 16:09:24 corosync [pcmk  ] info: pcmk_startup: Local hostname:node1     #
本地名称叫node1

我们来实时查看node1的日志变化,并启动node2的集群

[root@node1 corosync]# tail -F /var/log/cluster/corosync.log

#为了方便查看效果,多按几下回车

查看日志如果出现以下信息,表示成功

May 13 20:22:34 [1878]node1    pengine:     info:determine_online_status_fencing:Nodenode2 is active   #node2已经启动

May 13 20:22:34 [1878]node1    pengine:     info: determine_online_status:     Node node2 isonline   #node2已经上线

查看进程信息

[root@node1 cluster]# ps -auxf

root18870.20.8 5508364492 ?Ssl15:250:01 corosync

18918931.01.9932409940 ?S15:250:06\_ /usr/libexec/pacemaker/cib

root18940.00.7941443848 ?S15:250:00\_ /usr/libexec/pacemaker/stonithd

root18950.00.5754282988 ?S15:250:00\_ /usr/libexec/pacemaker/lrmd

18918960.00.6894003252 ?S15:250:00\_ /usr/libexec/pacemaker/attrd

18918970.03.7 117044 18728 ?S15:250:00\_ /usr/libexec/pacemaker/pengine

18918980.00.8 1471084308 ?S15:250:00\_ /usr/libexec/pacemaker/crmd

查看监听端口

可以看到已经监听在多播地址,并已经开始监听端口

[root@node1 cluster]# netstat-lntup | grep corosync

udp00 10.0.10.61:54040.0.0.0:*1887/corosync

udp00 10.0.10.61:54050.0.0.0:*1887/corosync

udp00 239.255.1.100:54050.0.0.0:*1887/corosync

查看集群信息

[root@node1 cluster]# crm status

Last updated: Tue May 13 10:04:27 2014              #刷新时间

Last change: Tue May 13 20:20:41 2014 viacrmd on node1     #修改时间,通过node1修改的集群信息

Stack: classic openais (with plugin)              #底层信息通道层,基于插件的方式使用的corosync

Current DC: node1 - partition with quorum         #当前的DC是node1 而且当前具备了当前法定票数

Version: 1.1.10-14.el6_5.3-368c726                #当前的版本
3 Nodes configured, 2 expected votes              #一共配置了2个节点
0 Resources configured

Node test3: UNCLEAN (offline)
Online: [ node1 node2 ]                            #当前两个节点都在线,分别是node1 和 node2

检查配置文件是否存在语法错误,提示找不到STONTIH设备,我们可以将其关掉,后面会有演示

[root@node1 cluster]#crm_verify -L -V

error: unpack_resources: Resourcestart-up disabled since no STONITH resources have been defined

error: unpack_resources: Eitherconfigure some or disable STONITH with the stonith-enabled option

error: unpack_resources: NOTE:Clusters with shared data need STONITH to ensure data integrity

Errors found during check: config not valid

 

使用CRM资源管理器实现高可用

Crm管理器的简单使用方法

在交互模式下,可以定义多个资源并统一提交

使用命令crm可以进入到交互模式,类似于路由交换的界面

[root@node1 cluster]# crm#输入crm进入交互界面

crm(live)##已经进到交互界面,我们可以在这里进行配置资源

输入help,可获取帮助信息;如想看某个资源代理类别下有哪些资源代理,则使用list命令

比如想看lsb下面有哪些资源

crm(live)# ra list lsb

如果想进入某个模式可以直接输入模式名称就可以了,比如进入全局模式,那么就输入configure即可,如下所示

crm(live)# configure

crm(live)configure#

配置crm资源

定义一个资源必须进入configure模式

使用ipaddr配置其vip

crm(live)# configure

#定义vip地址

crm(live)configure# primitive webipocf:heartbeat:IPaddr params ip=10.0.10.100

crm(live)configure# show

node node1

node node2

primitive webip IPaddr \

paramsip=10.0.10.100

property cib-bootstrap-options: \

dc-version=1.1.10-14.el6_5.3-368c726\

cluster-infrastructure="classicopenais (with plugin)" \

expected-quorum-votes=2

如果定义完成之后没有报错,可以使用verify命令进行检查语法错误

crm(live)configure# verify

error: unpack_resources: Resourcestart-up disabled since no STONITH resources have been defined

error: unpack_resources: Eitherconfigure some or disable STONITH with the stonith-enabled option

error: unpack_resources: NOTE:Clusters with shared data need STONITH to ensure data integrity

Errors found during check: config not valid

发现出现了之前检查语法相同的错误信息,这时我们讲stonith设备信息关闭即可

crm(live)configure# propertystonith-enabled=false

再次检查语法

crm(live)configure# verify

没有发现错误,使用commit命令保存并退出

crm(live)configure# commit

crm(live)configure# bye

bye

查看资源状态

[root@node1 ~]# crm status

Last updated: Sat May 17 10:19:04 2014

Last change: Sat May 17 10:15:43 2014 viacibadmin on node1

Stack: classic openais (with plugin)

Current DC: node1 - partition with quorum

Version: 1.1.10-14.el6_5.3-368c726

2 Nodes configured, 2 expected votes

1 Resources configured

 

Online: [ node1 node2 ]

 

webip(ocf::heartbeat:IPaddr):Started node1

也可以使用crm resource status来查看,显示所有资源使用状况

[root@node1 ~]# crm resource status

webip(ocf::heartbeat:IPaddr):Started

如查看某个资源则可以后面跟上资源名称,如下所示

[root@node1 ~]# crm resource status webip

resource webip is running on: node1 #提示webip已经启动了 而且运行在node1上

如想让资源停止可以使用stop参数

[root@node1 ~]# crm resource stopwebip

[root@node1 ~]# crm status

Last updated: Sat May 17 10:24:10 2014

Last change: Sat May 17 10:24:04 2014 viacibadmin on node1

Stack: classic openais (with plugin)

Current DC: node1 - partition with quorum

Version: 1.1.10-14.el6_5.3-368c726

2 Nodes configured, 2 expected votes

1 Resources configured#提示已配置了一个资源但是没有任何的资源信息

 

Online: [ node1 node2 ]

启动资源

[root@node1 ~]# crm resource start webip

[root@node1 ~]# crm resource status webip

resource webip is running on: node1

 

使资源转移

将node1改为备节点

需在node模式下进行操作

[root@node1 ~]# crm node
crm(live)node# help

关键参数说明

关键参数说明

Commands:
     attribute      Manageattributes
    cd            Navigate the level structure
     clearstate     Clear node state                   #
用来清除当前节点的状态信息
     delete        Deletenode
    fence          Fencenode
    help           Show help(help topics for list of topics)
    ls           List levels and commands
     maintenance    Put node into maintenance mode
     online         Set node online                    #将当前节点上线
    quit           Exit theinteractive shell
    ready          Put node into ready mode           #将其放入集群准备好的模式
     show         Show node
     standby        Putnode into standby               #将当前节点转成为备份节点
     status        Shownodes' status as XML           #显示节点状态信息
     status-attr    Manage status attributes
    up           Go back to previous level
     utilization    Manage utilization attributes

由此将其转换为备份节点

[root@node1 ~]# crm node standby

[root@node1 ~]# crm status| tail

 

Node node1: standby

Online: [ node2 ]

 

webip(ocf::heartbeat:IPaddr):Started node2#webip资源已经启动在node2节点上

我们已经验证了资源转移,接下来开始配置第二个资源:

配置web服务,将资源web和资源ip应该是同时在一起的,所以我们可以将其定义为组或者排列约束将其在一起

配置web的步骤略过,验证web服务是否配置好

[root@node1 html]# curl node1

node1

[root@node1 html]# curl node2

node2

没有问题则停止服务并确保开机一定不能自动启动

配置资源

[root@node1 html]# crm configure primitivewebserver lsb:httpd

[root@node1 html]# crm configure show

node node1 \

attributesstandby=off

node node2

primitive webip IPaddr \

paramsip=10.0.10.100 \

metatarget-role=Started

primitive webserver lsb:httpd

property cib-bootstrap-options: \

dc-version=1.1.10-14.el6_5.3-368c726\

cluster-infrastructure="classicopenais (with plugin)" \

expected-quorum-votes=2\

stonith-enabled=false

资源webserver运行在node1

[root@node1 html]# crm resource statuswebserver

resource webserver is running on: node1

使node1下线再次查看资源,再次查看资源信息

[root@node1 ~]# crm node standby

[root@node1 ~]# crm status | tail -6

 

Node node1: standby

Online: [ node2 ]

 

webip(ocf::heartbeat:IPaddr):Started node2 

webserver(lsb:httpd):Started node2

在node2查看httpd进程信息

[root@node2 ~]# netstat-lntup | grep 80

tcp00 :::80:::*LISTEN1953/httpd

在node2查看ip进程信息

[root@node2 ~]# ip add | grep 100

2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000

inet 10.0.10.100/24 brd 10.0.10.255 scope global secondary eth0

 

定义组

为了管理方便,我们通常以组的方式进行管理资源

我们讲资源webip和webserver加入到一个组内,如下所示

Webservice 为组名称 webip和webserver为资源名称,将这两个资源加入到webservice组内

[root@node1 ~]#crm configure group webservice webipwebserver

查看状态

[root@node1 ~]# crm configure show

node node1 \

attributesstandby=off

node node2 \

attributesstandby=off

primitive webip IPaddr \

paramsip=10.0.10.100 \

metatarget-role=Started

primitive webserver lsb:httpd

group webservice webip webserver

property cib-bootstrap-options: \

dc-version=1.1.10-14.el6_5.3-368c726\

cluster-infrastructure="classicopenais (with plugin)" \

expected-quorum-votes=2\

stonith-enabled=false

查看状态

[root@node1 ~]# crm status | tail

Version: 1.1.10-14.el6_5.3-368c726

2 Nodes configured, 2 expected votes

2 Resources configured

 

Online: [ node1 node2 ]

 

Resource Group: webservice

webip(ocf::heartbeat:IPaddr):Started node2 

webserver(lsb:httpd):Started node2

如上可以看到,我们定义的两个资源都被加入到webservice组内,并运行在node2节点

访问测试:

[root@node1 ~]# curl http://10.0.10.100

node2

将node2转为备份状态,并再次访问

[root@node2 ~]# crm node standby

[root@node1 ~]# curl http://10.0.10.100

node1

然后将node2再次上线

查看状态,发现节点都在线,但是不会互相抢占资源

[root@node2 ~]# crm status | tail

Version: 1.1.10-14.el6_5.3-368c726

2 Nodes configured, 2 expected votes

2 Resources configured

 

Online: [ node1 node2 ]

 

Resource Group: webservice

webip(ocf::heartbeat:IPaddr):Started node1 

webserver(lsb:httpd):Started node1

 

如果我们更加期望其节点能够在node2上有限运行,则可以定义资源的位置约束来实现我们的需求

 

资源的约束

・位置约束

定义位置约束需要在configure模式中定义location,如下所示

[root@node1 ~]# crm

crm(live)# configure

定义一组资源在node2的优先级别较高

#这里定义约束名称为webservice_on_node2 表示明确说明node2的优先级比较高

#webservice 500: node2 表示其有限数值,越大越优先 冒号后面必须跟空格再跟上节点名称

crm(live)configure# locationwebservice_on_node2 webservice 500: node2

crm(live)configure# verify

crm(live)configure# commit

crm(live)configure# show

node node1 \

attributesstandby=off

node node2 \

attributesstandby=off

primitive webip IPaddr \

paramsip=10.0.10.100 \

metatarget-role=Started

primitive webserver lsb:httpd

group webservice webip webserver

location webservice_on_node2 webservice500: node2

property cib-bootstrap-options: \

dc-version=1.1.10-14.el6_5.3-368c726\

cluster-infrastructure="classicopenais (with plugin)" \

expected-quorum-votes=2\

stonith-enabled=false

测试将node2下线并再次上线

[root@node2 ~]# crm node standby

[root@node2 ~]# crm status | tail

2 Nodes configured, 2 expected votes

2 Resources configured

 

Node node2: standby

Online: [ node1 ]

#如下所示,我们当前节点是node1

Resource Group: webservice

webip(ocf::heartbeat:IPaddr):Started node1 

webserver(lsb:httpd):Started node1

接下来将node2上线,并再次查看其状态

[root@node2 ~]# crm node online

[root@node2 ~]# crm status | tail

Version: 1.1.10-14.el6_5.3-368c726

2 Nodes configured, 2 expected votes

2 Resources configured

 

Online: [ node1 node2 ]

#目前我们已将node2启动,可以看到已经将资源组webservice完全切换至node2

Resource Group: webservice

webip(ocf::heartbeat:IPaddr):Started node2 

webserver(lsb:httpd):Started node2

因为对node1没有定义任何倾向性,但是对于node2的倾向性(优先级)比较大,所以更倾向于运行node2上

那如果我们想node1比node2更优先启动的话,需要对其定义顺序约束

 

・顺序约束

在configure模式中使用order命令进行定义

格式:

Usage:
order <id> {kind|<score>}: <rsc>[:<action>]<rsc>[:<action>] ...
  [symmetrical=<bool>]

对于顺序约束要先启动后停止,后启动的要最后停止

命令格式:

order c_apache_1 Mandatory: apache:start ip_1 

#c_apache_1 为名称

#Mandatory  表示强制的

#apache:start ip_1 明确说明哪个资源执行的操作

 

创建顺序约束

命令写在前面的为先启动,因此要先启动哪个资源要先将哪个资源写在前面

crm(live)configure# orderwebip_before_webserver mandatory: webip webserver

使用show xml查看配置信息,意为查看xml配置文件,更加方便我们查看其配置

crm(live)configure# show xml

找到最下行,可以看到我们定义的约束信息

<constraints>

<rsc_order id="webip_before_webserver"kind="Mandatory" first="webip"then="webserver"/>

<rsc_location id="webservice_on_node2"rsc="webservice" score="500" node="node2"/>

</constraints>

如果检查语法无问题则保存退出

crm(live)configure# verify

crm(live)configure# commit

 

・排列约束

如果我们要定义ip与server在一个组里,需要使用排列约束

格式

crm(live)configure# help colocation

语法:

colocation <id> <score>:<rsc>[:<role>] <with-rsc>[:<role>]
  [node-attribute=<node_attr>]

比如我们期望webip与webserver在一个组内,或webserver与webip在一个组内;

那么我们现在所期望的webip与webserver在一个组,也就是说以webserver为中心,所以先启动webip要以webserver为准

我们先来定义然后看其xml

crm(live)configure# colocationwebip_with_webserver inf: webip webserver

crm(live)configure# verify

crm(live)configure# show xml

切换至最下,找如下行:

<constraints>

<rsc_order id="webip_before_webserver"kind="Mandatory" first="webip"then="webserver"/>

<rsc_location id="webservice_on_node2"rsc="webservice" score="500" node="node2"/>

<rsc_colocation id="webip_with_webserver"score="INFINITY" rsc="webip" with-rsc="webserver"/>

</constraints>

可以看到,无论以谁为中心他们之间都是将在一个组内,因此影响并不大,但是背后是有影响的;

如果是从本身启动来讲意义并不是很大;

如果webip跟webserver在一起,意味着sever不能启动,vip启动也没有意义,所以如果启动了ip但是server启动不起来,那么ip也要将其关掉,所以一定要有核心;

确认没有问题保存规则

crm(live)configure# verify

crm(live)configure# commit

 

实例:基于corosync+pacmaker实现高可用NFS

规划:

IP地址

服务器角色

10.0.10.60

NFS

10.0.10.61

Node1

10.0.10.62

Node2

 

・配置NFS

[root@test ~]# cat /etc/exports 

/web/www10.0.10.0/24(rw)

启动NFS服务

[root@test ~]# /etc/init.d/nfs start

在web/node节点挂载

[root@node1 ~]# mount -t nfs 10.0.10.60:/web/www/var/www/html/

写入主页文件内容

[root@node2 ~]# cat /var/www/html/index.html 

<h1>NFS Server</h1>

访问测试

[root@node2 ~]# curl http://10.0.10.62
<h1>NFS Server</h1>

将其定义成资源并且能跟随web服务运行

将约束删掉并定义资源:

crm(live)configure# edit

node node1 \

attributes standby=off

node node2 \

attributes standby=off

primitive webip IPaddr \

params ip=10.0.10.100 \

meta target-role=Started

primitive webserver lsb:httpd

group webservice webip webserver

将以下约束信息删除

location webservice_on_node2 webservice500: node2

colocation webip_with_webserver inf: webipwebserver

order webip_before_webserver Mandatory:webip webserver

property cib-bootstrap-options: \

dc-version=1.1.10-14.el6_5.3-368c726 \

cluster-infrastructure="classic openais (with plugin)" \

expected-quorum-votes=2 \

stonith-enabled=false

#vim:set syntax=pcmk

检查语法

crm(live)configure# verify

定义资源之前首先查看ocf hearbeat语法

crm(live)configure#primitive webstore ocf:heartbeat:Filesystemparams device="10.0.10.60:/web/www"directory="/var/www/html" fstype="nfs" op start timeout=60op stop timeout=60

crm(live)configure# verify

crm(live)configure# commit

提交完成之后回到crm使用status查看服务是否启动

crm(live)# status

Last updated: Sat May 17 14:58:02 2014

Last change: Sat May 17 14:57:55 2014 viacibadmin on node1

Stack: classic openais (with plugin)

Current DC: node1 - partition with quorum

Version: 1.1.10-14.el6_5.3-368c726

2 Nodes configured, 2 expected votes

3 Resources configured

 

Online: [ node1 node2 ]

 

ResourceGroup: webservice

webip(ocf::heartbeat:IPaddr):Started node1 

webserver(lsb:httpd):Started node1 

webstore(ocf::heartbeat:Filesystem):Started node2

看到已在node2上启动

可以发现 webservice 是一个资源,而webtore是另外一个资源,我们要将两者合并至一个组里,可是我们之前已经定义过组了,所以直接改配置文件就好了

修改配置文件将资源合并至一个组里

crm(live)configure# edit

node node1 \

attributes standby=off

node node2 \

attributes standby=off

primitive webip IPaddr \

params ip=10.0.10.100 \

meta target-role=Started

primitive webserver lsb:httpd

primitive webstore Filesystem \

params device="10.0.10.60:/web/www"directory="/var/www/html" fstype=nfs \

op start timeout=60 interval=0 \

op stop timeout=60 interval=0

group webservice webip webserver webstore#追加webstore资源

property cib-bootstrap-options: \

dc-version=1.1.10-14.el6_5.3-368c726 \

cluster-infrastructure="classic openais (with plugin)" \

expected-quorum-votes=2 \

stonith-enabled=false

#vim:set syntax=pcmk

验证后提交再次查看

crm(live)configure# verify

crm(live)configure# commit

crm(live)configure# cd
crm(live)# status

Last updated: Sat May 17 15:01:53 2014

Last change: Sat May 17 15:01:37 2014 viacibadmin on node1

Stack: classic openais (with plugin)

Current DC: node1 - partition with quorum

Version: 1.1.10-14.el6_5.3-368c726

2 Nodes configured, 2 expected votes

3 Resources configured

 

Online: [ node1 node2 ]

#可以看到,我们已将资源合并至一个组内,同时运行在node1节点中

Resource Group: webservice

webip(ocf::heartbeat:IPaddr):Started node1 

webserver(lsb:httpd):Started node1 

webstore(ocf::heartbeat:Filesystem):Started node1

将node1转为备份节点

[root@node1 ~]# crm node standby

[root@node1 ~]# crm status | tail

3 Resources configured

 

Node node1: standby

Online: [ node2 ]

 

Resource Group: webservice

webip(ocf::heartbeat:IPaddr):Started node2 

webserver(lsb:httpd):Started node2 

webstore(ocf::heartbeat:Filesystem):Started node2

访问测试

[root@node1 ~]# curl http://10.0.10.100

<h1>NFS Server</h1>

 

使其按次序启动

启动顺序分别是:webipàwebstoreàwebserver

定义顺序约束

crm(live)configure# orderwebip_before_webstore_befor_webserver mandatory: (webip webstore) webserver

crm(live)configure# verify

crm(live)configure# commit

#mandatory表示强制的后面跟上启动次序,先是webip、然后是webstore、再是webserver

#如果前面不分次序的话可以用括号将其括起来比如(webip webstore),这里将这2个资源括起来,是因为ip和nfs先启动谁都没有关系,但是webserver必须最后启动

 

查看配置文件

crm(live)configure#show xml

可以看到如下几行:

<resource_set id="webip_before_webstore_befor_webserver-0"sequential="false">

#以下不分启动先后顺序

<resource_ref id="webip"/>

<resource_ref id="webstore"/>

</resource_set>

<resource_setid="webip_before_webstore_befor_webserver-1">

#以上资源启动之后再启动webserver

<resource_ref id="webserver"/>

</resource_set>

 

资源监控及处理策略(状态检查、资源转换)

实现资源转移功能

(#为了效果更佳,最好将之前的资源暂时关闭)

在某个资源手动将其停止后是不会被停止掉的,也不会自动转移,接下来我们基于crm方式实现资源转移功能

定义资源

crm(live)configure# help primitive

涉及参数

op_type :: start | stop | monitor

其中montitor 就是为了监控我们的资源,而且如果发生故障将会传递给我们的集群并试图重新启动它

要对其做资源监控必须明确指定

op  monitor interval=# timeout=#on-fail=restart 

#interval表示指明多久检测一次 单位是秒
#timeout  表示超时时间的间隔

如果监控的周期对方返回了一个结果,结果是服务不在线,那么我们期望一旦发现不在线的时候将其自动将服务启动起来,万一如果当前节点启动故障,那么则更换节点启动

我们需要使用on-fail参数定义,一旦发生错误情况该如何处理

默认on-fail是不会启动的,所以我们要加一条参数on-fail=restart

 

定义新的资源

防止ip冲突定义一新的vip

crm(live)configure# primitive vipocf:heartbeat:IPaddr params ip=10.0.10.200 op monitor interval=20 timeout=20on-fail=restart

#设置20秒检测一次,并且超时时间为20秒,如果超过时间周期还是未检测到其ip则重新加载资源

crm(live)configure# verify

crm(live)configure# commit

查看定义的ip资源

[root@node1 ~]# ifconfig eth0:0

eth0:0Link encap:EthernetHWaddr00:0C:29:D6:6B:A3

inet addr:10.0.10.200Bcast:10.0.10.255Mask:255.255.255.0

UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1

将eth0:0关闭并观察其结果

[root@node1 ~]# ifconfig eth0:0 down

使用ifconfig将200参数过滤出来,发现已经启动了,不过是在本机eth0:1的网卡启动的

[root@node1 ~]# ifconfig| grep 200

inet addr:10.0.10.200Bcast:10.0.10.255Mask:255.255.255.0

以上为资源已被监控如果发生故障将会自动重新启动的

那重启以后未必在当前节点,如果当前节点启动不了则更换节点启动

 

实现资源节点更换功能

如果某个节点中某服务因某原因导致启动失败,如果当前节点启动不了我们要让其资源转移节点,并启动

这里我们以httpd为例:

将node1和node2配置一个新的httpd资源,并在讲其启动在node1节点,将node1安装nginx服务占用其端口使其httpd因端口被占用而启动失败并观察效果:

创建资源名

crm(live)configure# primitive test_httpd lsb:httpd op monitor interval=20 timeout=20on-fail=restart

启动后观察httpd服务已经自动启动,首先来将httpd服务停止并观察其是否会自动启动

[root@node1 nginx]# /etc/init.d/httpd stop

稍等片刻,发现httpd已经启动了

[root@node1 nginx]# ps -ef | grep http
root      6124     1  0 10:58?        00:00:00 /usr/sbin/httpd
apache    6125 6124  0 10:58?        00:00:00 /usr/sbin/httpd

将httpd服务停止并启动nginx服务占用其80端口使httpd启动失败 并再次观察

如下所示,node1中的httpd服务启动失败,节点自动更换至node2中

[root@node1 nginx]# /etc/init.d/httpdstop 

[root@node1 nginx]# /etc/init.d/nginx start

[root@node1 nginx]# crm status | tail -5

test_httpd     (lsb:httpd):     
Startednode2 

Failed actions:
    test_httpd_start_0 on node1 'unknown error' (1): call=64,status=complete, last-rc-change='Tue May 20 11:00:36 2014', queued=71ms,exec=0ms

在node2上查看其进程

[root@node2 ~]# ps -ef | grep http
root      4651     1  0 19:01?        00:00:00 /usr/sbin/httpd
apache    4652  4651  0 19:01?        00:00:00/usr/sbin/httpd

 

以上,实验完成,感谢各位。

 

 

 

你可能感兴趣的:(高可用,corosync,pacmaker)