pacemaker + crmsh+corosync 高可用集群

1.Pacemaker介绍

    pacemaker(直译:心脏起搏器),是一个群集资源管理器。它实现最大可用性群集服务(亦称资源管理)的节点和资源级故障检测和恢复使用您的首选集群基础设施(OpenAIS的或Heaerbeat)提供的消息和成员能力。
   它可以做乎任何规模的集群,并配备了一个强大的依赖模型,使管理员能够准确地表达群集资源之间的关系(包括顺序和位置)。几乎任何可以编写脚本,可以管理作为心脏起搏器集群的一部分。
   注意:pacemaker是个资源管理器,不是提供心跳信息的,因为它似乎是一个普遍的误解,也是值得的。pacemaker是一个延续的CRM(亦称Heartbeat V2资源管理器),最初是为心跳,但已经成为独立的项目。

2.pacemaker 特点

    (1)主机和应用程序级别的故障检测和恢复
    (2)几乎支持任何冗余配置
    (3)同时支持多种集群配置模式
    (4)配置策略处理法定人数损失(多台机器失败时)
    (5)支持应用启动/关机顺序
    (6)支持,必须/必须在同一台机器上运行的应用程序
    (7)支持多种模式的应用程序(如主/从)
    (8)可以测试任何故障或群集的群集状态 

3.实现

使用corosync监控心跳,pacemaker时先资源转移,crmsh实现集群资源配置
使用fence检查节点健康状况,实行跳电保护

4.安装

yum install -y corosync pacemaker crmsh-1.2.6-0.rc2.2.1.x86_64.rpm  pssh-2.3.1-2.1.x86_64.rpm

5.配置

corosync 配置文件在 /etc/corosync/ 目录下:
mv corosync.conf.example corosync.conf ##有一个模板,直接拿来修改
.....
  #totem定义集群内各节点间是如何通信的,totem本是一种协议,专用于corosync专用于各节点间的协议,totem协议是有版本的;
totem {
    version: 2    #totme的版本,不可更改
    secauth: off  #安全认证,开启时很耗cpu
    threads: 0    #安全认证开启后并行线程数
    interface {
        ringnumber: 0   #回环号码,若主机有多块网卡,避免心跳汇流
        bindnetaddr: 172.25.12.0  #心跳网段,corosync会自动判断本地网卡上配置的哪个IP地址是属于这个网络的,并把这个接口作为多播心跳信息传递的接口
        mcastaddr: 226.94.1.1  #心跳信息组播地址(所有节点必须一致)
        mcastport: 5405 #组播端口
        ttl: 1   #只条一跳,避免组播报文环路
    }
}

logging {
    fileline: off
    to_stderr: no
    to_logfile: yes
    to_syslog: yes
    logfile: /var/log/cluster/corosync.log
    debug: off
    timestamp: on
    logger_subsys {
        subsys: AMF
        debug: off
    }
}

amf {
    mode: disabled
}

#让pacemaker在corosync中以插件方式启动:
service{
    ver:0  #版本号
    name:pacemaker  #模块名,启动corosync同时启动pacemaker
}

#运行身份
aisxec{
    user:root
    group:root
}
.....

6.生成多播信息密钥

corosync-keygen 生成传递心跳信息时的预共享密钥,生成密钥时需要用到 /dev/random  一共需要1024位的长度
# 生成后的密钥文件会在配置文件目录下自行生成一个authkey文件

注意:
/dev/random是 Linux系统下的随机数生成器,它会从当前系统的内存中一个叫熵池的地址空间中根据系统中断来生成随机数,加密程序或密钥生成程序会用到大量的随机数,就会出现随机数不够用的情况,random 的特性就是一旦熵池中的随机数被取空,会阻塞当前系统进程等待产生中断会继续生成随机数;
由于此处会用到1024位长度的密钥,可能会存在熵池中的随机数不够用的情况,就会一直阻塞在生成密钥的阶段,所以我们用 /dev/urandom 来代替它,/dev/urandom不依赖系统的中断,也就不会造成进程忙等待,但是数据的随机性也不高

mv /dev/{random,random.bak}
ln -s /dev/urandom /dev/random
corosync-keygen   #就不会卡住了

chmod 400 authkey  # 密钥文件权限必须为 400 或 600
scp -p authkey corosync.conf server7:/etc/corosync/
scp -p authkey corosync.conf server8:/etc/corosync/
  # 将刚生成的密钥与配置文件复制到第其他节点上,并保存权限;

7.service corosync start #所有节点启动服务

8.crm_mon #查看集群信息

Last updated: Fri May 26 20:27:03 2017
Last change: Fri May 26 19:19:16 2017 via cibadmin on server6
Stack: classic openais (with plugin)
Current DC: server8 - partition with quorum
Version: 1.1.10-14.el6-368c726
3 Nodes configured, 3 expected votes  #三个节点,三票
0 Resources configured    #资源数

Online: [ server6 server7 server8 ]  #在线节点

9.日志文件

/var/log/cluster/corosync.log
启动完成后要在各个节点上进行一系列的确认,看各组件工作是否正常:
grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
#确保   Cluster Engine  工作是否正常
grep  "TOTEM"  /var/log/cluster/corosync.log
# 查看初始化成员节点通知是否正常发出
grep pcmk_startup /var/log/cluster/corosync.log
# 查看 pcmk(pacemaker简写) 插件工作是否正常
grep ERROR /var/log/cluster/corosync.log
# 检查启动过程中是否有错误产生        
# 日志出现了哪些错误,如果出现提示pacemaker不应该以插件方式运行直接忽略即可;
# 可能会提示我们PE工作不正常;让我们用  crm_verify -L  -V 来查看

10.crm_verify -L -V

error: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
error: unpack_resources: Either configure 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
# corosync默认启用了stonith,而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用
# 即没有 STONITH 设备,此处实验性目的可以忽略;

11.crm

    (1)在crm管理接口所做的配置会同步到各个节点上
    (2)任何操作都需要commit提交后才会生效;
    (3)想要删除一个资源之前需要先将资源停止
    (4)可以用 help COMMAND 获取该命令的帮助
    (5)支持 TAB 补全

12.工作模式:

    (1)批处理模式,在shell中直接输入命令
    (2)交互式
[root@server8 ~]# crm
crm(live)# help   #获取当前可用命令
This is crm shell, a Pacemaker command line interface.
Available commands:
cib              manage shadow CIBs # cib沙盒
resource         resources management # 所有的资源都在这个子命令后定义
configure        CRM cluster configuration # 编辑集群配置信息
node             nodes management # 集群节点管理子命令
options          user preferences # 用户优先级
history          CRM cluster history
site             Geo-cluster support
ra               resource agents information center # 资源代理子命令(所有与资源代理相关的程都在此命令之下)
status           show cluster status # 显示当前集群的状态信息
help,?           show help (help topics for list of topics)# 查看当前区域可能的命令
end,cd,up        go back one level # 返回第一级crm(live)#
quit,bye,exit    exit the program  # 退出crm(live)交互模式

13.常用子命令

(1)resource子命令 #定义所有资源的状态
crm(live)resource# help
vailable commands:
status           show status of resources #显示资源状态信息
start            start a resource #启动一个资源
stop             stop a resource #停止一个资源
restart          restart a resource #重启一个资源
promote          promote a master-slave resource #提升一个主从资源
demote           demote a master-slave resource #降级一个主从资源
manage           put a resource into managed mode
unmanage         put a resource into unmanaged mode
migrate          migrate a resource to another node #将资源迁移到另一个节点
unmigrate        unmigrate a resource to another node
param            manage a parameter of a resource #管理资源的参数
secret           manage sensitive parameters #管理敏感参数
meta             manage a meta attribute #管理源属性
utilization      manage a utilization attribute
failcount        manage failcounts #管理失效计数器
cleanup          cleanup resource status #清理资源状态
refresh          refresh CIB from the LRM status #从LRM(LRM本地资源管理)更新CIB(集群信息库)
reprobe          probe for resources not started by the CRM #探测在CRM中没有启动的资源
trace            start RA tracing #启用资源代理(RA)追踪
untrace          stop RA tracing #禁用资源代理(RA)追踪
help             show help (help topics for list of topics) #显示帮助
end              go back one level #返回一级(crm(live)#)
quit             exit the program #退出交互式程序
(2)configure子命令 #资源粘性、资源类型、资源约束
crm(live)configure# help
Available commands:
node             define a cluster node #定义一个集群节点
primitive        define a resource #定义资源
monitor          add monitor operation to a primitive #对一个资源添加监控选项(如超时时间,启动失败后的操作)
group            define a group #定义一个组类型(将多个资源整合在一起)
clone            define a clone #定义一个克隆类型(可以设置总的克隆数,每一个节点上可以运行几个克隆)
ms               define a master-slave resource #定义一个主从类型(集群内的节点只能有一个运行主资源,其它从的做备用)
rsc_template     define a resource template #定义一个资源模板
location         a location preference # 定义位置约束优先级(默认运行于那一个节点(如果位置约束值相同,默认倾向性哪一个高,就在哪一个节点上运行))
colocation       colocate resources #排列约束资源(多个资源在一起的可能性)
order            order resources #资源的启动的先后顺序
rsc_ticket       resources ticket dependency#
property         set a cluster property #设置集群属性
rsc_defaults     set resource defaults #设置资源默认属性(粘性)
fencing_topology node fencing order #隔离节点顺序
role             define role access rights #定义角色的访问权限
user             define user access rights #定义用用户访问权限
op_defaults      set resource operations defaults #设置资源默认选项
schema           set or display current CIB RNG schema
show             display CIB objects #显示集群信息库对
edit             edit CIB objects #编辑集群信息库对象(vim模式下编辑)
filter           filter CIB objects #过滤CIB对象
delete           delete CIB objects #删除CIB对象
default-timeouts     set timeouts for operations to minimums from the meta-data
rename           rename a CIB object #重命名CIB对象
modgroup         modify group #改变资源组
refresh          refresh from CIB #重新读取CIB信息
erase            erase the CIB #清除CIB信息
ptest            show cluster actions if changes were committed
rsctest          test resources as currently configured
cib              CIB shadow management
cibstatus        CIB status management and editing
template         edit and import a configuration from a template
commit           commit the changes to the CIB #将更改后的信息提交写入CIB
verify           verify the CIB with crm_verify #CIB语法验证
upgrade          upgrade the CIB to version 1.0
save             save the CIB to a file #将当前CIB导出到一个文件中(导出的文件存于切换crm 之前的目录)
load             import the CIB from a file #从文件内容载入CIB
graph            generate a directed graph
xml              raw xml
help             show help (help topics for list of topics) #显示帮助信息
end              go back one level #回到第一级(crm(live)#)
(3)node子命令 #节点管理和状态
crm(live)# node
crm(live)node# help
Node management and status commands.
Available commands:
status           show nodes status as XML #以xml格式显示节点状态信息
show             show node #命令行格式显示节点状态信息
standby          put node into standby #模拟指定节点离线(standby在后面必须的FQDN)
online           set node online #节点重新上线
maintenance      put node into maintenance mode
ready            put node into ready mode
fence            fence node #隔离节点
clearstate       Clear node state #清理节点状态信息
delete           delete node #删除 一个节点
attribute        manage attributes
utilization      manage utilization attributes
status-attr      manage status attributes
help             show help (help topics for list of topics)
end              go back one level
quit             exit the program
(4)ra子命令 #资源代理类别都在此处
crm(live)# ra
crm(live)ra# help
Available commands:
classes          list classes and providers # 为资源代理分类
list             list RA for a class (and provider) # 显示一个类别中的提供的资源
meta             show meta data for a RA # 显示一个资源代理序的可用参数(如meta ocf:heartbeat:IPaddr2)
providers        show providers for a RA and a class
help             show help (help topics for list of topics)
end              go back one level
quit             exit the program

14.禁用stonith设备(如果没有stonith设备,最好禁用):

这块我们要配置fence,所以stonith就不用禁用了
configure
crm(live)configure# property stonith-enabled=false
crm(live)configure# commit
crm_verify -L -V   #此时在检查就不会检查 stoith 设备了;

15.配置VIP

crm(live)#configure
crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=172.25.12.200 nic='eth0' cidr_netmask='24' broadcast='172.25.12.255'
# 只要IPaddr 不在一个以上资源代理类别下存在,ocf:heartbeat都可以省略
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# cd
crm(live)# status
Last updated: Fri May 26 20:56:39 2017
Last change: Fri May 26 20:56:34 2017 via cibadmin on server8
Stack: classic openais (with plugin)
Current DC: server8 - partition with quorum
Version: 1.1.10-14.el6-368c726
3 Nodes configured, 3 expected votes
1 Resources configured
Online: [ server6 server7 server8 

 vip    (ocf::heartbeat:IPaddr):    Started server6
 #vip在server6上运行

查看vip:

[root@server6 ~]# ip addr show eth0
2: eth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:0b:8f:1f brd ff:ff:ff:ff:ff:ff
    inet 172.25.12.6/24 brd 172.25.12.255 scope global eth0
    inet 172.25.12.100/24 brd 172.25.12.255 scope global secondary eth0
    inet6 fe80::5054:ff:fe0b:8f1f/64 scope link 
       valid_lft forever preferred_lft forever

VIP 地址已经配置成功,crm定义的资源就会传到各个节点,并在各个节点上生效,此时将server6节点转换成standby,VIP就会转移到其它节点上
[root@server6 ~]# crm
crm(live)# node
crm(live)node# standby 
crm(live)node# cd
crm(live)# status
Last updated: Fri May 26 21:01:33 2017
Last change: Fri May 26 21:01:28 2017 via crm_attribute on server6
Stack: classic openais (with plugin)
Current DC: server8 - partition with quorum
Version: 1.1.10-14.el6-368c726
3 Nodes configured, 3 expected votes
1 Resources configured


Node server6: standby
Online: [ server7 server8 ]  #现在运行的就只有server7 server8了

 vip    (ocf::heartbeat:IPaddr):    Started server8 
 #vip被转移到了server8上

查看转移后的vip:

[root@server8 ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:3e:fb:19 brd ff:ff:ff:ff:ff:ff
    inet 172.25.12.8/24 brd 172.25.12.255 scope global eth0
    inet 172.25.12.200/24 brd 172.25.12.255 scope global secondary eth0
    inet6 fe80::5054:ff:fe3e:fb19/64 scope link 
       valid_lft forever preferred_lft forever

rm node online # 再将节点重新上线,但资源并没有回来,说明它不会做 failback(资源流转)

注意:
如果集群里只有两个节点时:
将其中一个节点停止,资源就会消失而不是转移到另一个节点上,因为当前是两节点的集群,任何一个节点损坏,其它节点就没办法进行投票,status 中就会变成 WITHOUT quorum
所以我用了三个节点,当其中一个节点停止时,其他两个还能进行投票
当只剩下一个节点时,整个集群就会崩溃,上面的资源全部停掉,我们可以通过忽略投票的方式解决这个问题:
crm(live)configure# property no-quorum-policy=ignore
crm(live)configure# commit 

实验:

定义一个高可用集群:
1.VIP:172.125.12.200
2.配置apache(httpd)服务
3.定义约束,保证资源的先后启动顺序,将两个资源运行在同一个节点
4.设置fence进行跳电保护

monitor 监控资源:

monitor  [:]   [:]  

监控    哪个资源  哪个角色  多长时间监控一次  监控超时时长是多少

在做实验之前,先把之前的VIP删掉:
删除vip之前,先把它停掉

crm(live)# resource 
crm(live)resource# status
 vip    (ocf::heartbeat:IPaddr):    Started 
crm(live)resource# stop vip
crm(live)resource# status
 webip  (ocf::heartbeat:IPaddr):    Stopped 
crm(live)resource# cd
crm(live)# configure 
crm(live)configure# delete vip
crm(live)configure# commit

定义vip:

crm(live)configure# primitive webip IPaddr params ip=172.25.12.200 op monitor interval=10s timeout=20s
crm(live)configure# verify
crm(live)configure# commit 
crm(live)configure# cd
crm(live)# status
Last updated: Fri May 26 19:00:35 2017
Last change: Fri May 26 19:00:27 2017 via cibadmin on server6
Stack: classic openais (with plugin)
Current DC: server8 - partition with quorum
Version: 1.1.10-14.el6-368c726
3 Nodes configured, 3 expected votes
1 Resources configured


Node server6: standby
Online: [ server7 server8 ]

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

2.定义apache资源:

先在所有节点都装上apache
yum install httpd
不用设置启动,将开机自启关闭

crm(live)# configure 
crm(live)configure# primitive webserver lsb:httpd op monitor interval=30s timeout=15s
crm(live)configure# verify
crm(live)configure# commit 
crm(live)configure# cd
crm(live)# status
Last updated: Fri May 26 19:03:47 2017
Last change: Fri May 26 19:03:37 2017 via cibadmin on server6
Stack: classic openais (with plugin)
Current DC: server8 - partition with quorum
Version: 1.1.10-14.el6-368c726
3 Nodes configured, 3 expected votes
2 Resources configured


Node server6: standby
Online: [ server7 server8 ]

 webip  (ocf::heartbeat:IPaddr):    Started server7 
 webserver  (lsb:httpd):    Started server8

3.资源捆绑(资源粘滞):

现在两个资源都启动了,但是分散在不同节点上,默认情况下资源是尽可能均衡的运行在各节点上的;

两种解决办法:
1>. group 组资源,将两个资源定义在一起,做为一组资源而运行;
2>.colocation 也可以定义排列约束,也叫协同约束,两个资源必须在一起;

第一种比较简单:

(1)组的建立:

crm(live)configure# group webip_before_webserver webip webserver
crm(live)configure# commit 
(2)组的删除:

要删除组的话,必须先在resource里停掉组资源,再在configure里删除掉组资源,这样删除的是资源的捆绑状态,删除完之后,资源还在,不过并不是捆绑了
crm(live)# resource 
crm(live)resource# status
 Resource Group: webip_before_webserver
     vip    (ocf::heartbeat:IPaddr):    Started 
     webserver  (lsb:httpd):    Started 
crm(live)resource# stop webip_before_webserver
crm(live)resource# cd
crm(live)# configure 
crm(live)configure# delete webip_before_webserver
crm(live)configure# commit 
crm(live)configure# cd
crm(live)# resource 
crm(live)resource# status
 vip    (ocf::heartbeat:IPaddr):    Started 
 webserver  (lsb:httpd):    Started

要删除资源,顺序是一样的,先在resource里停掉资源,再在configure里删除掉资源,

第二种比较复杂:
crm(live)# configure 
crm(live)configure# colocation apache inf: webserver webip
crm(live)configure# show
node server6 \
    attributes standby="on"
node server7
node server8
primitive webip ocf:heartbeat:IPaddr \
    params ip="172.25.12.200" \
    op monitor interval="10s" timeout="20s"
primitive webserver lsb:httpd \
    op monitor interval="30s" timeout="15s"
colocation apache inf: webserver webip
property $id="cib-bootstrap-options" \
    dc-version="1.1.10-14.el6-368c726" \
    cluster-infrastructure="classic openais (with plugin)" \
    expected-quorum-votes="3" \
    stonith-enabled="false"
crm(live)configure# cd
crm(live)# status
Last updated: Fri May 26 22:37:13 2017
Last change: Fri May 26 22:16:30 2017 via cibadmin on server8
Stack: classic openais (with plugin)
Current DC: server8 - partition with quorum
Version: 1.1.10-14.el6-368c726
3 Nodes configured, 3 expected votes
2 Resources configured


Online: [ server6 server7 server8 ]

 webip  (ocf::heartbeat:IPaddr):    Started server7 
 webserver  (lsb:httpd):    Started server7
 ##两个资源都在7上了

定义顺序约束:

crm(live)configure#order webip_before_webserver mandatory: webip webserver
crm(live)configure# commit
注:mandatory 代表强制,webip、webserver 这两个资源必须按照我所给定的顺序启动

4.设置fence:

我这里所有的节点用的是虚拟机,软件fence,所有的虚拟机调用的都是物理机(真机)上的fence_virtd.service 服务

所以先在物理机上进行fence_virtd的安装:
yum install -y fence-virtd-libvirt.x86_64 fence-virtd-multicast.x86_64 fence-virtd.x86_64 
配置fence:
fence_virtd -c
Module search path [/usr/lib64/fence-virt]:
Listener module [multicast]:
Multicast IP Address [225.0.0.12]:
Multicast IP Port [1229]:
Interface [br0]:
Key File [/etc/cluster/fence_xvm.key]:
Backend module [libvirt]:
Replace /etc/fence_virt.conf with the above [y/N]? y

mkdir /etc/cluster/
cd /etc/cluster/

用随机数生成key:
dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=128 count=1

将生成的key发放到各个节点(节点上的目录如果不存在就自己建立):
scp fence_xvm.key  root@172.25.12.8:/etc/cluster/
scp fence_xvm.key  root@172.25.12.7:/etc/cluster/
scp fence_xvm.key  root@172.25.12.6:/etc/cluster/

启动fence:
systemctl start fence_virtd.service 

fence占用的是1229端口:
netstat -anulp | grep :1229

节点配置(三个节点进行一样的配置):

yum install -y fence_virt

查看:
stonith_admin -I
是否有 fence_xvm
[root@server8 ~]# stonith_admin -I
 fence_xvm
 fence_virt
 fence_pcmk
 fence_legacy


一定要确定stonith是开启状态的,要不然fence不起作用
开启stonith:

crm(live)configure# property stonith-enabled=true
crm(live)configure# commit 

在资源中加入fence:

fence默认是与资源分开在不同的节点的,除非只有一个节点

测试fence:

将server7的内核崩溃掉 观察它会不会重启:
[root@server7 ~]# echo c > /proc/sysrq-trigger
如果自动重启,则fence配置成功
实验测试:

访问 http://172.25.12.200 就能访问到server7上的http页面
将server7 standby

crm(live)node# standby server7
crm(live)node# cd
crm(live)# status
Last updated: Mon Jun  5 19:56:38 2017
Last change: Mon Jun  5 19:56:26 2017 via crm_attribute on server6
Stack: classic openais (with plugin)
Current DC: server6 - partition with quorum
Version: 1.1.10-14.el6-368c726
3 Nodes configured, 3 expected votes
3 Resources configured


Node server7: standby
Online: [ server6 server8 ]

 vmfence    (stonith:fence_xvm):    Started server6 
 Resource Group: webip_before_webserver
     vip    (ocf::heartbeat:IPaddr):    Started server8 
     webserver  (lsb:httpd):    Started server8
整个组资源就都转移到了server8上,刷新页面, http://172.25.12.200 访问的时server8上的http页面

将server7上线,资源也不会流转回来
crm(live)# status
Last updated: Mon Jun  5 19:59:38 2017
Last change: Mon Jun  5 19:59:18 2017 via crm_attribute on server7
Stack: classic openais (with plugin)
Current DC: server6 - partition with quorum
Version: 1.1.10-14.el6-368c726
3 Nodes configured, 3 expected votes
3 Resources configured


Online: [ server6 server7 server8 ]

 vmfence    (stonith:fence_xvm):    Started server6 
 Resource Group: webip_before_webserver
     vip    (ocf::heartbeat:IPaddr):    Started server8 
     webserver  (lsb:httpd):    Started server8
但是,在只有两个节点时,一个节点上运行fence(server6),一个节点上运行资源组(server7),在将server7 standby掉之后,再 online server7 资源会回流,因为它会默认将资源均衡的分配在不同节点上
关于资源回流的总结:

当资源少于节点数时,资源不会回流,
当资源等于节点数时,会发生回流,
当资源大于节点数时,会将资源重新分配(不一定是回流)

你可能感兴趣的:(pacemaker + crmsh+corosync 高可用集群)