第 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 等复杂服务,这需要控制和设置不同节点上的服务状态。
-
您不能使用
docker
或systemctl
管理捆绑包或容器。您可以使用 命令检查服务的状态,但必须使用 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 地址”。