第 4 章 使用 Pacemaker 管理高可用性服务

Pacemaker 服务管理核心容器和主动-被动服务,如 Galera、RabbitMQ、Redis 和 HAProxy。您可以使用 Pacemaker 查看和管理受管服务、虚拟 IP 地址、电源管理和隔离的一般信息。

有关 Red Hat Enterprise Linux 中的 Pacemaker 的详情,请参考 Red Hat Enterprise Linux 文档中的 配置和管理高可用性集群

4.1. 资源捆绑包和容器

Pacemaker 将 Red Hat OpenStack Platform(RHOSP)服务作为 捆绑设置资源或 捆绑包 进行管理。大多数服务都是以相同方式启动且始终在每个 Controller 节点上运行的主动服务。

Pacemaker 管理以下资源类型:

捆绑包(Bundle)
捆绑包资源在所有 Controller 节点上配置和复制相同的容器,映射容器目录所需的存储路径,并设置与资源本身相关的特定属性。
Container
容器可以运行不同类型的资源,从 HAProxy 等简单 systemd 服务到 Galera 等复杂服务,这需要控制和设置不同节点上的服务状态。
重要
  • 您不能使用 dockersystemctl 管理捆绑包或容器。您可以使用 命令检查服务的状态,但必须使用 Pacemaker 对这些服务执行操作。
  • Pacemaker 控制的 Docker 容器将 RestartPolicy 设置为 no。这是为了确保 Pacemaker(而非 Docker)控制容器启动和停止操作。

简单捆绑包设置资源(简单捆绑包)

简单的 Bundle Set 资源或 简单的捆绑包 是一组容器,每个容器都包含要在 Controller 节点上部署的相同 Pacemaker 服务。

以下示例显示了 pcs status 命令的输出中的简单捆绑包列表:

Docker container set: haproxy-bundle [192.168.24.1:8787/rhosp-rhel7/openstack-haproxy:pcmklatest]
  haproxy-bundle-docker-0      (ocf::heartbeat:docker):        Started overcloud-controller-0
  haproxy-bundle-docker-1      (ocf::heartbeat:docker):        Started overcloud-controller-1
  haproxy-bundle-docker-2      (ocf::heartbeat:docker):        Started overcloud-controller-2

对于每个捆绑包,您可以看到以下详情:

  • Pacemaker 分配给该服务的名称。
  • 对与捆绑包关联的容器的引用。
  • 在不同 Controller 节点上运行的副本的列表和状态。

以下示例显示了 haproxy-bundle 简单捆绑包的设置:

$ sudo pcs resource show haproxy-bundle
Bundle: haproxy-bundle
 Docker: image=192.168.24.1:8787/rhosp-rhel7/openstack-haproxy:pcmklatest network=host options="--user=root --log-driver=journald -e KOLLA_CONFIG_STRATEGY=COPY_ALWAYS" replicas=3 run-command="/bin/bash /usr/local/bin/kolla_start"
 Storage Mapping:
  options=ro source-dir=/var/lib/kolla/config_files/haproxy.json target-dir=/var/lib/kolla/config_files/config.json (haproxy-cfg-files)
  options=ro source-dir=/var/lib/config-data/puppet-generated/haproxy/ target-dir=/var/lib/kolla/config_files/src (haproxy-cfg-data)
  options=ro source-dir=/etc/hosts target-dir=/etc/hosts (haproxy-hosts)
  options=ro source-dir=/etc/localtime target-dir=/etc/localtime (haproxy-localtime)
  options=ro source-dir=/etc/pki/ca-trust/extracted target-dir=/etc/pki/ca-trust/extracted (haproxy-pki-extracted)
  options=ro source-dir=/etc/pki/tls/certs/ca-bundle.crt target-dir=/etc/pki/tls/certs/ca-bundle.crt (haproxy-pki-ca-bundle-crt)
  options=ro source-dir=/etc/pki/tls/certs/ca-bundle.trust.crt target-dir=/etc/pki/tls/certs/ca-bundle.trust.crt (haproxy-pki-ca-bundle-trust-crt)
  options=ro source-dir=/etc/pki/tls/cert.pem target-dir=/etc/pki/tls/cert.pem (haproxy-pki-cert)
  options=rw source-dir=/dev/log target-dir=/dev/log (haproxy-dev-log)

以下示例显示了以下与捆绑包中容器相关的信息:

  • 镜像 :供容器使用的镜像,引用 undercloud 的本地 registry。
  • 网络 :容器网络类型,本例中为 "host "。
  • 选项 : 容器的特定选项。
  • 副本 :指示容器的数量必须在集群中运行。每个捆绑包包括三个容器,每个 Controller 节点对应一个容器。
  • run-command :用于生成容器的 System 命令。
  • 存储映射 :将每个主机上的本地路径映射到容器。要从主机检查 haproxy 配置,打开 /var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg 文件,而不是 /etc/haproxy/haproxy.cfg 文件。
注意

虽然 HAProxy 通过负载均衡流量到所选服务来提供高可用性服务,但您可以将 HAProxy 配置为高度可用的服务,方法是将它作为 Pacemaker 捆绑服务进行管理。

复杂的 Bundle Set resources(complex 捆绑包)

复杂的 Bundle Set 资源或 复杂的捆绑包 是 Pacemaker 服务,除了包含在简单捆绑包中的基本容器配置外,还指定资源配置。

需要此配置来管理 多State 资源,它们是服务,根据它们运行的 Controller 节点,它们有不同的状态。

这个示例显示 pcs status 命令的输出中的复杂捆绑包列表:

Docker container set: rabbitmq-bundle [192.168.24.1:8787/rhosp-rhel7/openstack-rabbitmq:pcmklatest]
  rabbitmq-bundle-0    (ocf::heartbeat:rabbitmq-cluster):      Started overcloud-controller-0
  rabbitmq-bundle-1    (ocf::heartbeat:rabbitmq-cluster):      Started overcloud-controller-1
  rabbitmq-bundle-2    (ocf::heartbeat:rabbitmq-cluster):      Started overcloud-controller-2
Docker container set: galera-bundle [192.168.24.1:8787/rhosp-rhel7/openstack-mariadb:pcmklatest]
  galera-bundle-0      (ocf::heartbeat:galera):        Master overcloud-controller-0
  galera-bundle-1      (ocf::heartbeat:galera):        Master overcloud-controller-1
  galera-bundle-2      (ocf::heartbeat:galera):        Master overcloud-controller-2
Docker container set: redis-bundle [192.168.24.1:8787/rhosp-rhel7/openstack-redis:pcmklatest]
  redis-bundle-0       (ocf::heartbeat:redis): Master overcloud-controller-0
  redis-bundle-1       (ocf::heartbeat:redis): Slave overcloud-controller-1
  redis-bundle-2       (ocf::heartbeat:redis): Slave overcloud-controller-2

此输出显示以下有关每个复杂捆绑包的信息:

  • RabbitMQ:所有三个 Controller 节点都运行服务的独立实例,类似于简单的捆绑包。
  • Galera:所有三个 Controller 节点在同一限制下作为 Galera 主节点运行。
  • Redis: overcloud-controller-0 容器作为 master 运行,其他两个 Controller 节点则作为从设备运行。每个容器类型可能会在不同的约束下运行。

以下示例显示了 galera-bundle 复杂捆绑包的设置:

[...]
Bundle: galera-bundle
 Docker: image=192.168.24.1:8787/rhosp-rhel7/openstack-mariadb:pcmklatest masters=3 network=host options="--user=root --log-driver=journald -e KOLLA_CONFIG_STRATEGY=COPY_ALWAYS" replicas=3 run-command="/bin/bash /usr/local/bin/kolla_start"
 Network: control-port=3123
 Storage Mapping:
  options=ro source-dir=/var/lib/kolla/config_files/mysql.json target-dir=/var/lib/kolla/config_files/config.json (mysql-cfg-files)
  options=ro source-dir=/var/lib/config-data/puppet-generated/mysql/ target-dir=/var/lib/kolla/config_files/src (mysql-cfg-data)
  options=ro source-dir=/etc/hosts target-dir=/etc/hosts (mysql-hosts)
  options=ro source-dir=/etc/localtime target-dir=/etc/localtime (mysql-localtime)
  options=rw source-dir=/var/lib/mysql target-dir=/var/lib/mysql (mysql-lib)
  options=rw source-dir=/var/log/mariadb target-dir=/var/log/mariadb (mysql-log-mariadb)
  options=rw source-dir=/dev/log target-dir=/dev/log (mysql-dev-log)
 Resource: galera (class=ocf provider=heartbeat type=galera)
  Attributes: additional_parameters=--open-files-limit=16384 cluster_host_map=overcloud-controller-0:overcloud-controller-0.internalapi.localdomain;overcloud-controller-1:overcloud-controller-1.internalapi.localdomain;overcloud-controller-2:overcloud-controller-2.internalapi.localdomain enable_creation=true wsrep_cluster_address=gcomm://overcloud-controller-0.internalapi.localdomain,overcloud-controller-1.internalapi.localdomain,overcloud-controller-2.internalapi.localdomain
  Meta Attrs: container-attribute-target=host master-max=3 ordered=true
  Operations: demote interval=0s timeout=120 (galera-demote-interval-0s)
              monitor interval=20 timeout=30 (galera-monitor-interval-20)
              monitor interval=10 role=Master timeout=30 (galera-monitor-interval-10)
              monitor interval=30 role=Slave timeout=30 (galera-monitor-interval-30)
              promote interval=0s on-fail=block timeout=300s (galera-promote-interval-0s)
              start interval=0s timeout=120 (galera-start-interval-0s)
              stop interval=0s timeout=120 (galera-stop-interval-0s)
[...]

此输出显示,与简单的捆绑包不同,galera-bundle 资源包含了明确的资源配置,用于决定多状态资源的所有方面。

注意

虽然服务可以同时在多个 Controller 节点上运行,但 Controller 节点本身可能无法侦听访问这些服务所需的 IP 地址。有关如何检查服务的 IP 地址的详情,请参考 第 4.4 节 “查看虚拟 IP 地址”