Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

时间:2024-04-03 20:38:02

一、基础概念

1.什么是Pacemaker?

Pacemaker是 Linux环境中使用最为广泛的开源集群资源管理器, Pacemaker利用集群基础架构(Corosync或者 Heartbeat)提供的消息和集群成员管理功能,实现节点和资源级别的故障检测和资源恢复,从而最大程度保证集群服务的高可用。从逻辑功能而言, pacemaker在集群管理员所定义的资源规则驱动下,负责集群中软件服务的全生命周期管理,这种管理甚至包括整个软件系统以及软件系统彼此之间的交互。 Pacemaker在实际应用中可以管理任何规模的集群,由于其具备强大的资源依赖模型,这使得集群管理员能够精确描述和表达集群资源之间的关系(包括资源的顺序和位置等关系)。同时,对于任何形式的软件资源,通过为其自定义资源启动与管理脚本(资源代理),几乎都能作为资源对象而被 Pacemaker管理。

此外,需要指出的是, Pacemaker仅是资源管理器,并不提供集群心跳信息,由于任何高可用集群都必须具备心跳监测机制,因而很多初学者总会误以为 Pacemaker本身具有心跳检测功能,而事实上 Pacemaker的心跳机制主要基于 Corosync或 Heartbeat来实现

Pacemaker是整个高可用集群的控制中心,用来管理整个集群的资源状态行为,客户端通过 pacemaker来配置、管理、监控整个集群的运行状态。Pacemaker是一个功能非常强大并支持众多操作系统的开源集群资源管理器,Pacemaker支持主流的 Linux系统,如 Redhat的 RHEL系列、 Fedora系列、 openSUSE系列、Debian系列、 Ubuntu系列和 centos系列,这些操作系统上都可以运行 Pacemaker并将其作为集群资源管理器。

2.Pacemaker的主要功能包括:
  • 监测并恢复节点和服务级别的故障。
  • 存储无关,并不需要共享存储。
  • 资源无关,任何能用脚本控制的资源都可以作为集群服务。
  • 支持节点 STONITH功能以保证集群数据的完整性和防止集群脑裂。
  • 支持大型或者小型集群。
  • 支持 Quorum机制和资源驱动类型的集群。
  • 支持几乎是任何类型的冗余配置。
  • 自动同步各个节点的配置文件。
  • 可以设定集群范围内的 Ordering、 Colocation and Anti-colocation等约束。
  • 高级服务类型支持,例如:
     Clone功能,即那些要在多个节点运行的服务可以通过 Clone功能实现, Clone功能将会在多个节点上启动相同的服务;
     Multi-state功能,即那些需要运行在多状态下的服务可以通过 Multi–state实现,在高可用集群的服务中,有很多服务会运行在不同的高可用模式下,如:Active/Active模式或者 Active/passive模式等,并且这些服务可能会在 Active 与standby(Passive)之间切换。
  • 具有统一的、脚本化的集群管理工具。

主机环境:rhel6.5 selinux and iptables disabled

主机名 ip 服务
server1 172.25.254.1 pacemaker
server2 172.25.254.2 pacemaker
server3 172.25.254.3 nfs-utils、rpcbind

二、Pacemaker实现高可用

搭建步骤:

1.配置高级的yum源(server1、server2)

[[email protected] yum.repos.d]# vim rhel-source.repo
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.254.73/rhel6.5/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[LoadBalancer]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.254.73/rhel6.5/LoadBalancer
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[HighAvailability]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.254.73/rhel6.5/HighAvailability
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[ResilientStorage]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.254.73/rhel6.5/ResilientStorage
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[ScalableFileSystem]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.254.73/rhel6.5/ScalableFileSystem
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[[email protected] yum.repos.d]# yum clean all
[[email protected] yum.repos.d]# yum repolist

server2操作相同

[[email protected] yum.repos.d]# scp rhel-source.repo server2:/etc/yum.repos.d/
[[email protected] ~]# yum clean all
[[email protected] ~]# yum repolist

2.下软件,提供crm命令行接口,配置心跳节点,同时启动

01.安装支持crm命令行接口的软件

[[email protected] ~]# yum install pacemaker -y
[[email protected] ~]# ls
anaconda-ks.cfg                   install.log         pssh-2.3.1-2.1.x86_64.rpm
crmsh-1.2.6-0.rc2.2.1.x86_64.rpm  install.log.syslog
[[email protected] ~]# yum install pssh-2.3.1-2.1.x86_64.rpm crmsh-1.2.6-0.rc2.2.1.x86_64.rpm -y
[[email protected] ~]# yum install pacemaker -y
[[email protected] ~]# ls
anaconda-ks.cfg                   install.log         pssh-2.3.1-2.1.x86_64.rpm
crmsh-1.2.6-0.rc2.2.1.x86_64.rpm  install.log.syslog
[[email protected] ~]# yum install pssh-2.3.1-2.1.x86_64.rpm crmsh-1.2.6-0.rc2.2.1.x86_64.rpm -y

02.查看安装完成后对应生成的文件
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

03.修改配置文件(让corosync在pacemaker启动时也启动)

[[email protected] corosync]# cp corosync.conf.example corosync.conf
[[email protected] corosync]# vim corosync.conf
 10                 bindnetaddr: 172.25.254.0	#同网段
 11                 mcastaddr: 226.94.1.1		#多播地址(不需要修改)
 12                 mcastport: 5405				#多播端口
 35 service {
 36         name:pacemaker
 37         ver:0
 38 }
 [[email protected] corosync]# scp /etc/corosync/corosync.conf server2:/etc/corosync/

04.两边同时启动corosync服务

[[email protected] corosync]# /etc/init.d/corosync start
Starting Corosync Cluster Engine (corosync):               [  OK  ]
[[email protected] corosync]# /etc/init.d/corosync start
Starting Corosync Cluster Engine (corosync):               [  OK  ]

05.在server1端使用动态监控查看集群状态

[[email protected] corosync]# crm_mon

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
3.设置集群资源

  • 关于crm shell的使用   
    —crm可以显示并修改配置文件
    —直接执行crm命令进行交互式修改配置文件,交互式输入的内容被记 录在配置文件中   
    —show 显示配置文件
    —commit提交   
    —如果添加资源时出错,首先进入resource,将添加的资源stop,然后进入cofigure,delete添加错误的资源

01.进行全局资源配置,将fence设备关闭(否则服务起不来)

[[email protected] corosync]# crm
crm(live)# configure 
##因为在这里我们还没有对fence进行配置,先将stonith-enabled 设置为 false,表示资源不会迁移
crm(live)configure# property stonith-enabled=false
crm(live)configure# verify 
crm(live)configure# commit 
crm(live)configure# exit

02.在server1、server2上安装httpd,编写默认发布页

[[email protected] corosync]# yum install httpd -y
[[email protected] corosync]# vim /var/www/html/index.html
[[email protected] corosync]# cat /var/www/html/index.html 
server2

server1操作相同
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

03.设置集群资源VIP

[[email protected] corosync]# crm
crm(live)# configure 
crm(live)configure# primitive vip ocf:heartbeat:IPaddr2 params ip=172.25.254.100 nic=eth0 cidr_netmask=24
##添加vip资源,params 指定参数 op monitor
crm(live)configure# verify 
crm(live)configure# commit 

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
04.添加集群资源:httpd启动脚本

[[email protected] corosync]# crm
crm(live)# configure 
crm(live)configure# primitive apache lsb:httpd op monitor interval=10s
##lsb 添加脚本 op monitor 监控配置,interval指定执行操作的频率,单位:秒
crm(live)configure# verify 
crm(live)configure# commit 

注意:经常在/etc/init.d目录下看到的资源启动脚本便是LSB标准的资源控制脚本
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
注意:动态监控下看到此时的VIP在server1上,httpd在server2上

4.设置集群资源组

[[email protected] corosync]# crm
crm(live)# configure 
##定义组名字,将资源添加进组
crm(live)configure# group website vip apache 
crm(live)configure# verify 
crm(live)configure# commit 

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
注意:此时资源在一台服务器上

测试:

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
测试1:将server1的corosync服务停掉(在server2上开启监控)

[[email protected] corosync]# /etc/init.d/corosync status
[[email protected] corosync]# /etc/init.d/corosync stop

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

解决办法:
[[email protected] corosync]# /etc/init.d/corosync start

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
配置全局资源,忽略票选

[[email protected] corosync]# crm
crm(live)# configure 
crm(live)configure# property no-quorum-policy=
no-quorum-policy (enum, [stop]): What to do when the cluster does not have quorum
    What to do when the cluster does not have quorum  Allowed values: stop, freeze, ignore, suicide

crm(live)configure# property no-quorum-policy=ignore
 crm(live)configure# verify 
crm(live)configure# commit 

注意:选举模式:如果一个下线,另一个想获得资源(需要进行票选);默认一般为三台服务器组,当一个挂掉,另外的进行票选进行谁上线,此处是两台,当票选不够,忽略

测试2:此时将server1服务停掉

[[email protected] corosync]# /etc/init.d/corosync stop

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

三、配置fence设备

搭建步骤:

添加fence之前必须监控httpd

注意:在pacemaker默认会将fence和资源放在不同的服务器上

1.在server1、server2上建立目录

[[email protected] corosync]# mkdir /etc/cluster
[[email protected] corosync]# mkdir /etc/cluster

2.查看fence服务的状态,生成**
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

[[email protected] ~]# cd /etc/cluster/
[[email protected] cluster]# ls
fence_xvm.key
[[email protected] cluster]# rm -rf fence_xvm.key 
[[email protected] cluster]# cat /etc/fence_virt.conf

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

[[email protected] cluster]# dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=128 count=1

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

3.将**发送给server1、server2,开启服务

[[email protected] cluster]# scp fence_xvm.key [email protected]:/etc/cluster/
[[email protected] cluster]# scp fence_xvm.key [email protected]:/etc/cluster/
[[email protected] cluster]# systemctl start fence_virtd.service

4.在server1和server2上查看**是否存在
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
5.查看此时的fence设备

[[email protected] cluster]# stonith_admin -I

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

[[email protected] cluster]# stonith_admin -I

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

6.安装软件,生成fence设备

[[email protected] cluster]# yum provides */fence_xvm
[[email protected] cluster]# yum install fence-virt-0.2.3-15.el6.x86_64 -y
[[email protected] cluster]# stonith_admin -I

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

[[email protected] cluster]# yum provides */fence_xvm
[[email protected] cluster]# yum install fence-virt-0.2.3-15.el6.x86_64 -y
[[email protected] cluster]# stonith_admin -I

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

7.配置集群全局资源将之前停掉的fence服务开启,添加fence设备

[[email protected] cluster]# crm
crm(live)# configure 
crm(live)configure# property stonith-enabled=true
crm(live)configure# primitive vmfence stonith:fence_
fence_legacy   fence_pcmk     fence_virt     fence_xvm      
##自定义vmfence,将fence设备添加到server1和server2上,(hostname:虚拟机名字)
crm(live)configure# primitive vmfence stonith:fence_xvm params pcmk_host_map="server1:server1;server2:server2" op monitor interval=1min
crm(live)configure# verify 
crm(live)configure# commit 

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
在server2上监控

[[email protected] cluster]# crm_mon

此时可以看到fence设备和资源分别被加在不同的服务器上

测试:

测试1:将httpd服务关闭,会发现fence会自己启动httpd
(此时的httpd服务在server2上开启的,ip资源也在server2)

[[email protected] cluster]# /etc/init.d/httpd status
[[email protected] cluster]# ip addr show

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

测试2:模拟server2的内核故障
在server1监控
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

[[email protected] cluster]# echo c >/proc/sysrq-trigger

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
注意:会发现fence设备和资源都被加在同一台服务器,会出现报错
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

测试3:在server1监控:将server2的服务开启会发现资源和fence设备分配在不同服务器
将server2和server1的corosync设置开机自启

[[email protected] ~]# /etc/init.d/corosync status
corosync is stopped
[[email protected] ~]# /etc/init.d/corosync start
[[email protected] ~]# chkconfig corosync on
[[email protected] cluster]# chkconfig corosync on

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

测试4:在server2上监控:将server1的网络关闭,会发现fence设备和资源被分配到一台服务器上

[[email protected] cluster]# /etc/init.d/network stop

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
将server1重新连接,会发现fence设备和资源重新被分配到不同服务器
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

四、NFS共享存储

搭建步骤:

1.安装nfs共享存储需要的软件,开服务

[[email protected] ~]# yum install nfs-utils rpcbind -y
[[email protected] ~]# /etc/init.d/rpcbind start

2.建立一个目录用来共享

[[email protected] ~]# mkdir -p /web/htdocs
[[email protected] ~]# chmod o+x /web/htdocs/
[[email protected] ~]# ll -d /web/htdocs/
drwxr-xr-x 2 root root 4096 Apr 17 07:20 /web/htdocs/

3.编辑nfs共享文件策略

[[email protected] ~]# vim /etc/exports
 1 /web/htdocs 172.25.254.0/24(rw)
 [[email protected] ~]# exportfs -r
[[email protected] ~]# showmount -e
clnt_create: RPC: Program not registered

4.在共享目录里写入东西

[[email protected] ~]# cd /web/htdocs/
[[email protected] htdocs]# vim index.html
[[email protected] htdocs]# cat index.html 
hello world

5.开启服务

[[email protected] htdocs]# /etc/init.d/rpcbind status
rpcbind (pid  1064) is running...
[[email protected] htdocs]# /etc/init.d/nfs start

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

6.在server1和server2上测试挂载情况

[[email protected] ~]# mount -t nfs 172.25.254.3:/web/htdocs /mnt

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

[[email protected] ~]#  mount -t nfs 172.25.254.3:/web/htdocs /mnt

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

7.添加集群资源(前提:将已挂载设备卸载,确保服务端rpcbind、nfs服务开启)
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

[[email protected] ~]# crm
crm(live)# configure 
crm(live)configure# primitive webdata ocf:heartbeat:Filesystem params device="172.25.254.3:/web/htdocs" directory="/var/www/html" fstype="nfs" op monitor interval=20s
crm(live)configure# verify 
WARNING: webdata: default timeout 20s for start is smaller than the advised 60
WARNING: webdata: default timeout 20s for stop is smaller than the advised 60
WARNING: webdata: default timeout 20s for monitor is smaller than the advised 40
crm(live)configure# commit 
WARNING: webdata: default timeout 20s for start is smaller than the advised 60
WARNING: webdata: default timeout 20s for stop is smaller than the advised 60
WARNING: webdata: default timeout 20s for monitor is smaller than the advised 40
crm(live)configure# 

注意:报错是因为默认响应最短时间必须是40s,此处的设置小于了默认,无影响

8.在server2上监控查看信息( 此时文件系统和vip与apache不在同一服务器上 )
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

将之前的组信息删除,建立新的组并添加资源
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

crm(live)configure# cd
crm(live)# resource 
crm(live)resource# show
 Resource Group: website
     vip	(ocf::heartbeat:IPaddr2):	Started 
     apache	(lsb:httpd):	Started 
 vmfence	(stonith:fence_xvm):	Started 
 webdata	(ocf::heartbeat:Filesystem):	Started 
crm(live)resource# stop website
crm(live)resource# show
 Resource Group: website
     vip	(ocf::heartbeat:IPaddr2):	Stopped 
     apache	(lsb:httpd):	Stopped 
 vmfence	(stonith:fence_xvm):	Started 
 webdata	(ocf::heartbeat:Filesystem):	Started 
crm(live)resource# cd
crm(live)# configure 
delcrm(live)configure# delete website

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

crm(live)configure# group webgroup vip webdata apache

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

测试:

此时在监控下查看,三个资源在同一服务器下
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

测试1:将server2下线:(监控下会发现fence设备和资源都在同一服务器)

[[email protected] ~]# crm
crm(live)# node 
crm(live)node# show
server2: normal
server1: normal
crm(live)node# standby server2
crm(live)node# show
server2: normal
	standby: on
server1: normal
crm(live)node# 

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

测试2:将server2上线:(监控下会发现三个资源在一台服务器上,fence设备在一台服务器上)

crm(live)node# show
server2: normal
	standby: on
server1: normal
crm(live)node# online server2
crm(live)node# show
server2: normal
	standby: off
server1: normal

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

###########################################################################

如何合理删除资源?

先将组停止,再将组删除
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

如何设置资源组里的顺序?

crm(live)resource# cd
crm(live)# configure 
crm(live)configure# order vip_brefore_webdata_apache Mandatory: vip webdata apache 

注意:顺序约束(Order):顺序约束限定了资源之间的启动顺序。
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

如何设置资源回切?

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

crm(live)resource# cd
crm(live)# configure 
crm(live)configure# group website vip apache
crm(live)configure# verify 
comcrm(live)configure# commit 

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

测试:在server1监控:将server2的corosync服务停掉,发现server1抢了资源,当开启server2的服务时资源不会回切

[[email protected] ~]# /etc/init.d/corosync stop
Signaling Corosync Cluster Engine (corosync) to terminate: [  OK  ]
Waiting for corosync services to unload:..                 [  OK  ]

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

[[email protected] ~]# /etc/init.d/corosync start
Starting Corosync Cluster Engine (corosync):               [  OK  ]

Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)

解决:

[[email protected] ~]# crm
crm(live)# configure 
crm(live)configure# location website_on_server2 website 50: server2
crm(live)configure# verify 
crm(live)configure# commit 

注意:位置约束(Location):位置约束限定了资源应该在哪个集群节点上启动运行。
Pacemaker + Corosync 集群高可用的实现(Fence、nfs共享存储)
注意:设置完成后监控下发现资源回到server2上