《OpenStack高可用集群(上册):原理与架构》—3.7 Pacemaker集群资源管理

举报
华章计算机 发表于 2019/05/29 14:15:33 2019/05/29
4.1k+ 0 0
【摘要】 本书摘自《OpenStack高可用集群(上册):原理与架构》一书中的第3章,第3.7.1节,作者是山金孝。

3.7 Pacemaker集群资源管理

3.7.1 集群资源代理

在Pacemaker高可用集群中,资源就是集群所维护的高可用服务对象。根据用户的配置,资源有不同的种类,其中最为简单的资源是原始资源(Primitive Resource),此外还有相对高级和复杂的资源组(Resource Group)和克隆资源(Clone Resource)等集群资源概念。在Pacemaker集群中,每一个原始资源都有一个资源代理(Resource Agent,RA),RA是一个与资源相关的外部脚本程序,该程序抽象了资源本身所提供的服务并向集群呈现一致的视图以供集群对该资源进行操作控制。通过RA,几乎任何应用程序都可以成为Pacemaker集群的资源从而被集群资源管理器和控制。RA的存在,使得集群资源管理器可以对其所管理的资源“不求甚解”,即集群资源管理器无需知道资源具体的工作逻辑和原理(RA已将其封装),资源管理器只需向RA发出Start、Stop、Monitor等命令,RA便会执行相应的操作。从资源管理器对资源的控制过程来看,集群对资源的管理完全依赖于该资源所提供的RA,即资源的RA脚本功能直接决定了资源管理器可以对该资源进行何种控制,因此一个功能完善的RA在发行之前必须经过充分的功能测试。在多数情况下,资源RA以shell脚本的形式提供,当然也可以使用其他比较流行的如C、Python、Perl等语言来实现RA。

在Pacemaker集群中,资源管理器支持不同种类的资源代理,这些受支持的资源代理包括OCF、LSB、Upstart 、Systemd、Service、Fencing、Nagios Plugins。而在Linux系统中,最为常见的有OCF(Open Cluster Framework)资源代理、LSB(Linux Standard Base)资源代理、Systemd和Service资源代理。

(1)OCF

OCF是开放式集群框架的简称,从本质上来看,OCF标准其实是对LSB标准约定中init脚本的一种延伸和扩展。OCF标准支持参数传递、自我功能描述以及可扩展性,此外,OCF标准还严格定义了操作执行后的返回代码,集群资源管理器将会根据OCF资源代理返回的执行代码来对执行结果做出判断。因此,如果OCF脚本错误地提供了与操作结果不匹配的返回代码,则执行操作后的集群资源行为可能会变得莫名其妙,而对于不熟悉OCF脚本的用户,这将会是个非常困惑和不解的问题,尤其是当集群依赖于OCF返回代码来在资源的完全停止状态、错误状态和不确定状态之间进行判断的时候。因此,在OCF脚本发行使用之前一定要经过充分的功能测试,否则有问题的OCF脚本将会扰乱整个集群的资源管理。在Pacemaker集群中,OCF作为一种可以自我描述和高度灵活的行业标准,其已经成为使用最多的资源类别。

(2)LSB

LSB是最为传统的Linux资源标准之一,例如在Redhat的RHEL6及其以下版本中(或者对应的CentOS版本中),经常在/etc /init.d目录下看到的资源启动脚本便是LSB标准的资源控制脚本。通常,LSB类型的脚本是由操作系统的发行版本提供的,而为了让集群能够使用这些脚本,它们必须遵循LSB的规定,LSB类型的资源是可以配置为系统启动时自动启动的,但是如果需要通过集群资源管理器来控制这些资源,则不能将其配置为自动启动,而是由集群根据策略来自行启动。

(3)Systemd

在很多Linux的最新发行版本中,Systemd被用以替换传统“SysV”风格的系统启动初始化进程和脚本,如在Redhat的RHEL7和对应的CentOS7操作系统中,Systemd已经完全替代了Sysvinit启动系统,同时Systemd 提供了与Sysvinit以及LSB风格脚本兼容的特性,因此老旧系统中已经存在的服务和进程无需修改便可使用Systemd。在Systemd中,服务不再是/etc/init.d目录下的shell脚本,而是一个单元文件(unit-file),Systemd通过单元文件来启停和控制服务,Pacemaker提供了管理Systemd类型的应用服务的功能。

(4)Service

Service是Pacemaker支持的一种特别的服务别名,由于系统中存在各种类型的服务(如LSB、Systemd和OCF),Pacemaker使用服务别名的方式自动识别在指定的集群节点上应该使用哪一种类型的服务。当一个集群中混合有Systemd、LSB和OCF类型资源的时候,Service类型的资源代理别名就变得非常有用,例如在存在多种资源类别的情况下,Pacemaker将会自动按照LSB、Systemd、Upstart的顺序来查找启动资源的脚本。

 在Pacemaker中,每个资源都具有属性,资源属性决定了该资源RA脚本的位置,以及该资源隶属于哪种资源标准。例如,在某些情况下,用户可能会在同一系统中安装不同版本或者不同来源的同一服务(如相同的RabbitMQ Cluster安装程序可能来自RabbitMQ官方社区也可能来自Redhat提供的RabbitMQ安装包),在这个时候,就会存在同一服务对应多个版本资源的情况,为了区分不同来源的资源,就需要在定义集群资源的时候通过资源属性来指定具体使用哪个资源。在Pacemaker集群中,资源属性由以下几个部分构成。

Resource_id:用户定义的资源名称。

Standard:脚本遵循的标准,允许值为OCF、Service、Upstart、Systemd、LSB、Stonith。

Type:资源代理的名称,如常见的 IPaddr便是资源的Type。

Provider:OCF规范允许多个供应商提供同一资源代理,Provider即是指资源脚本的提供者,大多数OCF规范提供的资源代理均使用Heartbeat作为Provider。

上述资源属性在集群定义资源时候均会使用,例如要在集群中创建一个名称为neutron-ovs-cleanup的资源(resource_id属性),并指定资源的RA符合OCF规范(standard属性),该RA由OpenStack的Neutron组件提供(Provider属性),RA的名称为OVSCleanup(Type属性),通过PCS命令行工具的Resource命令来创建资源,则最终的资源定义语句如下:

pcs resource create neutron-ovs-cleanup ocf:neutron:OVSCleanup --clone\ interleave=true

通过上述语句定义资源后,集群资源管理器将根据Standard、Provider以及Type属性信息对neutron-ovs-cleanup资源对应的RA脚本位置进行定位,在RHEL或者Centos系统中,软件安装完成后,符合OCF规范的RA脚本均位于/usr/lib/ocf/resource.d目录中。例如,在成功安装OpenStack的Neutron组件后,便可以到该目录下找到Type为OVSCleanup的RA脚本:

[root@controller1-vm ~]# cd /usr/lib/ocf/resource.d && ll

drwxr-xr-x 2 root root 4096 Mar  2 17:31 heartbeat

drwxr-xr-x 2 root root   61 Feb  8 02:55 neutron

drwxr-xr-x 2 root root   43 Mar  2 14:44 openstack

drwxr-xr-x 2 root root 4096 Mar  2 14:52 Pacemaker

drwxr-xr-x 2 root root  119 Mar  5 21:37 RabbitMQ

该目录下存放了全部的Providers,每个Provider目录下会有多个Types。在该示例中,/usr/lib/ocf/resource.d目录有5个子目录,每个子目录均是一个Provider,其中便有名为neutron的Provider,该Provider中有如下的Type:

[root@controller1-vm resource.d]# cd neutron && ll

-rwxr-xr-x 1 root root 4640 Apr 25  2015 NetnsCleanup

-rwxr-xr-x 1 root root 5831 Apr 26  2015 NeutronScale

-rwxr-xr-x 1 root root 4606 Apr 25  2015 OVSCleanup

可以看到,/usr/lib/ocf/resource.d/neutron目录下有3个可执行文件,每一个就是一个Type(即RA脚本的名称),在此,除了OVSCleanup外,neutron这个Provider还提供了NeutronScale和NetnsCleanup两个Type。在创建neutron-ovs-cleanup资源的过程中,定义资源属性的语句段是ocf:neutron:OVSCleanup(standard:provider:type),通过该信息,集群资源管理器便可定位资源RA脚本的最终位置,并使用该脚本来控制资源。资源属性的查看可以通过pcs命令行工具实现,最常使用的资源属性查看方式有以下几种:

pcs resource list:查看集群中所有可用资源列表。

pcs resource standards:查看支持的资源代理标准。

pcs resource providers:查看集群中可用资源代理提供程序列表。

pcs resource list string:查看根据指定字符串过滤的可用资源列表,可使用这个命令根据名称、提供程序或类型过滤资源。

pcs resource describe standard:provider:type:查看standard:provider:type指定的资源代理的详细信息。

如下示例演示了集群资源属性的查看方式及结果,示例环境为CentOS7系统,系统中已经安装有OpenStack相关的软件包和Pacemaker集群软件:

//查看当前集群中支持哪些标准(standards)

[root@controller1-vm ~]# pcs resource standards

ocf

lsb

service

systemd

stonith

//查看当前集群中有哪些资源代理提供程序(providers)

[root@controller1-vm ~]#  pcs resource providers

heartbeat

neutron

openstack

Pacemaker

RabbitMQ

//查看provider为heartbeat的提供者提供了哪些资源代理(Types)

[root@controller1-vm ~]#  pcs resource list heartbeat

ocf:heartbeat:CTDB - CTDB Resource Agent

ocf:heartbeat:Delay - Waits for a defined timespan

ocf:heartbeat:Dummy - Example stateless resource agent

ocf:heartbeat:Filesystem - Manages filesystem mounts

ocf:heartbeat:docker - Docker container resource agent.

ocf:heartbeat:MySQL - Manages a MySQL database instance

ocf:heartbeat:RabbitMQ-Cluster - RabbitMQ Clustered

……

//查看openstack这个provider提供了哪些资源代理(RA)

[root@controller1-vm ~]#  pcs resource list openstack

ocf:openstack:NovaCompute - OpenStack Nova Compute Server

ocf:openstack:NovaEvacuate - Evacuator for OpenStack Nova Compute Server

systemd:openstack-ceilometer-alarm-evaluator

systemd:openstack-ceilometer-alarm-notifier

systemd:openstack-ceilometer-api

systemd:openstack-ceilometer-central

systemd:openstack-ceilometer-collector

……

从示例输出中可以看到,当前集群支持的规范包括OCF、LSB、Service、Systemd和Stonith,而集群中的Provides包括Heartbeat、Neutron、Openstack、Pacemaker、RabbitMQ等,符合OCF规范的Heartbeat资源代理供应程序提供了包括MySQL、RabbitMQ-Cluster、IPaddr2和Filesystem等资源代理。其中,OpenStack这个Provider提供了符合OCF和Systemd两种规范的资源代理,这些资源代理是OpenStack高可用集群部署的基础,Pacemaker集群将通过这些资源代理对OpenStack服务进行控制。在众多资源代理中,用户可能想要了解某个资源代理的具体信息和使用方法,例如要了解NovaCompute资源代理的介绍和使用参数等信息,则可以通过如下命令实现:

[root@controller1-vm ~]#pcs resource describe ocf:openstack:NovaCompute

ocf:openstack:NovaCompute - OpenStack Nova Compute Server

OpenStack Nova Compute Server.

Resource options:

auth_url (required): Authorization URL for connecting to keystone in admin context

username (required): Username for connecting to keystone in admin context

password (required): Password for connecting to keystone in admin context

tenant_name (required): Tenant name for connecting to keystone in admin context. Note that with Keystone V3 tenant names are only unique within a domain.

domain: DNS domain in which hosts live, useful when the Cluster uses short names and nova uses FQDN

endpoint_type: Nova API location (internal, public or admin URL)

no_shared_storage: Disable shared storage recovery for instances. Use at your own risk!

evacuation_delay: How long to wait for nova to finish evacuating instances elsewhere before starting nova-compute. Only used when the agent detects evacuations might be in progress. You may need to increase the start timeout when increasing this value.

pcs resource命令的describe选项将会输出资源代理的详细使用信息,包括该资源代理的介绍和可以传递进去的参数。此外,由于不同的规范和Provider可以提供相同名称的资源代理,因此在一个集群系统中可能包含有多个同名的资源代理,如下:

[root@controller1-vm ~]# pcs resource agents|grep rabbit

RabbitMQ-Cluster

RabbitMQ-server

RabbitMQ-server-ha

set_RabbitMQ_policy.sh

RabbitMQ-server

虽然集群中有同名的资源代理(如RabbitMQ-server),但是由于它们属于不同的规范或者相同规范下不同的Provider,所以当资源管理器在调用这些同名的资源代理对资源进行管理时,操作执行后返回的结果可能完全不一样。为此,类似情况下,在定义集群资源的时候必须指定资源代理的绝对路径,从而告诉资源管理器在对该资源进行管理控制时具体调用的资源代理脚本在哪里。在Pacemaker集群中,要获取同名资源代理的绝对路径,可以通过如下方式实现:

 [root@controller1-vm ~]# pcs resource list RabbitMQ-server

ocf:RabbitMQ:RabbitMQ-server - Resource agent for RabbitMQ-server

lsb:RabbitMQ-server

示例输出中有两个同名的资源代理RabbitMQ-sever,其中一个属于LSB规范,另一个属于OCF规范,因此,从本质上来说这是两个完全不同的资源代理(来自不同版本或发行方的软件安装)。在Pacemaker集群中创建RabbitMQ资源时,通过lsb:rabitmq-sever告知资源管理器使用的是符合LSB规范的RabbitMQ资源代理,通过ocf:RabbitMQ:RabbitMQ-sever则告知资源管理器使用的是符合OCF规范的RabbitMQ资源代理。此外,多数OCF规范的资源代理都有资源选项(Resource Options)和元数据选项(Meta),资源选项即是可以传递给该资源代理的参数,Resource Options和Meta可以在创建资源时指定,也可以在资源创建完成后进行修改,创建带有Resource Options和Meta选项资源的语法如下:

pcs resource create resource_id standard:provider:type|type [resource options] [meta meta_options...]

如下命令在集群中创建一个名为vip-qpid的资源,并在资源选项中设定了该资源的IP地址和子网掩码,同时指定元数据Resource-Stickiness的值为50:

pcs resource create vip-qpid ocf:heartbeat:IPaddr2 ip= 192.168.0.120 cidr_net-mask=24 meta resource-stickiness= 50

元数据Resource-Stickiness表示资源的粘性,即资源倾向于当前状态的程度。如果资源已经创建完成,因为系统参数调整而要修改资源参数,例如集群中已经存在资源vip-qpid,现要修改资源的IP地址和Resource-Stickiness的值,则可以通过如下命令实现:

//修改前的vip-qpid资源属性如下:

[root@controller1-vm ~]# pcs resource show vip-qpid

Resource: vip-qpid (class=ocf provider=heartbeat type=IPaddr2)

Attributes: ip=192.168.0.120  nic=eth1

Meta Attrs: resource-stickiness=50

Operations: start interval=0s timeout=20s

//修改元数据Resource-Stickiness

[root@controller1-vm ~]# pcs resource meta vip-qpid\

resource-stickiness=INFINITY

//修改资源选项IP地址值

[root@controller1-vm ~]# pcs resource update vip-qpid ip=192.168.142.215

//修改后的vip-qpid资源属性如下:

[root@controller1-vm ~]# pcs resource show vip-qpid

Resource: vip-qpid (class=ocf provider=heartbeat type=IPaddr2)

Attributes: ip=192.168.142.215 nic=eth1

Meta Attrs: resource-stickiness=INFINITY

Operations: start interval=0s timeout=20s

在Pacemaker集群中,另一个常见的与资源管理相关的操作,就是重置资源状态并清除资源失败计数器,资源状态重置后,将会触发集群重新启动资源,这对于重新启动因处于失败状态而失去资源管理器控制的资源很有用,重置资源状态的语法如下:

pcs resource cleanup resource_id

如果在命令中没有指定 Resource_id,则这个命令会对集群中全部的资源进行状态重置和失败计数器清零,并且按照资源的启动依赖关系重新启动集群的全部资源,在集群资源管理中,在需要重启全部集群资源时,经常使用该方法。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。