序言
高可用集群,是指以减少服务中断(如因服务器宕机等引起的服务中断)时间为目的的服务器集群技术。简单的说,集群就是一组计算机,它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统就是集群的节点。
高可用集群的出现是为了减少由计算机硬件和软件易错性所带来的损失。它通过保护用户的业务程序对外不间断提供的服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度。如果某个节点失效,它的备援节点将在几秒钟的时间内接管它的职责。因此,对于用户而言,集群永远不会停机。高可用集群软件的主要作用就是实现故障检查和业务切换的自动化
一、pacemaker+corosync基本了解
Corosync是集群管理套件的一部分,他在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等。也就是说,corosync是Messaging Layer集群信息层软件,需要pacemaker资源管理器,才能构成一个完整的高可用集群。它也是运行于心跳层的开源软件。(是集群框架引擎程序)
Pacemaker也就是Cluster Resource Manager(简称CRM),,是一个集群资源管理器。它利用群集基础构建(corosync或heartbeat)提供的消息和成员管理能力来探测并从节点或资源级别的故障中恢复,以实现群集服务的最大可用性。
Pacemaker和corosync,前者用于资源的转移,后者用于心跳的检测。结合起来使用,实现对高可用架构的自动管理。心跳检测使用来检测服务器是否还在提供服务,若出现服务器异常,就认为它挂掉了,此时pacemaker将会对资源进行转移。
Crmsh是pacemaker的命令行工具
二、深入理解pacemaker+corosync
1、Corosync
先来看几个名词:
API:
(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
linux API
在linux中,用户编程接口API遵循了UNIX中最流行的应用编程界面标准—POSIX标准。POSIX标准是由IEEE和ISO/IEC共同开发的标准系统。该标准基于当时现有的UNIX实践和经验,描述了操作系统的系统调用编程接口API,用于保证应用程序可以在源程序一级上在多种操作系统上移植运行。这些系统调用编程接口主要是通过C库(LIBC)来实现的。
AIS和OpenAIS简介
AIS应用接口规范,是用来定义应用程序接口(API)的开放性规范的集合,这些应用程序作为中间件为应用服务提供一种开放、高移植性的程序接口。是在实现高可用应用过程中是亟需的。服务可用性论坛(SA Forum)是一个开放性论坛,它开发并发布这些免费规范。使用AIS规范的应用程序接口(API),可以减少应用程序的复杂性和缩短应用程序的开发时间,这些规范的主要目的就是为了提高中间组件可移植性和应用程序的高可用性。
OpenAIS是基于SA Forum 标准的集群框架的应用程序接口规范。OpenAIS提供一种集群模式,这个模式包括集群框架,集群成员管理,通信方式,集群监测等,能够为集群软件或工具提供满足 AIS标准的集群接口,但是它没有集群资源管理功能,不能独立形成一个集群。
Corosync概述
Corosync是OpenAIS发展到Wilson版本后衍生出来的开放性集群引擎工程。可以说Corosync是OpenAIS工程的一部分。OpenAIS从openais0.90开始独立成两部分,一个是Corosync;另一个是AIS标准接口Wilson。Corosync包含OpenAIS的核心框架用来对Wilson的标准接口的使用、管理。它为商用的或开源性的集群提供集群执行框架。Corosync执行高可用应用程序的通信组系统,它有以下特征:
一个封闭的程序组(A closed process group communication model)通信模式,这个模式提供一种虚拟的同步方式来保证能够复制服务器的状态。
一个简单可用性管理组件(A simple availability manager),这个管理组件可以重新启动应用程序的进程当它失败后。
一个配置和内存数据的统计(A configuration and statistics in-memory database),内存数据能够被设置,回复,接受通知的更改信息。
一个定额的系统(A quorum system�),定额完成或者丢失时通知应用程序。
不管heartbeat,还是corosync都是高可用集群中的Cluster Messaging Layer(集群信息层),是主要传递发集群信息与心跳信息的,并没有资源管理功能,资源管理还得依赖于上层的crm(Cluster resource Manager,集群资源管理器),最著名的资源管理器,就是pacemaker,它是heartbeat v3分离出去的子项目。
现在corosync+pacemaker成了高可用集群中的最佳组合。
2、pacemaker
pacemaker(直译:心脏起搏器),是一个群集资源管理器。它实现最大可用性群集服务(亦称资源管理)的节点和资源级故障检测和恢复使用您的首选集群基础设施(OpenAIS的或Heaerbeat)提供的消息和成员能力。
它可以做乎任何规模的集群,并配备了一个强大的依赖模型,使管理员能够准确地表达群集资源之间的关系(包括顺序和位置)。几乎任何可以编写脚本,可以管理作为心脏起搏器集群的一部分。Heartbeat 到了V3版本后,拆分为多个项目,其中pacemaker就是拆分出来的资源管理器。
Heartbeat 3.0拆分之后的组成部分:
Heartbeat:将原来的消息通信层独立为heartbeat项目,新的heartbeat只负责维护集群各节点的信息以及它们之前通信;
Cluster Glue:相当于一个中间层,它用来将heartbeat和pacemaker关联起来,主要包含2个部分,即为LRM和STONITH。
Resource Agent:用来控制服务启停,监控服务状态的脚本集合,这些脚本将被LRM调用从而实现各种资源启动、停止、监控等等。
Pacemaker : 也就是Cluster Resource Manager (简称CRM),用来管理整个HA的控制中心,客户端通过pacemaker来配置管理监控整个集群。
群集组件说明:
stonithd:心跳系统。
lrmd:本地资源管理守护进程。它提供了一个通用的接口支持的资源类型。直接调用资源代理(脚本)。
pengine:政策引擎。根据当前状态和配置集群计算的下一个状态。产生一个过渡图,包含行动和依赖关系的列表。
CIB:群集信息库。包含所有群集选项,节点,资源,他们彼此之间的关系和现状的定义。同步更新到所有群集节点。
CRMD:集群资源管理守护进程。主要是消息代理的PEngine和LRM,还选举一个领导者(DC)统筹活动(包括启动/停止资源)的集群。
OpenAIS:OpenAIS的消息和成员层。
Heartbeat:心跳消息层,OpenAIS的一种替代。
CCM:共识群集成员,心跳成员层
功能概述:
CIB使用XML表示集群的集群中的所有资源的配置和当前状态。CIB的内容会被自动在整个集群中同步,使用PEngine计算集群的理想状态,生成指令列表,然后输送到DC(指定协调员)。Pacemaker 集群中所有节点选举的DC节点作为主决策节点。如果当选DC节点宕机,它会在所有的节点上, 迅速建立一个新的DC。DC将PEngine生成的策略,传递给其他节点上的LRMd(本地资源管理守护程序)或CRMD通过集群消息传递基础结构。当集群中有节点宕机,PEngine重新计算的理想策略。在某些情况下,可能有必要关闭节点,以保护共享数据或完整的资源回收。为此,Pacemaker配备了stonithd设备。STONITH可以将其它节点“爆头”,通常是实现与远程电源开关。Pacemaker会将STONITH设备,配置为资源保存在CIB中,使他们可以更容易地监测资源失败或宕机。
三、搭建步骤
搭建环境:
(selinux关闭,防火墙关闭)
node1: 172.25.70.2 server2
node2: 172.25.70.3 server3
vip 172.25.70.100
四、pacemaker+corosync实现负载均衡
1、配置高级yum源
两个节点都配置:
[root@server2 ~]# vim /etc/yum.repos.d/rhel-source.repo
==========================================================
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.70.250/rhel6.5
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[LoadBalancer]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.70.250/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.70.250/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.70.250/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.70.250/rhel6.5/ScalableFileSystem
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
============================================================
[root@server2 ~]# yum clean all
[root@server2 ~]# yum repolist
同步给node2:
[root@server2 ~]# scp /etc/yum.repos.d/rhel-source.repo root@172.25.70.3:/etc/yum.repos.d/
[root@server2 ~]# yum clean all
[root@server2 ~]# yum repolist
2、安装配置corosync、pacemaker
两个节点都装上软件
yum install pacemaker crmsh-1.2.6-0.rc2.2.1.x86_64.rpm pssh-2.3.1-2.1.x86_64.rpm -y
server2
server3
3、查看生成的文件
ls /etc/corosync/
server2
server3
4、修改配置文件
[root@server2 ~]# cd /etc/corosync/
[root@server2 corosync]# cp corosync.conf.example corosync.conf
[root@server2 corosync]# vim corosync.conf
===========================================
2 compatibility: whitetank
3
4 totem {
5 version: 2
6 secauth: off
7 threads: 0
8 interface {
9 ringnumber: 0
10 bindnetaddr: 172.25.75.0
11 mcastaddr: 226.94.1.1
12 mcastport: 5405
13 ttl: 1
14 }
15 }
35 service {
36 name:pacemaker
37 ver:0
38 }
将server2的pacemaker的配置文件,远程同步给server3:
[root@server2 corosync]# scp corosync.conf root@server3:/etc/corosync/
The authenticity of host 'server3 (172.25.70.3)' can't be established.
RSA key fingerprint is 18:f0:6b:62:c5:35:78:f0:aa:22:b3:b3:07:bc:65:73.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server3,172.25.70.3' (RSA) to the list of known hosts.
root@server3's password:
corosync.conf 100% 481 0.5KB/s 00:00
[root@server2 corosync]#
5、node1、node2同时启动corosync服务
server2
[root@server2 corosync]# /etc/init.d/corosync start
Starting Corosync Cluster Engine (corosync): [ OK ]
[root@server2 corosync]#
server3
[root@server3 ~]# /etc/init.d/corosync start
Starting Corosync Cluster Engine (corosync): [ OK ]
[root@server3 ~]#
6、动态监控
在node2上动态监控
crm_mon
7、进入crm编辑界面
crm
虚拟窗口功能:
configure 节点
primitive:配置主资源
resource 资源管理器
cib 资源管理窗口
node 节点的管理
verify:语法检测
commit:保存
property:全局资源配置
8、node1上关闭fence设备(否则服务起不来)
[root@server2 corosync]# crm
crm(live)# configure
crm(live)configure# property stonith-enabled=false
crm(live)configure# verify
crm(live)configure# commit
9、node1上设置集群资源VIP
[root@server2 corosync]# crm
crm(live)# configure
crm(live)configure# primitive vip ocf:heartbeat:IPaddr2 params ip=172.25.70.100 nic=eth0 cidr_netmask=24
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure#
如果添加资源添加错了,进入resource先将资源组停掉,再将资源停掉,然后进configure里删除:crm---->resource---->show---->stop vip---->cd---->configure---->show---->delete vip或者edit在配置文件里删除此时node2动态监控查看到的状态:
10、node1上配置apache服务
1、在node1、node2上安装httpd,编写默认发布页
yum install httpd -y
vim /var/www/html/index.html
server2
server3
2、添加资源:启动脚本
[root@server2 corosync]# crm
crm(live)# configure
crm(live)configure# primitive apache lsb:httpd op monitor interval=10s
crm(live)configure# verify
crm(live)configure# commit
注意:node2动态监控下看到此时的VIP在server2上,httpd在server3上
11、node1设置资源组
crm(live)configure# group website vip apache
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure#
此时vip、apache资源都在一台服务器上
12、测试
测试1:
测试2:将server2的corosync服务停掉
[root@server2 corosync]# /etc/init.d/corosync stop
Signaling Corosync Cluster Engine (corosync) to terminate: [ OK ]
Waiting for corosync services to unload:. [ OK ]
[root@server2 corosync]#
重新访问vip:
无法访问!
13、node1上设置后端服务器负载均衡
[root@server2 corosync]# crm
crm(live)# configure
crm(live)configure# property no-quorum-policy=ignore
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure#
注意: 默认一般为三台服务器组,当一个挂掉,另外的进行票选进行谁上线,此处是两台,当票选不够,忽略
测试:
将server2上的corosync服务停掉:
[root@server2 corosync]# /etc/init.d/corosync stop
Signaling Corosync Cluster Engine (corosync) to terminate: [ OK ]
Waiting for corosync services to unload:. [ OK ]
node2动态监控可以看到:
apache服务组在server3上运行了!客户端访问:
五、配置fence设备
在pacemaker默认会将fence和资源放在不同的服务器上
1、在server2、server3上建立目录
[root@server2 corosync]# mkdir /etc/cluster
[root@server3 ~]# mkdir /etc/cluster
server2
server3
2、查看fence服务的状态,生成密钥
[root@vits ~]# systemctl status fence_virtd.service
● fence_virtd.service - Fence-Virt system host daemon
Loaded: loaded (/usr/lib/systemd/system/fence_virtd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Apr 26 13:57:23 vits systemd[1]: [/usr/lib/systemd/system/fence_virtd.servi...ed
Hint: Some lines were ellipsized, use -l to show in full.
[root@vits ~]# cd /etc/cluster/
[root@vits cluster]# ls
fence_xvm.key
[root@vits cluster]# rm -fr fence_xvm.key
[root@vits cluster]# dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=128 count=1
1+0 records in
1+0 records out
128 bytes (128 B) copied, 0.000186138 s, 688 kB/s
[root@vits cluster]# ls
fence_xvm.key
[root@vits cluster]#
3、将密钥发送给server1、server2,开启服务
[root@vits cluster]# scp fence_xvm.key root@server2:/etc/cluster/
[root@vits cluster]# scp fence_xvm.key root@server3:/etc/cluster/
开启fence_virtd服务
[root@vits cluster]# systemctl start fence_virtd.service
4、在server2和server3上查看密钥是否存在
server2
server3
5、在node1、node2上查看此时的fence设备
stonith_admin -I
server2
server3
6、在node1、node2上安装软件,生成fence设备
yum provides */fence_xvm
yum install fence-virt-0.2.3-15.el6.x86_64 -y
stonith_admin -I
server2
server3
7、在node1上将之前停掉的corosync服务开启,添加fence设备
[root@server2 cluster]# crm
crm(live)# configure
crm(live)configure# property stonith-enabled=true
crm(live)configure# primitive vmfence stonith:fence_xvm params pcmk_host_map="server2:server2;server3:server3" op monitor interval=1min
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# exit
bye
此时在node2上监控:
可以看到fence设备和资源分别被加在不同的服务器上
8、测试
测试1:
此时的httpd服务在server3上开启的,ip也是添加的
/etc/init.d/httpd status
ip addr show eth0
将server3上的httpd服务关掉,会发现fence会自己启动httpd
测试2:模拟server2的内核故障
在server2上监控:
crm_mon
会发现fence设备和资源都被加在同一台服务器,会出现报错
模拟server3内核故障:
echo c >/proc/sysrq-trigger
server3会重启!!!
测试3:将server3和server2的corosync开机自启
[root@server3 ~]# /etc/init.d/corosync status
corosync is stopped
[root@server3 ~]# chkconfig corosync on
[root@server3 ~]#
===============================================
[root@server2 ~]# chkconfig corosync on
server2
server3
在server2监控:将server3的服务开启会发现资源和fence设备分配在不同服务器
测试4:
在server3上监控:
将server2的网络关闭
将server2重新连接,会发现fence设备和资源重新被分配到不同服务器