|
|
Pacemaker集群资源管理
2 _( U6 ~7 g0 `$ J- z1、集群资源代理
- f o( k `, M; M8 F- u- a! W在 pacemaker高可用集群中,资源就是集群所维护的高可用服务对象。根据用户的配置,资源有不同的种类,其中最为简单的资源是原始资源(primitive Resource),此外还有相对高级和复杂的资源组(Resource Group)和克隆资源(Clone Resource)等集群资源概念。在 Pacemaker集群中,每一个原始资源都有一个资源代理(Resource Agent, RA), RA是一个与资源相关的外部脚本程序,该程序抽象了资源本身所提供的服务并向集群呈现一致的视图以供集群对该资源进行操作控制。通过 RA,几乎任何应用程序都可以成为 Pacemaker集群的资源从而被集群资源管理器和控制。RA的存在,使得集群资源管理器可以对其所管理的资源“不求甚解",即集群资源管理器无需知道资源具体的工作逻辑和原理( RA已将其封装),资源管理器只需向 RA发出 start、 stop、Monitor等命令, RA便会执行相应的操作。从资源管理器对资源的控制过程来看,集群对资源的管理完全依赖于该资源所提供的,即资源的 RA脚本功能直接决定了资源管理器可以对该资源进行何种控制,因此一个功能完善的 RA在发行之前必须经过充分的功能测试。在多数情况下,资源 RA以 shell脚本的形式提供,当然也可以使用其他比较流行的如 c、 python、 perl等语言来实现 RA。7 S8 o3 K; Y, O4 w0 ]
在 pacemaker集群中,资源管理器支持不同种类的资源代理,这些受支持的资源代理包括 OCF、LSB、 Upstart、 systemd、 service、 Fencing、 Nagios Plugins,而在 Linux系统中,最为常见的有 OCF(open Cluster Framework)资源代理、 LSB( Linux standard Base)资源代理、systemd和 service资源代理。
; X' \, ^5 h8 d7 y1 b, e4 ^(1) OCF
( O z. y" Y( g- `8 [ OCF是开放式集群框架的简称,从本质上来看, OCF标准其实是对 LSB标准约定中 init脚本的一种延伸和扩展。 OCF标准支持参数传递、自我功能描述以及可扩展性,此外,OCF标准还严格定义了操作执行后的返回代码,集群资源管理器将会根据0资源代理返回的执行代码来对执行结果做出判断。因此,如果OCF脚本错误地提供了与操作结果不匹配的返回代码,则执行操作后的集群资源行为可能会变得莫名其妙,而对于不熟悉OCF脚本的用户,这将会是个非常困惑和不解的问题,尤其是当集群依赖于OCF返回代码来在资源的完全停止状态、错误状态和不确定状态之间进行判断的时候。因此,在OCF脚本发行使用之前一定要经过充分的功能测试,否则有问题的OCF脚本将会扰乱整个集群的资源管理。在Pacemaker集群中,OCF作为一种可以自我描述和高度灵活的行业标准,其已经成为使用最多的资源类别。
6 V$ R% P) `- Q( I8 v2 W: g(2) LSB" \/ R; |$ D0 E- c/ D4 P
LSB是最为传统的 Linux“资源标准之一,例如在 Redhat的 RHEL6及其以下版本中(或者对应的 centos版本中),经常在/etc/init.d目录下看到的资源启动脚本便是LSB标准的资源控制脚本。通常,LSB类型的脚本是由操作系统的发行版本提供的,而为了让集群能够使用这些脚本,它们必须遵循 LSB的规定, LSB类型的资源是可以配置为系统启动时自动启动的,但是如果需要通过集群资源管理器来控制这些资源,则不能将其配置为自动启动,而是由集群根据策略来自行启动。
+ ] T8 O$ N+ g(3) Systemd
+ {. ^8 H r) K& m5 [( |$ ]' N 在很多 Linux的最新发行版本中, systemd被用以替换传统“sysv"风格的系统启动初始化进程和脚本,如在 Redhat的 RHEL7和对应的 centos7操作系统中,systemd已经完全替代了 sysvinit启动系统,同时 systemd提供了与 sysvinit以及 LSB风格脚本兼容的特性,因此老旧系统中已经存在的服务和进程无需修改便可使用 systemd在 systemd中,服务不再是/etc/init.d目录下的 shell脚本,而是一个单元文件( unit-file),Systemd通过单元文件来启停和控制服务, Pacemaker提供了管理 Systemd类型的应用服务的功能。 H1 O6 x* R# C* ^
(4) Service* h+ x/ s3 w3 [# S( Z2 P) g& S
Service是 Pacemaker支持的一种特别的服务别名,由于系统中存在各种类型的服务(如 LSB、 Systemd和 OCF), Pacemaker使用服务别名的方式自动识别在指定的集群节点上应该使用哪一种类型的服务。当一个集群中混合有 Systemd、 LSB和 OCF类型资源的时候,Service类型的资源代理别名就变得非常有用,例如在存在多种资源类别的情况下,Pacemaker将会自动按照 LSB、 Systemd、 Upstart的顺序来查找启动资源的脚本。在 pacemaker中,每个资源都具有属性,资源属性决定了该资源 RA脚本的位置,以及该资源隶属于哪种资源标准。例如,在某些情况下,用户可能会在同一系统中安装不同版本或者不同来源的同一服务(如相同的 RabbitMQ Cluster安装程序可能来自 RabbitMQ官方社区也可能来自 Redhat提供的 RabbitMQ安装包),在这个时候,就会存在同一服务对应多个版本资源的情况,为了区分不同来源的资源,就需要在定义集群资源的时候通过资源属性来指定具体使用哪个资源。在 pacemaker集群中,资源属性由以下几个部分构成。, Y% G+ a- I9 L4 o/ k% H
Resource_id:用户定义的资源名称。# O/ v* R$ Z' Z. F- z ^1 e0 p
Standard:脚本遵循的标准,允许值为OCF、Service、Upstart、Systemd、LSB、Stonith。+ q# L& W- r# e2 N- O: F
Type:资源代理的名称,如常见的IPaddr便是资源的。' a" m# Z8 [. t" X- ]0 m
Provider:OCF规范允许多个供应商提供同一资源代理,Provider即是指资源脚本的提供者,多数OCF规范提供的资源代均使用Heartbeat作为Provider。
' Y+ j, ^) B. I0 T8 X; \例如在集群中创建一个名称为VirtualIP:" j% ]1 B+ x" [8 }
Resource_id Standard:Provider:Type pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip=192.168.0.99 nic=eth2
/ ~0 I0 r7 _+ p, r/ q E常用的命令方法
8 u0 j+ n) v0 f% R* m% E* mpcs resource list 查看集群中所有可用资源列表+ j& R, W. n+ H% n4 F% U
% C6 w; e" L( W9 \ {pcs resource standards 查看支持的资源代理标准6 C& n8 R6 W: X- ~( J
/ `# a; o6 W! W* v
pcs resource providers 查看集群中可用资源代理提供程序列表
0 w0 Q% A2 S' r( W/ [+ ]7 A! z. @. W$ ?3 M# Q) }% H
pcs resource describe Standard:Provider:Type 查看Standard:Provider:Type指定的资源代理的详细信息。
2 o" \' B5 |" x9 r& E5 ~2 G5 e, W9 l. w
pcs resource cleanup resource_id 重置资源状态, H* {2 ^3 c% z- k
3 V0 O) z5 _" l; R1、查看http的资源代理
: T0 v7 x! N5 T* i$ |5 i. R/ A0 G+ Q/ V5 }* l. ^7 O
# pcs resource list |grep http1 d$ d! r' v9 i. b, |; M6 w4 t
service:httpd - systemd unit file for httpd
: v1 B# O+ G, |! ^
8 f) f) L7 J, }; t# G v" asystemd:httpd - systemd unit file for httpd
A* e- v- i' J- C- G% B
' I' j |% b1 s [: M; Y$ Y+ Z: ?8 B( z+ D# N/ z: d
2、查看怎么创建http资源:# Z: i9 u& G. z2 K4 `
# pcs resource describe systemd:httpd$ e6 f, a# K" u1 e0 S% `
: }0 j( S8 n3 q9 X0 V
systemd:httpd - systemd unit file for httpd5 d9 f7 K+ Y( r# Q" H* N$ o
6 Q) N0 S6 E1 DCluster Controlled httpd! [, h" s& k5 d0 g% H
% C, \9 [ F+ c. L
Default operations:' D$ e$ I/ y, o5 x; q# L: l% m( u3 I
" ?9 B6 U/ H9 J X" C$ u' N: U+ ?
start: interval=0s timeout=1000 V T" M6 a, x( N! u
0 m2 `( ?6 M( P* ^" Q& {stop: interval=0s timeout=100
* m+ l9 Q* ]% e. w f0 \, m9 z: h9 L( w/ R. X6 @9 x
monitor: interval=60 timeout=100$ c% S% @ A4 |5 Q( y( b5 E
% e4 O* @; r9 M- M% w7 v; a4 w. x% ]" Z% R% V0 v
3、创建http资源:% j4 I% }0 n$ p( K& ]5 M
# pcs resource create http systemd:httpd
" L0 ?& b; B- q+ Z1 L7 x8 \" }
5 e7 c: i1 g$ s5 C2、集群资源约束
+ Q- M! x# F' x) ]7 |集群是由众多具有特定功能的资源组成的集合,集群中的每个资源都可以对外提供独立服务,但是资源彼此之间存在依赖与被依赖的关系。如资源B的启动必须依赖资源A的存在,因此资源A必须在资源B之前启动,再如资源A必须与资源B位于同一节点以共享某些服务,则资源 B与 A在故障切换时必须作为一个逻辑整体而同时迁移到其他节点,在 pacemaker中,资源之间的这种关系通过资源约束或限制( Resource constraint)来实现。 pacemaker集群中的资源约束可以分为以下几类。
/ A# I3 T0 W: L% v: h8 Z; h1 o5 o
8 P1 m+ c. Z" j/ T- z) h4 d( z4 u位置约束(Location):位置约束限定了资源应该在哪个集群节点上启动运行。1 u) t! H3 q+ F2 @
顺序约束(Order):顺序约束限定了资源之间的启动顺序。' U+ n2 F7 a- Q) @
资源捆绑约束(Colocation):捆绑约束将不同的资源捆绑在一起作为一个逻辑整体,即资源 A位于 c节点,则资源 B也必须位于 c节点,并且资源 A、 B将会同时进 行故障切换到相同的节点上。2 H8 [* @, e+ _
在资源配置中, Location约束在限定运行资源的节点时非常有用,例如在 Openstack高可用集群配置中,我们希望 Nova-ompute资源仅运行在计算节点上,而nova-api和 Neutron-sever等资源仅运行在控制节点上,这时便可通过资源的Location约束来实现。例如,我们先给每一个节点设置不同的 osprole属性(属性名称可自定义),计算节点中该值设为 compute,控制节点中该值设为 controller,如下:2 y5 B$ j5 H6 F; C$ L( C& l5 S3 s
" z9 A, M2 X, m+ j$ @$ j
pcs property set --node computel Osprole=compute
' h3 _+ U5 S$ Q: t x/ v2 O
4 @; R, r2 R+ s# [4 ~% F# lpcs property set --node computel osprole=compute% i' J* b5 B7 h* z
' ]/ j: t7 u/ z% jpcs property set --node controller1 osprole=controller7 { o4 H. u s% v8 a% c" c
0 ]7 r0 `! T! z/ ^9 |% x. _
pcs property set --node controller2 osprole=controller4 K+ t$ t; p& p; ]! g. ]
3 G m1 V9 L4 a- T5 Ppcs property set --node controller3 osprole=controller; X5 ]7 G9 R2 O9 W5 V
# \; g, D) h+ C' Z- r7 Q$ K6 i$ M* U+ q4 B3 X- W
然后,通过为资源设置 Location约束,便可将 Nova-compute资源仅限制在计算节点上运行,Location约束的设置命令如下:
& B5 ]9 W8 z/ a+ B7 ^* u 即资源 Nova-compute-clone仅会在 osprole等于 compute的节点上运行,也即计算节点上运行。. \7 v. S1 q. V) G- }# t
pcs constraint location nova-compute-clone rule resource-discovery=exclusive score=0 osprole eq compute; z/ [6 I4 a1 G0 N0 j) d* H% q: F
5 K2 O, @# p# u在 pacemaker集群中,order约束主要用来解决资源的启动依赖关系,资源启动依赖在Linux系统中非常普遍。例如在Openstack高可用集群配置中,需要先启动基础服务如 RabbitMQ和 MySQL等,才能启动 Openstack的核心服务,因为这些服务都需要使用消息队列和数据库服务;再如在网络服务 Neutron中,必须先启动Neutron-server服务,才能启动Neutron的其他 Agent服务,因为这些 Agent在启动时均会到 Neutron-sever中进行服务注册。 Pacemaker集群中解决资源启动依赖的方案便是 order约束。例如,在 openstack的网络服务 Neutron配置中,与 Neutron相关的资源启动顺序应该如下:Keystone-->Neutron-server-->Neutron-ovs-cleanup-->Neutron-netns-cleanup-->Neutron-openvswitch-agent-->Neutron-dncp-agent-->Neutron-l3-agent。上述依赖关系可以通过如下Order约束实现:$ }# ]. ~# _3 Y" X$ M7 Y
pcs constraint order start keystone-clone then neutron-server-api-clone1 D: ]* Q) M4 r& [6 {' f2 t
9 J. y( q1 r! D* O7 c/ T: G
pcs constraint order start neutron-server-api-clone then neutron-ovs-cleanup-clone, p. g7 w8 h4 z3 q( i6 k p
$ \ B$ N/ ^1 ?1 D* g% \7 v D( _+ k
pcs constraint order start neutron-ovs-cleanup-clone then Neutron-netns-cleanup-clone( {' T; h) w+ P% [
0 [6 S8 J; J6 c/ y; ]9 W) i, z7 x
pcs constraint order start Neutron-netns-cleanup-clonethen Neutron-openvswitch-agent-clone1 z8 `# {9 \' }2 c
( d1 X5 v3 F! E& o( e6 A. Spcs constraint order start Neutron-openvswitch-agent-clone then Neutron-dncp-agent-clone6 P; H( n1 Q. d1 a% d0 ?8 o1 m' u
% L1 \9 H: l- z5 s1 \1 [4 j I
pcs constraint order start Neutron-dncp-agent-clone then Neutron-l3-agent-clone
( a" u, L! y4 P0 Y4 R
7 Q% {& S: ?' ]9 z) I2 ^' ]% ~$ ]5 I+ C; D1 Y
Colocation约束主要用于根据资源 A的节点位置来决定资源 B的位置,即在启动资源 B的时候,会依赖资源 A的节点位置。例如将资源 A与资源 B进行 Colocation约束,假设资源A已经运行在 node1上,则资源 B也会在node1上启动,而如果node1故障,则资源B与 A会同时切换到node2而不是其中某个资源切换到 node3。在 Openstack高可用集群配置中,通常需要将 Libvirtd-compute与 Neutron-openvswitch-agent进行资源捆绑,要将 Nova-compute与 Libvirtd-compute进行资源捆绑,则 Colocation约束的配置如下:! W7 F/ ^8 b' l: Y
. I1 m5 V3 L4 l( q- t8 V) M! `
pcs constraint colocation add nova-compute-clone with libvirtd-compute-clone
: N3 g9 F: Y5 ~4 k5 s/ J
" _& x" E- f( M$ ^; I" cpcs constraint colocation add libvirtd-compute-clone with neutron-openvswitch-agent-compute-clone
8 ?5 c2 d5 P3 V5 G) n( n3 x; p" L9 q7 X, x' `$ ?; e
! N. q9 t% y& ~ S. D& x( w' Y6 jLocation约束、 Order约束和 Colocation约束是 Pacemaker集群中最为重要的三个约束通过这几个资源约束设置,集群中看起来彼此独立的资源就会按照预先设置有序运行。
; [7 I( Q( O0 Y5 S+ t/ H8 Y3 A0 R3、集群资源类型; \" p( y* C) U7 `7 O
在 Pacemaker集群中,各种功能服务通常被配置为集群资源,从而接受资源管理器的调度与控制,资源是集群管理的最小单位对象。在集群资源配置中,由于不同高可用模式的需求,资源通常被配置为不同的运行模式,例如 Active/Active模式、 Active/Passive模式以及 Master/Master模式和 Master/Slave模式,而这些不同资源模式的配置均需要使用 Pacemaker提供的高级资源类型,这些资源类型包括资源组、资源克隆和资源多状态等。" \- e+ `2 q* C% s2 [( T
(1)资源组
2 e& n/ W5 l b1 Q/ @在Pacemaker集群中,经常需要将多个资源作为一个资源组进行统一操作,例如将多个相关资源全部位于某个节点或者同时切换到另外的节点,并且要求这些资源按照一定的先后顺序启动,然后以相反的顺序停止,为了简化同时对多个资源进行配置,供了高级资源类型一资源组。通过资源组,用户便可并行配置多个资源,资源组的创建很简单,其语法格式如下:( A; K/ R( l, v. F. g; S
pcs resource group add group_name resource_id ... [resource_id] [--before resource_id] --after resource_id
5 ?' } L3 p- R( }8 d4 f4 E3 H9 h1 N X: U$ L) ?! ~( s
使用该命令创建资源组时,如果指定的资源组目前不存在,则此命令会新建一个资源组,如果指定的资源组已经存在,则此命令会将指定的资源添加到该资源组中并且组中的资源会按照该命令中出现的先位置顺序启动,并以相反的顺序停止。在该命令中,还可使用–before和–after参数指定所添加的资源与组中已有资源的相对启动顺序。在为资源组添加资源时,不仅可以将已有资源添加到组中,还可以在创建资源的同时顺便将其添加到指定的资源组中,命令语法如下:2 D. B1 B8 g4 K- v. G7 U/ { ?
pcs resource create resource_id Standard:Provider:Type丨 type [ resource_options] [op operation_action operation_options] --group group_name
- P1 C$ ]: A: k2 Z6 H, F2 g3 i3 \. U: r* {' I. q! I
如下是资源组操作中经常使用的命令语法:
6 W( E/ d% w+ t7 a# |/ s2 S2 j; z1 p+ ~ i. v
将资源从组中删除,如果该组中没有资源,这个命令会将该组删除:
5 G* a3 j5 E' b& s' {pcs resource group remove group_name resource_id ...9 w2 X. y0 y9 _$ s! j9 Y7 n
查看目前巳经配置的资源组:: l E* V1 L6 t5 {% z i% c
pcs resource group list, H) l7 n* K, g5 P g) \ X) [) K
创建名为Mygroup的资源组,并添加资源 IPaddr和 HAproxy:1 c# v- Q9 H$ N. |) J. E
pcs resource group add MyGroup IPaddr HAproxy
9 r# ]) [4 S z( L- e在 Pacemaker集群中,资源组所包含的资源数目是不受限的,资源组中的资源具有如下的基本特性:
& J% I p- u6 {
6 l ]: b1 Q: X/ P3 R( u: |7 |资源按照其指定的先后顺序启动,如在前面示例的 MyGroup资源组中,首先启动 IPaddr,然后启动 HAproxy。
% C+ {2 R7 S% d- G4 \3 O资源按照其指定顺序的相反顺序停止,如首先停止 HAproxy,然后停止 IPaddr6 Y' ^" x0 ]0 Q/ I7 w( n
如果资源组中的某个资源无法在任何节点启动运行,那么在该资源后指定的任何资源都将无法运行,如 IPaddr不能启动,则 HAproxy也不能启动。. h7 _% r* H9 ]1 r0 }3 w3 s' \4 g
资源组中后指定资源不影响前指定资源的运行,如 HAproxy不能运行,但IPaddr却可以正常运行。
& c% A' ^! J5 V; y3 K在集群资源配置过程中,随着资源组成员的增加,集群资源的配置工作将会明显减少,因为管理员只需要添加资源到资源组中,然后便可对资源组进行整体操作。资源组具有组属性,并且资源组会继承组成员的部分属性,主要被继承的资源属性包括 Priority、Targct-role、Is-managed等,资源属性决定了资源在集群中的行为规范,以及资源管理器可以对其进行哪些操作,因此,了解资源的常见属性也是非常有必要的,如下是资源属性中比较重要的几个属性解释及其默认值。
K! w- i/ ^6 ?& d( ?$ z
: N: \' q4 Y% L/ p% S( V NPriority:资源优先级,其默认值是0,如果集群无法保证所有资源都处于运行状态,则低优先权资源会被停止,以便让高优先权资源保持运行状态。
. u k# B9 M1 r. STarget-role:资源目标角色,在pcs其默认值是started,但在crm里其默认值为Stopped。表示集群应该让这个资源处于何种状态,允许值为:
2 [1 ?2 u$ r! D' CStopped:表示强制资源停止;
4 I2 g& c0 Z# lStarted:表示允许资源启动,但是在多状态资源的情况下不能将其提升为 Master资源;( ^# F. W1 Q2 Z! k8 x
Master:允许资源启动,并在适当时将其提升为 Master。
% }# _/ `1 M5 I* _; His-managed:其默认值是true,表示是否允许集群启动和停止该资源,false表示不允许。
# r0 `6 [$ }+ ?Resource-stickiness:默认值是0,表示该资源保留在原有位置节点的倾向程度值。5 Y. v4 U+ M: }
Requires:默认值为 fencing,表示资源在什么条件下允许启动。
. d9 a% f+ y& h3 r1 g(2)资源克隆, @; Z$ X$ F0 I1 @1 n) r
克隆资源是Pacemaker集群中的高级资源类型之一,通过资源克隆,集群管理员可以将资源克隆到多个节点上并在启动时使其并行运行在这些节点上,例如可以通过资源克隆的形式在集群中的多个节点上运行冗余IP资源实例,并在多个处于 Active状态的资源之间实现负载均衡。通常而言,凡是其资源代理支持克隆功能的资源都可以实现资源克隆,但需要注意的是,只有己经规划为可以运行在Active/Active高可用模式的资源才能在集群中配置为克隆资源。配置克隆资源很简单,通常在创建资源的过程中同时对其进行资源克隆,克隆后的资源将会在集群中的全部节点上存在,并且克隆后的资源会自动在其后添加名为 clone的后缀并形成新的资源 ID,资源创建并克隆资源的语法如下:
- j( ?' L/ g) L8 D' {6 |2 }; I- m, O- C6 d
pcs resource create resource_id standard:provider: type| type [resource options] --clone[meta clone_options]
8 A7 P1 o2 U3 `
3 @# L* e( ~, t/ f4 \: [1 v克隆后的资源 ID不再是语法中指定的 Resource_id,而是 Resource_id-clone并且该资源会在集群全部节点中存在。在 Pacemaker集群中,资源组也可以被克隆,但是资源组克隆不能由单一命令完成,必须先创建资源组然后再对资源组进行克隆,资源组克隆的命令语法如下: N9 d Y R9 o8 |1 [9 h
pcs resource clone resource_id group_name [clone_optione] ...1 m2 U9 A) d# i: q
6 x: z9 }4 s" |; {: G7 N, N4 y克隆后资源的名称为 Resource_id-clone或 Group_name-clone在资源克隆命令中,可以指定资源克隆选项(clone_options),如下是常用的资源克隆选项及其意义。
7 o: y! @- {4 p0 p/ |' w# t
3 r; r7 x; d$ ~/ O6 o0 b* MPriority/Target-role/ls-manage:这三个克隆资源属性是从被克隆的资源中继承而来的,具体意义可以参考上一节中的资源属性解释。
) H/ t0 T6 Q. Y- L5 ?Clone-max:该选项值表示需要存在多少资源副本才能启动资源,默认为该集群中的节点数。双节点的HA,则默认值为2。
/ F0 ^0 N* V. G) e! TClone-node-max:表示在单一节点上能够启动多少个资源副本,默认值为1。
+ y' h- b3 @' V6 u/ Z`Notify:表示在停止或启动克隆资源副本时,是否在开始操作前和操作完成后告知其他所有资源副本,允许值为 False和 True,默认值为 False。! R/ E E7 Z; }: N
Globally-unique:表示是否允许每个克隆副本资源执行不同的功能,允许值为 False和 True。如果其值为 False,则不管这些克隆副本资源运行在何处,它们的行为都是完全和同的,因此每个节点中有且仅有一个克隆副本资源处于 Active状态。其值为 True,则运行在某个节点上的多个资源副本实例或者不同节点上的多个副本实例完全不一样。如果Clone-node-max取值大于1,即一个节点上运行多个资源副本,那么 Globally-unique的默认值为 True,否则为 False。
+ l5 P6 N* A5 N0 o6 MOrdered:表示是否顺序启动位于不同节点上的资源副本,“。为顺序启动,、为并行启动,默认值是 False。
+ [' @! U& d' Y% k+ u' wInterleave:该属性值主要用于改变克隆资源或者 Masters资源之间的 ordering约束行为, Interleave可能的值为 True和 False,如果其值为 False,则位于相同节点上的后一个克隆资源的启动或者停止操作需要等待前一个克隆资源启动或者停止完成才能进行,而如果其值为 True,则后一个克隆资源不用等待前一个克隆资源启动或者停止完成便可进行启动或者停止操作。 Interleave的默认值为 False。4 f3 l. P1 \! N5 E" f( P6 h2 z
maintenance:处于维护模式的资源不受群集的监视。默认值:false4 J8 K6 g% y1 j
在通常情况下,克隆资源会在集群中的每个在线节点上都存在一个副本,即资源副本数目与集群节点数目相等,但是,集群管理员可以通过资源克隆选项Clone-max将资源副本数目设为小于集群节点数目,如果通过设置使得资源副本数目小于节点数目,则需要通过资源位置约束( Location Constraint)将资源副本指定到相应的节点上,设置克隆资源的位置约束与设置常规资源的位置约束类似。例如要将克隆资源 Web-clone限制在 node1节点上运行,则命令语法如下:
8 n& t6 N4 \* g- ?
9 r1 T7 ]; Y- @3 A* R/ O$ npcs constraint location web-clone prefers node1
- R/ Z1 |0 J4 b) B3 H
$ E* M9 m6 x5 [' Y/ n$ r) }(3)资源多态% n1 `7 l4 b* E( x$ j9 e5 x
多状态资源是 Pacemaker集群中实现资源 Master/Master或 Master/S1ave高可用模式的机制,并且多态资源是一种特殊的克隆资源,多状态资源机制允许资源实例在同一时刻仅处于 Master状态或者Slave状态。多状态资源的创建只需在普通资源创建的过程中指定一 Master参数即可,Master/Slave多状态类型资源的创建命令语法如下:4 D( x# M: G- n* Z2 z2 ~
pcs resource create resource_id standard:provider: type| type [resource options] --master [meta master_options]& d ` w Q x$ @* I
2 c4 J0 \( S1 o0 o; A
多状态资源是一种特殊的克隆资源,默认情况下,多状态资源创建后也会在集群的全部节点中存在,多状态资源创建后在集群中的资源名称形如 Resource_id-master。需要指出的是,在 Master/Slave高可用模式下,尽管在集群中仅有一个节点上的资源会处于 Master状态,其他节点上均为 Slave状态,但是全部节点上的资源在启动之初均为 Slave状态,之后资源管理器会选择将某个节点的资源提升为 Master。另外,用户还可以将已经存在的资源或资源组创建为多状态资源,命令语法如下:
/ N# S) f! g0 A+ y& epcs resource master master/slave_name resource_id group_name [master_options]( s8 i5 b' C4 i! G! p" Y' k
" _% k/ K) B, P: T6 u- J在多状态资源的创建过程中,可以通过Master选项( Master_options)来设置多状态资源的属性,Master_options主要有以下两种属性值:
' u8 o# O: @- X1 Q
3 q! i0 u- z; M: j4 h8 q. xMaster-max:其值表示可将多少个资源副本由Slave状态提升至 Master状态,默认值为1,即仅有一个 Master。
$ Q% k3 r# n' ]Master-node-max:其值表示在同一节点中可将多少资源副本提升至 Master状态,默认值为1。
0 Y- N% A6 K% b! H% b. b4 T在通常情况下,多状态资源默认会在每个在线的集群节点中分配一个资源副本,如果希望资源副本数目少于节点数目,则可通过资源的Location约束指定运行资源副本的集群节点,多状态资源的Location约束在实现的命令语法上与常规资源没有任何不同。此外,在配置多状态资源的Ordering约束时,可以指定对资源进行的操作是提升(Promote)还是降级(Demote)操作:$ b# a5 L- p5 l6 x$ w( x
' M1 q4 f7 ~9 Z1 U
pcs constraint order [action] resource_id then [action] resource_id [options]
4 c; t$ j s3 V
3 l0 g# s: K. VPromote操作即是将对应的资源(resource_id)提升为 Master状态, Demote操作即是将资源(resource_id)降级为 Slave状态,通过 ordering约束即可设定被提升或降级资源的顺序。
; A; h/ d: X+ W3 l) `(4)集群资源规则
) W. ^, _& T+ r- }资源规则(Rule)使得 pacemaker集群资源具备了更强的动态调节能力,资源规则最常见的使用方式就是在集群资源运行时设置一个合理的粘性值(Resource-stickness)'以防止资源回切到资源创建之初指定的高优先级节点上,即动态改变资源粘性值以防止资源意外回切。在大规模的集群资源配置中,资源规则的另一重要作用就是通过设置节点属性,将多个具有某一相同属性值的物理节点聚合到一个逻辑组中,然后通过资源的 Location约束,利用节点组的这个共有节点属性值,将资源限制在该节点组上运行,即只允许此节点组中的节点运行该资源,在 Openstack高可用集群配置中,将会使用这种方式来限制不同的资源运行在不同的节点组上(控制节点组和计算节点组),大致的配置方式就是先为选定的节点设置某一自定义属性,以将其归纳到一个节点组,如下配置命令将计算节点和控制节点分别设置为不同的节点属性:; G* M. i+ ]3 C: A* e3 G
pcs property set --node computel osprole=compute
7 G$ e2 B! B, r V% A& h; L# B3 H% e& W
pcs property set --node computel osprole=compute
& m5 c" ~; q# Q. ^2 R
7 S' u7 ^! h0 K2 V5 {8 u) J4 gpcs property set --node controller1 osprole=controller
/ r4 L/ l1 F S: q' V7 _
, O' E/ a: d9 mpcs property set --node controller2 osprole=controller
$ R( x6 k: f4 \& o
/ v: I3 U4 t7 o% A) jpcs property set --node controller3 osprole=controller0 T6 g/ d/ Z1 U) I
0 @4 F& E. ~ t$ @3 h- ?3 r! Q* P* P6 o) Z5 P
此处通过为节点分别设置不同的osprole属性值,将节点划分为两个集合,即计算节点组和控制节点组,将节点 compute1和 compte2归纳到 compute节点组,节点controller1、controller2以及 controller3归纳到 controller节点组,然后通过资源的 Location约束将资源限制到不同的节点组中运行,配置命令如下:
' g& I# f5 Z6 J9 N5 Y Opcs constraint location nova-compute-clone rule resource-discovery=exclusive score=0 osprole eq compute! I4 v. h- c9 O5 B
) c# J1 c) W+ Z; U0 |* H. }( R
pcs constraint location nova-api-clone rule resource-discovery=exclusive score=0 osprole eq controller
7 O& n8 ]9 w; ~+ S1 U0 G$ }
; H( \* A- o1 ]) o
$ A2 p5 t. _! I& ~在上述命令中,当Rule表达式“osprole-compute" 或者"osprole=controller"成立,即Rule为True,则执行对应资源的Location约束。此处,通过资源Location 约束的“ resource-discovery-exclusive"配置,资源nova-compute-clone只能运行在compute节点组中,而 compute组中只有 compute1和compute2节点,因此nova-compute-clone只能在 compute1和 compute2上运行,绝不会在 controller1、controller2及controller3上运行。同样, nova-api-clone资源只会在controller组中的三个节点上运行。绝不会在 compute1和 compute2节点上运行。& C7 P2 I: U; P" h8 N3 l D
9 \1 }0 _# i% G; }; t( [' x( [
在 Pacemaker集群中,每个资源的 Rule都会包含一个或多个数字、时间及日期表达式, Rule最终的取值则取决于多个表达式布尔运算的结果。布尔运算可以是管理员指定的逻辑与或者逻辑或操作,此外, Rule的效果总是以 constraint的形式体现。因此, Rule通常在 Constraint命令中配置,如下语句是配置资源 Rule的语法格式:
' |" N) e& |4 o3 E0 N/ W/ r# V, o: Dpcs constraint rule add constraint_id [rule_type] [score=score] (id=rule-id] expression丨date_expression丨date-spec options
- t0 O; [2 m+ ~+ ~: q. x4 @* A/ Q0 a; S$ x) m: f; y
如果忽略 score值,则使用默认值 INFINITY,如果忽略 ID,则自动从 Constraint_id生成一个规则 ID,而 Rule-type可以是字符表达式或者日期表达式。需要注意的是,在删除资源 Rule时候,如果此 Rule是 Constraint中的最后一个 Rule,则该 Constraint将被删除,删除资源 Rule语法:pcs constraint rule remove rule_id: i) y. E/ w8 L$ B& }1 S
4 Z4 L0 B) y# ?8 N9 N
资源 Rule的表达式主要分为节点属性表达式和时间/日期表达式,节点属性表达式由以下几个部分组成。- V, P+ c: w! x. r3 s; F0 n% }- G
4 a' _5 a# O# v, c: G \# OValue:用户提供的用于同节点属性值进行比较的值。
: X( u, A0 z9 [8 Q! z, x) z9 Z. HAttribute:节点属性变量名,其值即是 value要匹配的节点属性值。
" {: Q7 U! x, R0 f w: Z; VType:确定使用哪种类型的值匹配,允许的值包括字符串、整数、版本号(Version)。5 l6 S5 A: v- N
Operation:操作符,确定用户提供的1“与节点 Attribute的值如何匹配,主要包括以下几种操作符。4 h9 N& J$ R0 k5 C3 e
lt:如果 value 小于 Attribute的值,表达式为正 True;4 G: J6 _' D0 M1 C" i
gt:如果 value 大于 Attribute的值,表达式为正 True;
* t \0 S1 B5 v/ m7 ^" Vlte:如果value 小于等于 Attribute的值,表达式为正 True;
4 [" L, Y9 x. rgte:如果 value 大于等于 Attribute的值,表达式为正 True;
, O W0 L; I' E, e2 ^eq:如果 value 等于 Attribute的值,表达式为正;
( @" e$ k7 D. Rne:如果 value不等于 Attribute的值,表达式为正 True;
! K5 o* c9 j# P9 }8 mdefined:如果表达式中的 Attribute在节点中有定义,则表达式为 True; q# R* G/ {# _: L
not_defined:如果节点中没有定义表达式中的 Attribute,则表达式为True。
. M- Q5 a9 J: F+ K7 @* w% [要通过Rule的节点属性表达式来确定资源的Location,则通常的命令语法如下:
' B2 |: m& `8 k5 b6 t2 |2 M: M
6 L0 N' y1 L' B3 w& Z N4 Qpcs resource constraint location resource_id rule [rule_id] [role=master|slave] [score=score expression]! Q3 j9 W" m' X6 p
- @' ~% o% j2 V
) D* p" g9 V8 }此处的表达式可以是以下几种形式:
, H( U7 f: X5 D7 W0 h8 o" u
+ i2 h# ~; c% ?7 u" T' | defined|not_defined attribute8 G1 q, K! d: }# F$ \
, `, k0 ^7 y- J' R* W
attribute lt|gt|Ite|gte|eq|ne value
% h! E q' ]. j# ~; Y* W5 E
$ B2 u) P y, U# C. Z4 y/ v. i date [start=start] [end=end] operation=gt|lt|in-range
! _4 v# D" v/ ?; M) W% A) v1 k& p1 p, p! H" t- ?; i
date-spec date_spec_options
, T6 P% D+ \9 y, a- f
/ ~3 z2 b, g# a# Y* D
~7 b4 E& [$ d8 O; \' x在 Openstack高可用集群配置中,使用最多的是第二种形式的表达式,例如要限制 Nova-compute服务仅运行在计算节点上,则可以通过如下 Rule和 Location配置实现:
, e8 [7 T5 v# x; Z$ L. Wpcs constraint location nova-compute-clone rule resource-discovery=exclusive score=0 osprole eq compute
1 z9 m' z5 Y! Y. v _* f( @. j! H( B
上述命令中,"osprole eq compute"即是 Rule的表达式,其中 osprole是节点的Atfribute, Compute是用户指定的节点属性值,该表达式的操作符是等于符号(该命令语句中的规则表达式的意思就是,当节点的值等于用户指定值( compute)的时候,则 Rule表达式为 True(计算节点属性中已经预先设置了osprole属性值为compute )。
2 Y( f- e) I, P; ~% U8 o
+ F2 G, H5 k5 ~# K( d(5)集群参数
9 S4 k& L( ^0 w8 acluster-name 集群名字* F Y) u! K1 O' D6 m' b
An arbitrary name for the cluster
) Y& ~9 A8 t* A7 L. x
" p( Y6 x6 ~4 W. O, n* F9 CThis optional value is mostly for users' ' convenience as desired in administration, but may also be used in Pacemaker configuration rules via the #cluster-name node attribute, and by higher-level tools and resource agents.
6 ?( q1 z+ t& M* y$ ]2 E# ]) @, v4 N* o4 R& B
Default : (null)
( O3 C5 x; o6 X; G
8 Q" x. N! Z. N* \stonith-enabled/ G# i) N( E. x7 h3 U; ^
8 V W `1 p t0 y% d
+ z( Q+ t) m$ B' s有fencing设备时,则需要修改为true。
" v# y4 n: h5 k1 a+ C' s
( ^+ o. T j) K: t9 A没有 Fencing设备时,禁用STONITH 组件功能,在 stonith-enabled=“false” 的情况下,分布式锁管理器 (DLM) 等资源以及依赖DLM 的所有服务(例如 cLVM2、GFS2 和 OCFS2)都将无法启动。0 W8 G+ K }0 W7 Z+ i; w/ b
1 p4 T- N3 [; o6 y) V
stonith-action当节点需要隔离时发送到隔离设备的操作+ U, e" J j* P7 A
Action to send to fence device when a node needs to be fenced ("poweroff" is a deprecated alias for "off")
! b$ g/ x3 m. s
8 t/ N: }2 F, ?/ y" |" ]/ qAllowed values: reboot, off, poweroff; R p w( I9 Y
; M4 b5 D3 ]5 N* q& b# \5 R
Default : reboot
4 Z9 Q Z6 ~$ }) L$ T: ~/ U4 m# O1 x- l8 X; k
3 g+ s' S8 K, Q* z) Q% w4 xplacement-strategy 集群应该如何为节点分配资源8 F( J! Q8 Z b& q( u
How the cluster should allocate resources to nodes
& T c/ s# w0 [2 |+ O& n: b! ]
- G1 M. ?5 p% T+ [/ a6 X; g$ B9 GAllowed values: default, utilization, minimal, balanced
6 {2 C0 B; W% Y8 {! u0 O0 t% R& W1 i) M4 U
Default : default
' @3 K3 V5 Q2 u) {3 ~' W! t# h' v4 `- V# W# q+ A
4 X, y2 r2 S5 {# r1 s [- J7 p" Y
no-quorum-policy 群集没有仲裁时该怎么办+ }) m! h( U% Z, K- J$ Q. }
What to do when the cluster does not have quorum3 t8 B6 f$ C) C; B7 x6 m% c
4 L5 c) n. B( M8 n- P7 cAllowed values: stop, freeze, ignore, suicide; R" q' L7 s* P/ V d
* _& P" G) I0 k9 dDefault : stop8 Q" U# B' H, P
8 D" G* I. l' ~5 v/ x
5 U3 h/ n5 \) l1 g% |
maintenance-mode 维护模式,集群是否应避免监视、启动和停止资源。0 R+ I1 g( C' F6 C! ^1 f) s3 {# l
Whether the cluster should refrain from monitoring, starting, and stopping resources# j. A6 v$ K% V$ z5 s
5 u; x! c" q$ I! k. bDefault : false
, y/ J& k' I7 g5 [7 x0 T7 N" O2 n5 X6 z5 J6 h. G
, P/ p7 q7 ~; h& x9 l5 R) s, `resource-stickiness 资源在多大程度上希望留在原地? x8 a( \7 n' Z5 N
How much does the resource prefer to stay where it is?4 n$ `8 q5 g: Y$ [: \
5 b3 |0 _6 a+ Q9 q5 O NDefault : 0* o# f9 j/ F, l6 R- {& N& v& p
7 }3 c7 Y7 i( t( J" s: ]: g' r5 K7 y! `' D, R
migration-threshold 在将此节点标记为不具备承载此资源的资格之前,节点上的此资源可能会发生多少次故障。值为0表示此功能已禁用。
9 Q I4 G5 V9 Q1 H% ]- x1 nHow many failures may occur for this resource on a node, before this node is marked ineligible to host this resource. A value of 0 indicates that this feature is disabled.; ~$ A* d7 a g5 m
. I* ?) l! I" v" L2 e
Default : 0; G" M0 s" g% |* q% a/ k7 j& X
$ o) V0 t: R5 ^5 ^5 B0 N; U
, P, ]/ l/ z8 X. m3 Z+ k8 PPCS命令详解和参数说明
% j- X" i# N* O. i8 K @1 j, w4 Z& }安装
: S! F1 u( f2 ^% B) u3 ]公网安装
2 l) y1 W. s6 E7 Q* c1.安装群集软件:0 K" Y4 v( o* Y' T7 m; E& q
yum -y install corosync pacemaker pcs+ ^+ P- m/ w/ J, l9 c9 N: g c
yum -y install fence-agents resource-agents
/ l3 s( j! S3 q/ M x2 o+ d) I1 b! W! w% @0 X$ F; U
# K0 m: g X) A; O+ b2.拷贝配置文件、启动脚本4 L4 m9 y6 q, W* |3 H
注意:群集需要严格的时间同步机制,如果启用了防火墙需要开放相应的端口。, K# t9 s6 T0 l: V
mkdir -p /etc/cluster/( U9 h8 w0 v4 F& [
ln -s /etc/rc.d/init.d/corosync /etc/rc.d/init.d/cman! @! h0 f1 ~- d8 a5 ^0 J
ln -s /usr/sbin/corosync-cmapctl /usr/sbin/corosync-objctl! M7 t y6 T- H: R( @( ?1 d
cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf1 G& V/ i3 _7 K2 d
1 F0 @; l8 z* t
* Q2 K' z4 |3 y/ _$ Q! C
内网安装4 f% J9 ~* @1 f; G: B6 z8 E) {
其实就是在有外网的情况下汇总corosync pacemaker pcs fence-agents resource-agents 这些包放在一个文件夹拷贝到内网环境,用rpm安装即可。
, c8 ^# o/ b! O+ D) t6 v
9 r4 @- h9 o2 W6 w1 K如果不会在公网上将包和依赖下载的,看我这篇文章
0 r% v3 ]0 T4 O- p- l2 u+ i【yum】linux离线安装rpm包及其依赖和卸载包及其依赖
" f- @8 M& i8 w+ @ M1 P7 b3 _, f3 o+ t9 Q7 U+ ?! p
最后面centos8或bclinux8.2离线安装pcs以及搭建pcs、pcs的使用说明,中有实操内网安装。6 p+ t3 G' o6 q7 S7 k; k. N0 b
- f' B- `. [* P5 i& d
建立集群) C# p. @9 m: [3 L$ E& P$ n
下面内容来源于网上,建议结合我这实操的做下对比【这内容在最下面的文章中哈】
& t. r c' d6 M& K' Z: K. U9 y: ~0 m5 A9 g5 [: e* n8 W
" @# u5 z' |8 ?1 _4 U8 e% R1、配置群集节点的认证as the hacluster user:
5 e1 w1 Y+ A" O8 n; C5 t, H1 V+ P" K# ]7 G& [
# pcs cluster auth node1 node26 _5 [3 o. H2 u7 }
% H- O$ O% u3 C; R- H! g2、创建一个二个节点的群集% b# h* O: a/ O, {
# pcs cluster setup --name mycluster node1 node29 B: X% e0 q4 w- d5 c
# pcs cluster start --all ## 启动群集, ~( }* P& W( ?/ U
1 _; |8 N* j! x$ W I9 k+ E" u
$ n. e+ u+ w: K* \1 x* ?3、设置资源默认粘性(防止资源回切) b+ T' g0 z {$ |( l9 l
# pcs resource defaults resource-stickiness=100
# b2 T o7 `0 M5 u7 p/ G# pcs resource defaults+ u; i; e7 P, U8 J& a {* I1 O) V
4 F$ [3 f8 Q: U! b
+ Y; Z9 d8 n9 ~: c, j+ B- \0 ]: |4、设置资源超时时间* G r8 q+ S. K) U
# pcs resource op defaults timeout=90s
* f6 V9 q) l/ A8 q+ Y! n( |! r% r# pcs resource op defaults
% t: @# i( \- M2 x/ b: b6 q0 N p& X" o5 U" l* K
4 }5 y- J! u6 d$ d' P
5、二个节点时,忽略节点quorum功能
' h! Q/ U! j% v2 L7 O4 I# pcs property set no-quorum-policy=ignore
% q1 r+ R& k0 M" x6 p+ g2 n
: J! S2 r) f. h, ^' S6、没有 Fencing设备时,禁用STONITH 组件功能 m: d, Y7 n- N# e" \
在 stonith-enabled=“false” 的情况下,分布式锁管理器 (DLM) 等资源以及依赖DLM 的所有服务(例如 cLVM2、GFS2 和 OCFS2)都将无法启动。
: Y8 [+ Q% r& l: m# pcs property set stonith-enabled=false! r, @+ s& _3 O9 c& h4 p& Y* z
# crm_verify -L -V ## 验证群集配置信息
+ z+ q3 l* h6 J9 u% Y* k
7 V/ E1 g7 }/ K" @2 O
. W- K5 \' x5 D& i建立集群资源5 B' u- o6 P" m
1、查看可用资源
4 b4 i' p3 P' g8 s# pcs resource list ## 查看支持资源列表,pcs resource list ocf:heartbeat
7 G& i& l0 A: ]- x1 c+ u# pcs resource describe agent_name ## 查看资源使用参数,pcs resource describe ocf:heartbeat:IPaddr2
( m4 w. e; T2 V9 h1 w
7 s& x* E% V x7 C% h( c6 E( z
1 \9 G+ [1 L# v0 p8 b/ h% M2、配置虚拟IP【vip】( m2 l/ Q7 {9 p" I% P
# pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip="192.168.10.15" cidr_netmask=32 nic=eth0 op monitor interval=30s
; M0 r# ^7 g& b; B
$ R8 \( s* w& D. W* g0 ~绑定服务# K' f* c- c f" m
配置Apache(httpd)
/ W/ g' j& u6 d$ c& S0 `% ]# pcs resource create WebServer ocf:heartbeat:apache httpd="/usr/sbin/httpd" configfile="/etc/httpd/conf/httpd.conf" statusurl="http://localhost/server-status" op monitor interval=1min. k: B, c1 B' f7 e7 G. f8 F
$ M5 m& b$ b" P$ n配置Nginx
0 j6 ~( y% P! G6 u% C8 P: y2 J# pcs resource create WebServer ocf:heartbeat:nginx httpd="/usr/sbin/nginx" configfile="/etc/nginx/nginx.conf" statusurl="http://localhost/ngx_status" op monitor interval=30s
9 a" f: H9 B& X# {6 b1 d% M7 E! d: E; ^( y; v B$ J- l4 d
配置FileSystem& o+ l7 }8 |5 [0 A& c; L0 K8 P, N
1、配置FileSystem8 X0 A: G2 w3 R; Y' B5 ^9 p& |
# pcs resource create WebFS ocf:heartbeat:Filesystem device="/dev/sdb1" directory="/var/www/html" fstype="ext4"0 b. v0 A7 @$ i9 p
T. ?# k" ]7 c# pcs resource create WebFS ocf:heartbeat:Filesystem device="-U 32937d65eb" directory="/var/www/html" fstype="ext4"
+ P. O; W; d: ?( r( Y+ F( P
% c' W% U2 a* c6 a. e
$ K) N- f* r7 a$ F/ C- m2、配置FileSystem-NFS3 E* _4 G+ c+ M9 x) \6 ~; r+ Z
# pcs resource create WebFS ocf:heartbeat:Filesystem device="192.168.10.18:/mysqldata" directory="/var/lib/mysql" fstype="nfs" options="-o username=your_name,password=your_password" op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=60s$ {/ Q! K" G# m; a2 r
1# w% |5 R+ d. d1 h
配置Iscsi/ S2 p( l% r. ~
# pcs resource create WebData ocf:heartbeat:iscsi portal="192.168.10.18" target="iqn.2008-08.com.starwindsoftware:" op monitor depth="0" timeout="30" interval="120"
$ s( Q# \% I) M9 f3 d3 U- O/ j4 x9 a% y
7 V2 P- f* Z$ g& Z# pcs resource create WebFS ocf:heartbeat:Filesystem device="-U 32937d65eb" directory="/var/www/html" fstype="ext4" options="_netdev"
* U) b w, k: Z! Y0 \4 D9 d! y, `" g# v$ D: S# ?# ?4 M
6 D( H5 H, ?; R" t: }+ G: W配置DRBD
6 l) U" Q4 J! ^; T( M# pcs resource create WebData ocf:linbit:drbd drbd_resource=wwwdata op monitor interval=60s
- w4 I2 T! N' r# m! J
3 }1 z8 ^5 E" J+ R2 A/ g6 ?# pcs resource master WebDataClone WebData master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true3 b% ~. a$ E' c! q5 Y% d
* P0 j& w) a$ Q1 a; h7 W% r2 W0 a
# pcs resource create WebFS ocf:heartbeat:Filesystem device="/dev/drbd1" directory="/var/www/html" fstype="ext4"
6 v# a( @ [: R! U9 [( d! r# v+ Z9 k7 ^% c0 i! t- j! y
/ _( t' D/ X6 C4 j6 Q& ?6 `配置MySQL) w7 E3 R& ?4 M7 \/ k U8 Y# B7 [5 K
# pcs resource create MySQL ocf:heartbeat:mysql binary="/usr/bin/mysqld_safe" config="/etc/my.cnf" datadir="/var/lib/mysql" pid="/var/run/mysqld/mysql.pid" socket="/tmp/mysql.sock" op start timeout=180s op stop timeout=180s op monitor interval=20s timeout=60s
* }3 M2 S4 d$ e0 \! U0 C# c9 |6 P4 c d) m! }
" c4 n! I! j+ Y1 a: ~( e8 k/ T配置Pingd,检测节点与目标的连接有效性
7 x! K; ~4 W5 x- n0 |# pcs resource create PingCheck ocf:heartbeat:pingd dampen=5s multiplier=100 host_list="192.168.10.1 router" op monitor interval=30s timeout=10s: T- W- P1 L5 L* d' |6 s2 X' N
2 ?. K# h2 J9 X) m0 @6 ?
6 X& u) d- g& P& q创建资源clone,克隆的资源会在全部节点启动
# f( s- M. o. R6 l0 V# pcs resource clone PingCheck3 z2 Q& x/ R5 ~
# pcs resource clone ClusterIP clone-max=2 clone-node-max=2 globally-unique=true ## clone-max=2,数据包分成2路- `1 H2 ^$ V# l5 }9 u' W
# pcs resource update ClusterIP clusterip_hash=sourceip ## 指定响应请求的分配策略为:sourceip
, c& D& ` y* o; z, k
6 ^( [5 Z$ s0 o- R3 g! w w! M
$ ?- g7 H; P2 U& C# G& J调整集群资源
# g/ O. e7 u. j1、配置资源约束9 f; {, w8 s7 r, G" {1 x
# pcs resource group add WebSrvs ClusterIP ## 配置资源组,组中资源会在同一节点运行
; d2 w/ i! |" N# pcs resource group remove WebSrvs ClusterIP ## 移除组中的指定资源
6 H( X" L4 _( h- \1 Z# pcs resource master WebDataClone WebData ## 配置具有多个状态的资源,如 DRBD master/slave状态
" \3 z1 m! _' {2 ~# pcs constraint colocation add WebServer ClusterIP INFINITY ## 配置资源捆绑关系6 `$ Z2 T! z$ ^. t& s Y1 C' |
# pcs constraint colocation remove WebServer ## 移除资源捆绑关系约束中资源
: }! L! e: s0 _; {# pcs constraint order ClusterIP then WebServer ## 配置资源启动顺序
8 f0 H7 q( c4 p# pcs constraint order remove ClusterIP ## 移除资源启动顺序约束中资源& i) q# {7 M- ~6 \+ ^' ]+ d" b
# pcs constraint ## 查看资源约束关系, pcs constraint --full
* O" L' z! U8 {3 g' I O
* x6 d( _4 Z) J" O. s' i5 M- Q# X" v/ A! M! b
2、配置资源位置
' G* z) @+ a. u3 y8 Z# pcs constraint location WebServer prefers node11 ## 指定资源默认某个节点,node=50 指定增加的 score
+ X- I; a- T+ X$ {$ G1 D# pcs constraint location WebServer avoids node11 ## 指定资源避开某个节点,node=50 指定减少的 score
0 j. J8 y- C8 ^* m3 C3 I% V9 }# pcs constraint location remove location-WebServer ## 移除资源节点位置约束中资源ID,可用pcs config获取
: J! ?7 R% W+ |$ E# pcs constraint location WebServer prefers node11=INFINITY ## 手工移动资源节点,指定节点资源的 score of INFINITY" I' Z! ~6 f; ~" \$ H* ]/ Y
# crm_simulate -sL ## 验证节点资源 score 值2 O: F9 f: m$ k! z
% k7 @4 Q$ R9 Z6 G1 h# T
, i4 w, ~# @' X3 B7 Y. R
3、修改资源配置
6 V/ U( M- H& M+ z5 Y# pcs resource update WebFS ## 更新资源配置/ z P+ o& {9 K: h
# pcs resource delete WebFS ## 删除指定资源
1 B9 j. x6 S, b. O
8 w* }# w! B" ^; O- e0 q
3 [3 k' a; s3 p7 `: _; N4、管理群集资源9 M! I/ }7 k8 ~' @7 Y2 e
# pcs resource disable ClusterIP ## 禁用资源
% \% u2 T; i, r8 F% @0 e3 k$ ]% ?# pcs resource enable ClusterIP ## 启用资源- Y+ g2 Q* T" q& o7 D; I5 T3 G1 Q
# pcs resource failcount show ClusterIP ## 显示指定资源的错误计数
4 W# c( ]$ x2 M/ p1 K$ k) ^# pcs resource failcount reset ClusterIP ## 清除指定资源的错误计数
( L$ O: m! @* H0 D( r& C, u# pcs resource cleanup ClusterIP ## 清除指定资源的状态与错误计数
O: Q6 ^6 H s5 G' d
% \5 _! j6 D: q, t7 F% _8 h8 K
1 R: ]) l* V% ]) y+ E# t5* J% H+ U4 \- J' W7 t
1 w, N- m2 w8 @
配置Fencing设备,启用STONITH# l: C2 X1 E7 O8 V
1、查询Fence设备资源8 ?. U2 ^- v9 G/ n& z+ I
# pcs stonith list ## 查看支持Fence列表
8 a3 b" _0 o% P- n, |8 R# pcs stonith describe agent_name ## 查看Fence资源使用参数,pcs stonith describe fence_vmware_soap8 g4 l5 v3 U/ R: q; ~- O
7 S0 H1 [9 D$ k# x" G" E a
, l3 r$ D. T/ h, X' y3 b2、配置fence设备资源
# D5 L% ~# y- I' _# pcs stonith create ipmi-fencing fence_ipmilan \
" e; l4 u) h7 W8 i Y1 ~! c pcmk_host_list="pcmk-1 pcmk-2" ipaddr="10.0.0.1" login=testuser passwd=acd123 \ _9 s2 }% z! _& P
op monitor interval=60s
1 f6 N; u! f* @3 y; @! M" A& c
, f9 z3 X1 J/ R1 zmark:
$ d, W; l( m+ ^If the device does not support the standard port parameter or may provide additional ones, you may also need to set the special pcmk_host_argument parameter. See man stonithd for details.
. A- `, c$ S! F- CIf the device does not know how to fence nodes based on their uname, you may also need to set the special pcmk_host_map parameter. See man stonithd for details.
! S8 y3 h) z. A; d2 M% s! v( g" jIf the device does not support the list command, you may also need to set the special pcmk_host_list and/or pcmk_host_check parameters. See man stonithd for details.9 @0 f/ L! D0 z! P; r* S$ j
If the device does not expect the victim to be specified with the port parameter, you may also need to set the special pcmk_host_argument parameter. See man stonithd for details.6 T7 L1 l" }' V: B9 s/ D: I
example: pcmk_host_argument="uuid" pcmk_host_map="node11:4;node12:5;node13:6" pcmk_host_list="node11,node12" pcmk_host_check="static-list"
: I7 h0 N' x; @! W$ t2 C/ I+ c+ S% w+ S) v6 [
0 x! g2 y& Z7 H; r
3、配置VMWARE (fence_vmware_soap)% P4 V0 N" H$ F D0 R% w% J9 t
特别说明:本次实例中使用了第3项(pcs stonith create vmware-fencing fence_vmware_soap)这个指定pcmk配置参数才能正常执行Fencing动作。! O+ u) z8 _& {1 k
' e2 }' T3 k+ {& y5 R8 j u. _
3.1、确认vmware虚拟机的状态:/ J, S( @% d. f* r) [' B" s( t
# fence_vmware_soap -o list -a vcenter.example.com -l cluster-admin -p -z ## 获取虚拟机UUID
+ W3 z6 L& L4 r5 f# fence_vmware_soap -o status -a vcenter.example.com -l cluster-admin -p -z -U ## 查看状态
9 i3 Y1 {+ N. K; m- @, {) Y# fence_vmware_soap -o status -a vcenter.example.com -l cluster-admin -p -z -n - R J% t! P {5 Y u' M/ L# I
. J" i8 y; h& M y9 o" X
8 a, B; k! C0 e; s
3.2、配置fence_vmware_soap% Z/ ?/ B* b8 f2 |, I1 C
# pcs stonith create vmware-fencing-node11 fence_vmware_soap action="reboot" ipaddr="192.168.10.10" login="vmuser" passwd="vmuserpd" ssl="1" port="node11" shell_timeout=60s login_timeout=60s op monitor interval=90s: r" f1 m! C0 v* H( [& K
6 ]. a4 m1 C' m1 f$ A* n
# pcs stonith create vmware-fencing-node11 fence_vmware_soap action="reboot" ipaddr="192.168.10.10" login="vmuser" passwd="vmuserpd" ssl="1" uuid="421dec5f-c484-3d69-ddfb-65af46530581" shell_timeout=60s login_timeout=60s op monitor interval=90s4 P& ^4 W* F6 F: O; Y" o* Q! Q
$ Q3 k5 h8 X" _# U1 j# pcs stonith create vmware-fencing fence_vmware_soap action="reboot" ipaddr="192.168.10.10" login="vmuser" passwd="vmuserpd" ssl="1" pcmk_host_argument="uuid" pcmk_host_check="static-list" pcmk_host_list="node11,node12" pcmk_host_map="node11:421dec5f-c484-3d69-ddfb-65af46530581;node12:421dec5f-c484-3d69-ddfb-65af46530582" shell_timeout=60s login_timeout=60s op monitor interval=90s
! k7 y$ U: [2 L& }' @1 _7 [# Z: B/ h3 p+ V. A3 X+ E
+ b$ f0 c2 F7 X& Z
注:如果配置fence_vmware_soap设备时用port=vm name在测试时不能识别,则使用uuid=vm uuid代替;8 Y2 q, J0 E3 I' ?9 T$ b& k( u- ^
建议使用pcmk_host_argument、pcmk_host_map、pcmk_host_check、pcmk_host_list参数指明节点与设备端口关系,格式:
6 m# }1 U. s+ c/ E
, U8 U$ x% v+ c6 X6 K; g pcmk_host_argument="uuid" pcmk_host_map="node11:uuid4;node12:uuid5;node13:uuid6" 8 e) T* `7 S2 f: a w% j
pcmk_host_list="node11,node12,node13" pcmk_host_check="static-list"( ^. S% e3 s2 r3 w$ i J4 J6 _) t
" v* O0 m8 L! u7 Z" p! M# }! A
5 [6 _$ ]* D5 ~, k( @9 |4、配置SCSI
4 X6 C6 j) Q: G( X$ Z* v# ls /dev/disk/by-id/wwn-* ## 获取Fencing磁盘UUID号,磁盘须未格式化
# a5 n$ n K c! F, A# F" B( m# pcs stonith create iscsi-fencing fence_scsi \, P; i9 p* q! [9 [/ Z
action="reboot" devices="/dev/disk/by-id/wwn-0x600e002" meta provides=unfencing
2 m8 Q- s! h( Y5 _0 w
5 |( q. a2 j: ^4 l' ?7 j( W: J% W- Y8 r+ [6 b9 m$ O2 P
5、配置DELL DRAC
8 X0 q8 D$ G4 n& m* s1 p# pcs stonith create dell-fencing-node11 fence_drac; D( Q: \& i H3 a
.....
) h+ l. Y% Y0 K" m r) @0 L$ ~
4 t7 I9 y( o0 I7 ?
. @- t& g9 D, J! Y6、管理 STONITH
4 |. h" i' C8 v8 ~# pcs resource clone vmware-fencing ## clone stonith资源,供多节点启动
+ S9 o$ y, J; e5 x6 l. y, o0 Z. F# pcs property set stonith-enabled=true ## 启用 stonith 组件功能! H. @9 x6 W6 ~/ n9 r. X
# pcs stonith cleanup vmware-fencing ## 清除Fence资源的状态与错误计数( A5 T8 E# |+ t% s% r1 [ c; P( q
# pcs stonith fence node11 ## fencing指定节点% n R; J3 l1 }6 a
: ~2 g c/ e3 l D! U/ o
7 T/ [5 U" {. ~0 @% J5 P& a. Z- f3 U& p( a- x
7、管理tomcat
' s; N9 K9 T1 b3 n$ t) Y#pcs resource create tomcat ersweb statusurl=http://127.0.0.1 java_home=/usr/java/jdk1.6.0_12/ catalina_home=/usr/local/Ers/tomcat/ op monitor interval=30s# g& j$ t9 a" W
" ?* x' y) ^3 |3 M) B: B
集群操作命令
" X) Q9 \$ ?" i8 e1、验证群集安装
( K8 c9 y; L; c' o% X1 A" U# {# pacemakerd -F ## 查看pacemaker组件,ps axf | grep pacemaker
( q z, R& p/ ^3 ?8 C6 E% P9 V# corosync-cfgtool -s ## 查看corosync序号
* a G8 g+ p7 h' n3 Q% _. C' l4 B# corosync-cmapctl | grep members ## corosync 2.3.x$ u1 p' Z u% x
# corosync-objctl | grep members ## corosync 1.4.x, b! l% B4 ?$ x+ H' @
1 U# h9 S- e4 T5 ?% l4 M/ k0 l1 R: d# W3 C" B7 X2 m4 C2 |( I/ M/ n
2、查看群集资源0 U) ?* g6 M' T8 {2 e1 u0 c
# pcs resource standards ## 查看支持资源类型
$ D% m/ T2 \8 W3 a: C# pcs resource providers ## 查看资源提供商
* {5 t* T9 U. h [# pcs resource agents ## 查看所有资源代理- u- T2 t2 U+ [' q. b
# pcs resource list ## 查看支持资源列表
2 e9 S [: I; e' J9 @ D# pcs stonith list ## 查看支持Fence列表" O4 O. d! p! E$ ` b
# pcs property list --all ## 显示群集默认变量参数, {1 n5 o. K, }( u% m
# crm_simulate -sL ## 检验资源 score 值
" i$ I5 M+ ~0 t, ~' H* `, H) D$ Y1 M `
4 J3 }' P: m# o0 Z) p( _! o( Q
3、使用群集脚本( Z! P7 B4 G% W9 e
# pcs cluster cib ra_cfg ## 将群集资源配置信息保存在指定文件1 c3 J9 m) H& j6 w J
# pcs -f ra_cfg resource create ## 创建群集资源并保存在指定文件中(而非保存在运行配置)- S% f; X6 V5 M% J/ d
# pcs -f ra_cfg resource show ## 显示指定文件的配置信息,检查无误后
/ h, y, K9 `" Z$ w4 j G# pcs cluster cib-push ra_cfg ## 将指定配置文件加载到运行配置中$ B H6 Q4 ?, N+ Z" Y1 c% W. X5 t; ?, G; W
* A6 \7 n9 e' Q2 E# C2 Y
9 M2 M) M; L$ t7 l$ g. ~/ w. O; W4、STONITH 设备操作
* j; D9 n8 N2 `4 W% D& Z( z+ i# stonith_admin -I ## 查询fence设备
1 O: R7 j( G3 x0 A2 |3 U# stonith_admin -M -a agent_name ## 查询fence设备的元数据,stonith_admin -M -a fence_vmware_soap
( Y# \4 ?4 ~# N" @! }. {# stonith_admin --reboot nodename ## 测试 STONITH 设备8 m& ^- E( F4 m4 g) E3 K/ B
! n b. [! G1 I( V2 F" d' K' Z9 z+ p% }; ^" t' A C) y
5、查看群集配置; L0 t8 i% ^: y! O/ O
# crm_verify -L -V ## 检查配置有无错误
+ X2 ^4 E- }$ @8 B9 K# pcs property ## 查看群集属性
/ m; Z! W: d2 A" `# pcs stonith ## 查看stonith
& c7 N2 h, b# t/ s. K! u1 V- B# pcs constraint ## 查看资源约束/ [: G0 S3 h& n; y4 A y
# pcs config ## 查看群集资源配置# q5 W/ @8 g% J; Q% K
# pcs cluster cib ## 以XML格式显示群集配置; s" J' U" Z1 ^0 H4 n
, Z1 ?# U8 w/ l& l- T3 t7 ~3 m( l; W; I1 t% C z
6、管理群集
* ]+ y# F, O7 X# pcs status ## 查看群集状态5 m7 I {( P) |/ a7 T! K
# pcs status cluster
$ v9 Q, h# G u& |1 b' v$ t! T& v# pcs status corosync
7 g5 U2 ~" t' j4 Q: m( d+ S# pcs cluster stop [node11 ## 停止群集9 |; i" u1 I8 k3 c; I' e Q
# pcs cluster start --all ## 启动群集
F- u7 u0 `/ L6 {. Z0 C$ w# pcs cluster standby node11 ## 将节点置为后备standby状态,pcs cluster unstandby node11
: T& V& Z8 c F* y! n" U# pcs cluster destroy [--all ## 删除群集,[--all同时恢复corosync.conf文件; l9 h$ E, s w ~ ~
# pcs resource cleanup ClusterIP ## 清除指定资源的状态与错误计数2 q# B4 O( U: O+ c- J( ~& |
# pcs stonith cleanup vmware-fencing ## 清除Fence资源的状态与错误计数+ Y, B! F( r# v% J( W. A1 y
/ A) p6 h' J. v1 T9 s
* d& W2 I$ b2 l2 I1 b/ q! T3 ?# C6 N8 Y1 i- h
+ y' k. B+ y- ` M |
|