配置有状态服务¶
高可用性的数据库¶
Galera¶
第一步是安装集群核心的数据库。为了实现高可用性,在每个控制节点上运行数据库实例,并使用 Galera Cluster 提供它们之间的复制。Galera Cluster 是一个基于 MySQL 和 InnoDB 存储引擎的同步多主数据库集群。它是一种高可用性服务,可提供高系统正常运行时间、无数据丢失和可扩展性。
您可以根据要使用的数据库类型,以多种不同的方式实现 OpenStack 数据库的高可用性。Galera Cluster 有三种实现方式可供您使用
Galera Cluster for MySQL:Codership, Oy 的 MySQL 参考实现。
MariaDB Galera Cluster:MariaDB 的 Galera Cluster 实现,通常在基于 Red Hat 发行版的环境中得到支持。
Percona XtraDB Cluster:Percona 的 XtraDB Galera Cluster 实现。
除了 Galera Cluster 之外,您还可以通过其他数据库选项(例如 PostgreSQL)来实现高可用性,PostgreSQL 具有自己的复制系统。
Pacemaker 主/被动模式与 HAproxy¶
复制存储¶
例如:DRBD
高可用性的消息传递服务¶
RabbitMQ¶
为了协调进入系统的作业的执行,大多数 OpenStack 组件都需要符合 AMQP(高级消息队列协议)的消息总线。
RabbitMQ 是 OpenStack 安装中最常用的 AMQP 实现。
RabbitMQ 节点在应用程序和基础设施层上进行故障转移。
应用程序层由 oslo.messaging 配置选项控制多个 AMQP 主机。如果 AMQP 节点失败,应用程序将在指定的重新连接间隔内重新连接到下一个配置的主机。指定的重新连接间隔构成其 SLA。
在基础设施层上,SLA 是 RabbitMQ 集群重新组装的时间。存在几种情况。Mnesia keeper 节点是 RabbitMQ 相应 Pacemaker 资源的 master。当它失败时,结果是完整的 AMQP 集群停机时间间隔。通常,其 SLA 不超过几分钟。另一个节点(它是 RabbitMQ 相应 Pacemaker 资源的 slave)的故障不会导致任何 AMQP 集群停机时间。
使 RabbitMQ 服务具有高可用性涉及以下步骤
注意
通常不通过 HAProxy 处理对 RabbitMQ 的访问。相反,必须向消费者提供运行 RabbitMQ 的所有主机列表,并使用 rabbit_hosts 并启用 rabbit_ha_queues 选项。有关更多信息,请阅读 核心问题。有关更多详细信息,请阅读 历史和解决方案。
安装 RabbitMQ¶
安装 RabbitMQ 的命令取决于您使用的 Linux 发行版。
对于 Ubuntu 或 Debian
对于 RHEL、Fedora 或 CentOS
对于 openSUSE
对于 SLES 12
注意
对于 SLES 12,软件包由 GPG 密钥 893A90DAD85F9316 签名。在使用它之前,应验证导入的 GPG 密钥的指纹。
Key ID: 893A90DAD85F9316
Key Name: Cloud:OpenStack OBS Project <Cloud:OpenStack@build.opensuse.org>
Key Fingerprint: 35B34E18ABC1076D66D5A86B893A90DAD85F9316
Key Created: Tue Oct 8 13:34:21 2013
Key Expires: Thu Dec 17 13:34:21 2015
有关更多信息,请参阅发行版的官方安装手册
基于 RPM(RHEL、Fedora、CentOS、openSUSE)
配置 RabbitMQ 以实现 HA 队列¶
以下组件/服务可以使用 HA 队列
OpenStack Compute
OpenStack 块存储
OpenStack Networking
Telemetry
请注意,虽然交换器和绑定可以在单个节点丢失时幸存下来,但队列及其消息却不能,因为队列及其内容位于一个节点上。如果丢失此节点,我们也会丢失队列。
RabbitMQ 中的镜像队列提高了服务的可用性,因为它具有容错能力。
生产服务器应运行(至少)三个 RabbitMQ 服务器用于测试和演示目的,但是也可以运行两个服务器。在本节中,我们配置两个节点,分别称为 rabbit1 和 rabbit2。要构建一个 broker,请确保所有节点都具有相同的 Erlang cookie 文件。
停止 RabbitMQ 并将 cookie 从第一个节点复制到每个其他节点
# scp /var/lib/rabbitmq/.erlang.cookie root@NODE:/var/lib/rabbitmq/.erlang.cookie
在每个目标节点上,验证文件
erlang.cookie的正确所有者、组和权限# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie # chmod 400 /var/lib/rabbitmq/.erlang.cookie
在所有节点上启动消息队列服务,并配置它在系统启动时启动。在 Ubuntu 上,默认情况下已配置。
在 CentOS、RHEL、openSUSE 和 SLES 上
# systemctl enable rabbitmq-server.service # systemctl start rabbitmq-server.service
验证节点是否正在运行
# rabbitmqctl cluster_status Cluster status of node rabbit@NODE... [{nodes,[{disc,[rabbit@NODE]}]}, {running_nodes,[rabbit@NODE]}, {partitions,[]}] ...done.
在每个节点(第一个节点除外)上运行以下命令
# rabbitmqctl stop_app Stopping node rabbit@NODE... ...done. # rabbitmqctl join_cluster --ram rabbit@rabbit1 # rabbitmqctl start_app Starting node rabbit@NODE ... ...done.
注意
默认节点类型是 disc 节点。在本指南中,节点作为 RAM 节点加入集群。
验证集群状态
# rabbitmqctl cluster_status Cluster status of node rabbit@NODE... [{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@NODE]}]}, \ {running_nodes,[rabbit@NODE,rabbit@rabbit1]}]
如果集群正常工作,您可以创建队列的用户名和密码。
要确保除自动生成名称的队列之外的所有队列都在所有正在运行的节点上镜像,请通过在其中一个节点上运行以下命令将
ha-mode策略键设置为 all# rabbitmqctl set_policy ha-all '^(?!amq\.).*' '{"ha-mode": "all"}'
有关更多信息,请参阅 RabbitMQ 文档
注意
作为使 RabbitMQ 具有高可用性的另一种选择,RabbitMQ 包含自版本 3.5.7 起的 Pacemaker 集群资源代理的 OCF 脚本。它提供具有镜像队列的主/主 RabbitMQ 集群。有关更多信息,请参阅 使用 Pacemaker 自动配置集群。
配置 OpenStack 服务以使用 Rabbit HA 队列¶
配置 OpenStack 组件以使用至少两个 RabbitMQ 节点。
使用以下步骤配置所有使用 RabbitMQ 的服务
RabbitMQ HA 集群
host:port对rabbit_hosts=rabbit1:5672,rabbit2:5672,rabbit3:5672重试连接 RabbitMQ
rabbit_retry_interval=1在重试连接 RabbitMQ 之间退避多长时间
rabbit_retry_backoff=2尝试连接 RabbitMQ 的最大重试次数(默认情况下为无限次)
rabbit_max_retries=0在 RabbitMQ 中使用持久队列
rabbit_durable_queues=true在 RabbitMQ 中使用 HA 队列 (
x-ha-policy: all)rabbit_ha_queues=true
注意
如果您从未使用 HA 队列的旧设置更改配置,请重新启动该服务
# rabbitmqctl stop_app
# rabbitmqctl reset
# rabbitmqctl start_app