一、高可用集群的衡量标准
HA(High Available), 高可用性群集是通过系统的可靠性(reliability)和可维护性(maintainability)来度量的。工程上,通常用平均无故障时间(MTTF)来度量系统的可靠性,用平均维修时间(MTTR)来度量系统的可维护性。于是可用性被定义为:HA=MTTF/(MTTF+MTTR)*100%
具体HA衡量标准:
99% 一年宕机时间不超过4天
99.9% 一年宕机时间不超过10小时
99.99% 一年宕机时间不超过1小时
99.999% 一年宕机时间不超过6分钟
~~~~~~~~~~~~~~~~
高可用集群可分为三个层次结构,分别由红色部分的Messaging与Membership层,蓝色部分的Cluster Resource Manager(CRM)层,绿色部分的Local Resource Manager(LRM)与Resource Agent(RA)组成,下面我们就来具体说明(如上图),
1.位于最底层的是信息和成员关系层(Messaging and Membership),Messaging主要用于节点之间传递心跳信息,也称为心跳层。节点之间传递心跳信息可以通过广播,组播,单播等方式。成员关系(Membership)层,这层最重要的作用是主节点(DC)通过Cluster Consensus Menbership Service(CCM或者CCS)这种服务由Messaging层提供的信息,来产生一个完整的成员关系。这层主要实现承上启下的作用,承上,将下层产生的信息生产成员关系图传递给上层以通知各个节点的工作状态;启下,将上层对于隔离某一设备予以具体实施。
2.集群资源管理层(Cluster Resource Manager),真正实现集群服务的层。在该层中每个节点都运行一个集群资源管理器(CRM,cluster Resource Manager),它能为实现高可用提供核心组件,包括资源定义,属性等。在每一个节点上CRM都维护有一个CIB(集群信息库 XML文档)和LRM(本地资源管理器)组件。对于CIB,只有工作在DC(主节点)上的文档是可以修改的,其他CIB都是复制DC上的那个文档而来的。对于LRM,是执行CRM传递过来的在本地执行某个资源的执行和停止的具体执行人。当某个节点发生故障之后,是由DC通过PE(策略引擎)和TE(实施引擎)来决定是否抢夺资源。
资源管理器为每个资源提供了一种属性,成为资源粘性,同样也提供了3种约束关系:
位置约束通过数值来表示资源带当前节点上的依赖性,正数依赖性强,负数排斥性强。
排列约束定义资源之间的倾向性(耦合性),正数表示资源间依赖高,负数排斥高
顺序约束定义资源间的启动先后顺序。
3.资源代理层(Resource Agents),集群资源代理(这里要先说明一下资源的概念,所谓资源就是实现高可用功能所需要的各种应用,比如vip、httpd服务、director服务、文件系统服务、ftpd服务等等都可以称为资源,那么资源多种多样,CRM如何调度各种资源呢,这个就由资源代理完成,资源代理包含很多资源脚本,能够管理本节点上的属于集群资源的某一资源的启动,停止和状态信息),资源代理分为:
LSB linux standard base(/etc/init.d/*)
OCF open cluster framwork (比LSB更专业,更加通用)
Legacy heartbeat(v1版本的资源管理)。
~~~~~~~~~~~
核心组件的具体说明(如上图):
1.ccm组件(Cluster Consensus Menbership Service):作用,承上启下,监听底层接受的心跳信息,当监听不到心跳信息的时候就重新计算整个集群的票数和收敛状态信息,并将结果转递给上层,让上层做出决定采取怎样的措施,ccm还能够生成一个各节点状态的拓扑结构概览图,以本节点做为视角,保证该节点在特殊情况下能够采取对应的动作。
2.crmd组件(Cluster Resource Manager,集群资源管理器,也就是pacemaker):实现资源的分配,资源分配的每个动作都要通过crm来实现,是核心组建,每个节点上的crm都维护一个cib用来定义资源特定的属性,哪些资源定义在同一个节点上。
3.cib组件(集群信息基库,Cluster Infonation Base):是XML格式的配置文件,在内存中的一个XML格式的集群资源的配置文件,主要保存在文件中,工作的时候常驻在内存中并且需要通知给其它节点,只有DC上的cib才能进行修改,其他节点上的cib都是拷贝DC上。配置cib文件的方法有,基于命令行配置和基于前台的图形界面配置。
4.lrmd组件(Local Resource Manager,本地资源管理器):用来获取本地某个资源的状态,并且实现本地资源的管理,如当检测到对方没有心跳信息时,来启动本地的服务进程等。
5.pengine组件:
PE(Policy Engine):策略引擎,来定义资源转移的一整套转移方式,但只是做策略者,并不亲自来参加资源转移的过程,而是让TE来执行自己的策略。
TE(Transition Engine): 就是来执行PE做出的策略的并且只有DC上才运行PE和TE。
6.stonithd组件
STONITH(Shoot The Other Node in the Head,”爆头“), 这种方式直接操作电源开关,当一个节点发生故障时,另 一个节点如果能侦测到,就会通过网络发出命令,控制故障节点的电源开关,通过暂时断电,而又上电的方式使故障节点被重启动, 这种方式需要硬件支持。
STONITH应用案例(主从服务器),主服务器在某一端时间由于服务繁忙,没时间响应心跳信息,如果这个时候备用服务器一下子把服务资源抢过去,但是这个时候主服务器还没有宕掉,这样就会导致资源抢占,就这样用户在主从服务器上都能访问,如果仅仅是读操作还没事,要是有写的操作,那就会导致文件系统崩溃,这样一切都玩了,所以在资源抢占的时候,可以采用一定的隔离方法来实现,就是备用服务器抢占资源的时候,直接把主服务器给STONITH,就是我们常说的”爆头 ”。
HA的架构层次:
从下向上讲:
1.Messageing and Infrastructure Layer (信息基础架构层):
传递心跳信息的非常重要的子层,通过单独的服务组件来实现,除了心跳信息,还传递集群事务信息
常见套件:
heartbeat,
keepalive
corosync/openais
RHCS cman
2.Membership 成员层: <套件-----pacemaker(心脏起搏器),cman
(CCM,成员信息)
重新收敛集群成员信息,生成一个概览图,为第三层采取动作提供信息
3.Resource Allocation资源分配层(CRM)
heartbeat v1:haresources (/etc/ha.d/ha.cf、/etc/ha.d/haresources)
heartbeat v2:crm(/var/heartbeat/crm/cib.xml)
heartbeat v3:(heartbeat、luster-glue、pacemaker)
RHCS(5/红帽集群套件):cman、rgmanager
RHCS(6/红帽集群套件)(提供两套组件):
heartbeat+pacemaker
cman+pacemaker
corosync+pacemaker(corosync依赖heartbeat的RA文件。)
cman+rgmanager
Cluster Resource Manage(集群资源管理)
LRM,决策本地资源(local resource manage)。定义资源的属性,反映本地资源的信息
policy engine(PE) 策略引擎,做决策
transition engine (TE) 执行引擎,执行策略引擎做的决定
Cluster information Base 集群信息基础,他是一个包括membership,resoutces,constraints的XML文,在任意一个节点上使用命令进行修改,都会自动的同步到主节点DC的配置文件中去
4.Resource Layer(资源层)
Resource Agent资源代理:就是运行具体的服务,服务启动的脚本,数据文件等资源整体结构如下图所示:
LSB linux standard base(/etc/init.d/*)
OCF open cluster framwork (比LSB更专业,更加通用)
Legacy heartbeat(v1版本的资源管理)。
隔离:
节点级别:电源交换机
资源级别:
编辑HA配置文件的方法:
1、直接修改xml格式的文件
2、通过CLI命令行工具进行编辑
crmsh
pcs
3、图形化编辑工具:
heartbeat-gui、LCMC、PYGUI、RHCS的conga(luci/ricci)
集群分裂时,一定要确保少数派的集群节点不在争用资源,就必须采取必要措施,对于非再为集群节点时,处理策略常有:
stopped
ignore
freeze
suicide
对于集群的隔离方法,前面也已经介绍过,主要是节点上的stonth,和资源的fence,这些都是启动集群的关键,没有他们集群启动不了。
资源类型:
primitive、native:主资源,只能运行在一个节点上的资源,称为主资源
group:组资源,一个包含其他资源的容器,也是只能运行在一个节点上。
clone:克隆资源,需要在多个节点上运行的资源。
master/salve:主从资源
集群模式:
active/passive
active/active
N-1/n:表示n-1个节点运行服务,每个节点运行不同的服务,当有一个节点故障,另一个节点替换上。
N/n:同样是n个节点运行服务,每个节点运行不同的任意一个服务,当有一个节点故障,另外一个节点接替他的工作,同时运行两个不同的服务。
对于双节点集群,需要使用第三方的方法确定集群节点的正确性,比如提供多个ping node(ping节点) ,RHCS的qdisk工具(仲裁磁盘,就是主活动节点定期往仲裁磁盘写数据,从节点检查,如果长期没有写入数据,并且和主节点联系不上,就认为主节点“丢失”)
参考文献:
二、HeartBeat组件实现服务器的高可用(HA)
最基本高可用web服务
1、环境及条件
1.1平台:centos6.5以上、heartbeat-2.1.4(crm层使用haresources、message层使用heartbeat)
1.2配置HA集群的前提条件:
至少2个节点
共享存储(可选)
stonith(隔离方法)
关闭防火墙
关闭selinux
时间同步
节点间通信是通过主机名访问的(通过定义主机名和hosts来进行解析)
“已存在集群”,至少要事先配置好一个节点,提供基本集群配置和配置文件,可以先没有资源。
SSH互信,要求秘钥认证
1.3集群准备工作
心跳信息
物理链接:串行链接、以太网链接
通信方式:单播、组播、广播
双节点竞争规则:ping node / qdisk
2、具体步骤:
节点1:node1.dtedu.com 192.168.1.11
节点2:node2.dtedu.com 192.168.1.12
Vip:192.168.1.13
2.1各个节点创建域名并相互解析
[root@node1.dtedu.com~]$vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node1.dtedu.com
[root@node1.dtedu.com~]$cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.12node2.dtedu.com node2
192.168.1.11node1.dtedu.com node1
2.2同步节点的时间
[root@node1.dtedu.com~]$crontab -l
* */20 * * * /usr/sbin/ntupdate time.windows.com
2.3建立节点间SSH互信
[root@node2.dtedu.com ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
4d:c9:1f:d4:f2:62:8c:69:01:ee:58:5d:31:a4:66:6f root@node2.dtedu.com
The key's randomart p_w_picpath is:
+--[ RSA 2048]----+
| .. .*o |
| . o.=... |
| o O=.o |
| + =+o+.. |
| . S...E. |
| . |
| |
| |
| |
+-----------------+
[root@node2.dtedu.com ~]# ssh-copy-id 192.168.1.11
root@192.168.1.11's password:
Now try logging into the machine, with "ssh '192.168.1.11'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
2.4rpm安装heartbeat-2.1.4,libnet默认yum仓库没有,需要安装epel仓库才能安装libnet。
heartbeat-2.1.4-12.el6.x86_64.rpm
heartbeat_2.1.4.orig.tar
heartbeat-debuginfo-2.1.4-12.el6.x86_64.rpm
heartbeat-devel-2.1.4-12.el6.x86_64.rpm
heartbeat-gui-2.1.4-12.el6.x86_64.rpm
heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm
heartbeat-pils-2.1.4-12.el6.x86_64.rpm
heartbeat-stonith-2.1.4-12.el6.x86_64.rpm
[root@node1.dtedu.com~]$rpm -ivh epel-release-latest-6.noarch.rpm
[root@node1.dtedu.com~]$yum -y install glib2-devel libnet-devel libtool-ltdl-devel net-snmp-devel bzip2-devel libxml2-devel openhpi-libs gnutls-devel python-devel gettext PyXML perl-MailTools perl-TimeDate libnet pygtk2-libglade pygtk2
[root@node1.dtedu.com~]$yum install perl-Compress-Raw-Zlib perl-Compress-Zlib perl-HTML-Parser perl-HTML-Tagset perl-IO-Compress-Base perl-IO-Compress-Zlib perl-URI perl-libwww-perl
[root@node1.dtedu.com~]$rpm -ivh *.rpm
Preparing... ########################################### [100%]
1:heartbeat-pils ########################################### [ 14%]
2:heartbeat-stonith ########################################### [ 29%]
3:heartbeat ########################################### [ 43%]
4:heartbeat-devel ########################################### [ 57%]
5:heartbeat-gui ########################################### [ 71%]
6:heartbeat-ldirectord ########################################### [ 86%]
7:heartbeat-debuginfo ########################################### [100%]
2.5配置文件/etc/ha.d/
authkeys:认证文件,要求文件权限是600
ha.cf:主配置文件
haresources:配置资源
注意:以上三个文件都需要从heartbeat的样例中拷贝。
[root@node1.dtedu.com~]$cp /usr/share/doc/heartbeat-2.1.4/authkeys /etc/ha.d/
[root@node1.dtedu.com~]$cp /usr/share/doc/heartbeat-2.1.4/ha.cf /etc/ha.d/
[root@node1.dtedu.com~]$cp /usr/share/doc/heartbeat-2.1.4/haresources /etc/ha.d/
2.6安装并关闭启动web服务功能
[root@node1.dtedu.com~]$service httpd status
httpd (pid 3766) is running...
[root@node1.dtedu.com~]$service httpd stop
Stopping httpd: [ OK ]
[root@node1.dtedu.com~]$chkconfig httpd off
[root@node1.dtedu.com~]$chkconfig --list httpd
httpd 0:关闭1:关闭2:关闭3:关闭4:关闭5:关闭6:关闭
[root@node1.dtedu.com~]$
2.7配置authkeys文件,并添加随机数作为认证秘钥。
auth 2
#1 crc
2 sha1 HI!aji1232342iadfa-
#3 md5 Hello!
2.8配置ha.cf主配置文件
bcast eth1
表示在eth1接口上使用广播heartbeat(将eth1替换为eth0,eth2,或者您使用的任何接口)。
keepalive 2
设定heartbeat之间的通信时间间隔为2秒。
warntime 10
在日志中发出“late heartbeat“警告之前等待的时间,单位为秒。
deadtime 30
在30秒后宣布节点死亡。
initdead 120
在某些配置下,重启后网络需要一些时间才能正常工作。这个单独的”deadtime”选项可以处理这种情况。它的取值至少应该为通常deadtime的两倍。
udpport 694
使用端口694进行bcast和ucast通信。这是默认的,并且在IANA官方注册的端口号。
auto_failback on
该选项是必须配置的。在failover之前,haresources文件中列出的主节点掌握所有的资源,之后从节点接管这些资源。当auto_failback设置为on时,一旦主节点重新恢复联机,将从从节点取回所有资源。若该选项设置为off,主节
[root@node1.dtedu.com~]$cat /etc/ha.d/ha.cf |grep -v ^$ |grep -v ^#
logfile/var/log/ha-log
keepalive 3
mcast eth0 224.5.6.7 694 1 0
auto_failback on
ping 192.168.1.1
node node1.dtedu.com
Node node2.dtedu.com
2.9 配置haresources
配置好ha.cf文件之后,便是haresources文件。该文件列出集群所提供的服务以及服务的默认所有者。 其配置语句格式如下:
node-name network-config
其中node-name指定双机系统的主节点,取值必须匹配ha.cf文件中node选项设置的主机名中的一个,node选项设置的另一个主机名成为从节点。network-config用于网络设置,包括指定集群IP、子网掩码、广播地址等。resource-group用于设置heartbeat启动的服务,该服务最终由双机系统通过集群IP对外提供
在haresources文件中需要如下内容:
Node1.dtedu.com192.168.1.13/24/eth0 httpd
此文件后面执行的其实是haresource.d/目录下的脚本。
node1.dtedu.com 192.168.1.13/24/eth0 httpd
3.0复制配置文件到其他集群节点上
[root@node1.dtedu.com/etc/ha.d]$chmod 600 authkeys
[root@node1.dtedu.com/etc/ha.d]$ll
总用量 48
-rw-------. 1 root root 659 3月 9 02:15 authkeys
-rw-r--r--. 1 root root 10535 3月 9 03:26 ha.cf
-rwxr-xr-x. 1 root root 745 9月 10 2013 harc
-rw-r--r--. 1 root root 5993 3月 9 03:32 haresources
drwxr-xr-x. 2 root root 4096 3月 9 01:50 rc.d
-rw-r--r--. 1 root root 692 9月 10 2013 README.config
drwxr-xr-x. 2 root root 4096 3月 9 01:50 resource.d
-rw-r--r--. 1 root root 7864 9月 10 2013 shellfuncs
[root@node1.dtedu.com/etc/ha.d]$scp -p ha.cf authkeys haresources node2:/etc/ha.d/
ha.cf 100% 10KB 10.3KB/s 00:00
authkeys 100% 659 0.6KB/s 00:00
haresources
启动服务:
[root@node1.dtedu.com/etc/ha.d]$service heartbeat start
logd is already running
Starting High-Availability services:
2017/03/09_03:40:33 INFO: Resource is stopped
2017/03/09_03:40:33 INFO: Resource is stopped
Done.
检查是否真正启动成功:
[root@node1.dtedu.com/etc/ha.d]$ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:8E:E0:1F
inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe8e:e01f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:206995 errors:0 dropped:0 overruns:0 frame:0
TX packets:81052 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:137794678 (131.4 MiB) TX bytes:19218930 (18.3 MiB)
Interrupt:19 Base address:0x2000
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:8E:E0:1F
inet addr:192.168.1.13 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:19 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:1024 errors:0 dropped:0 overruns:0 frame:0
TX packets:1024 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:244093 (238.3 KiB) TX bytes:244093 (238.3 KiB)
[root@node1.dtedu.com/etc/ha.d]$netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4400/sshd
tcp 0 0 :::80 :::* LISTEN 25008/httpd
tcp 0 0 :::22 :::* LISTEN 4400/sshd
tcp 0 0 :::443 :::* LISTEN 25008/httpd
udp 0 0 224.5.6.7:694 0.0.0.0:* 24615/heartbeat: wr
udp 0 0 0.0.0.0:47069 0.0.0.0:* 24615/heartbeat: wr
[root@node1.dtedu.com/etc/ha.d]$
关闭node1的heartbeat来测试实验是否成功。重新启动node1的heartbeat后,网站内容回到node1上,说明failover起到了作用。
扩展知识一
假设web服务器的网页挂载在一个nfs的磁盘上,那么就产生了一个新的资源,以下演示搭建方法。由于NFS的低I/O效率,此方法并不适合在生产环境中使用。通常使用的是NAS,SAN,最低也是DRBD。
创建一个nfs服务器
[root@mail ~]# mkdir /web/htdocs -pv
mkdir: 已创建目录 "/web"
mkdir: 已创建目录 "/web/htdocs"
[root@mail ~]# echo "hello world" >/web/htdocs/index.html
[root@mail ~]# cat /web/htdocs/index.html
hello world
[root@mail ~]# vi /etc/exports
/web/htdocs 192.168.1.0/16(r,w)
安装nfs-utils和rpcbind软件包,并先启动rpcbind再启动nfs。
[root@mail ~]# service rpcbind restart
Stopping rpcbind: [FAILED]
Starting rpcbind: [ OK ]
[1]+ 已终止 service nfs start
[root@mail ~]# service nfs start
Starting NFS services: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
安装nfs-utils软件,并挂载nfs磁盘。
[root@node1.dtedu.com~]$yum install nfs-utils
[root@node1.dtedu.com~]$mount -t nfs -o nolock 10.40.0.37:/web/htdocs /mnt
高可用节点配置/etc/ha.d/haresources文件
node1.dtedu.com 192.168.1.13/24/eth0 Filesystem::10.40.0.37:/web/htdocs::/var/www/html::nfs httpd
高可用节点间切换/usr/lib64/heartbeat/hb_standby
[root@node1.dtedu.com~]$/usr/lib64/heartbeat/hb_standby
2017/03/09_12:43:13 Going standby [all].
关键点:
1、此处建议先尝试使用mount进行直接在节点上进行挂载,如果通过mount -t nfs 10.40.0.37:/web/htdocs /var/www/html的方式可以挂载成功,那么就没有问题,如果要求使用-o nolock之类的选项那么通过heartbeat挂载也会失败。
2、heartbeat启动成功的话可以通过mount、ifconfig、httpd进行确认
3、查看stonith可用的方法:
[root@node1.dtedu.com~]$stonith -L
apcmaster
apcmastersnmp
apcsmart
baytech
cyclades
external/hmchttp
external/ibmrsa
external/ibmrsa-telnet
external/ipmi
external/rackpdu
external/riloe
external/ssh
external/vmware
external/xen0
external/xen0-ha
ibmhmc
meatware
null
nw_rpc100s
rcd_serial
rps10
ssh
suicide
wti_nps