扩展部署

当在需要处理大量传入请求的环境中部署时,API 和引擎服务可能会过载。在这种情况下,为了提高系统性能,运行多个负载均衡的 API 和引擎可能会有所帮助。

本指南详细介绍了如何扩展 REST API、CFN API 和引擎,分别称为 heat-apiheat-api-cfnheat-engine 服务。

假设

本指南使用 OpenStack 的 devstack 安装,假设

  1. 您已配置来自 单机安装指南 的 devstack;

  2. 您已在 devstack 上设置 heat,如 heat 和 DevStack 中定义;

  3. 您已安装 HAProxy 在 devstack 服务器上。

架构

本节展示了基本的 heat 架构、使用的负载均衡机制以及目标扩展架构。

基本架构

heat 架构如 heat 架构 中定义并在下图中所示,我们有一个 CLI,它向 REST 和 CFN API 发送 HTTP 请求,这些 API 反过来使用 AMQP 向 heat-engine 发出调用

                  |- [REST API] -|
[CLI] -- <HTTP> --                -- <AMQP> -- [ENGINE]
                  |- [CFN API]  -|

负载均衡

由于需要在多个 API 和 CLI 之间使用负载均衡机制,因此必须部署一个代理。

由于 heat CLI 和 API 通过交换 HTTP 请求和响应进行通信,因此将在它们之间部署一个 HAProxy HTTP 负载均衡服务器。

这样,代理将接收来自 CLI 的请求到 API,并代表它们执行操作。一旦代理收到响应,它将被重定向到调用 CLI。

AMQP 队列的消息轮询分发将作为多个引擎的负载均衡器。检查您的 AMQP 服务是否配置为轮询分发消息(RabbitMQ 默认执行此操作)。

目标架构

扩展后的 heat 架构在下图中表示

                             |- [REST-API] -|
                             |-    ...     -|
                             |- [REST-API] -|             |- [ENGINE] -|
[CLI] -- <HTTP> -- [PROXY] --                -- <AMQP> -- |-    ...   -|
                             |- [API-CFN]  -|             |- [ENGINE] -|
                             |-    ...     -|
                             |- [API-CFN]  -|

因此,从 CLI 发送的请求如下所示

  1. CLI 联系代理;

  2. HAProxy 服务器充当负载均衡器,将调用重定向到 API 实例;

  3. API 服务器将消息发送到 AMQP 队列,引擎以轮询方式获取消息。

部署多个 API

为了单独运行 heat 组件,您必须执行位于 heat 仓库的 bin 目录中的一个 python 脚本。

这些脚本将配置文件作为参数。使用 devstack 时,配置文件位于 /etc/heat/heat.conf。例如,要启动新的 REST 和 CFN API 服务,您必须运行

python bin/heat-api --config-file=/etc/heat/heat.conf
python bin/heat-api-cfn --config-file=/etc/heat/heat.conf

每个 API 服务都必须有一个唯一的地址来监听。 并且 host 值也应该是唯一的。

[DEFAULT]
host = {host}

如果您希望在与 devstack 服务器不同的机器上运行多个 API 进程,则必须创建多个 heat.conf 文件的副本,每个副本都包含唯一的 host 字符串。

此外,如果您想在与 devstack 服务器不同的机器上运行一些 API 服务,则必须更新在 sql_connectionrabbit_host 属性中找到的环回地址,更新为远程机器可以访问的 devstack 服务器的 IP。

部署多个引擎

所有引擎必须配置为使用相同的 AMQP 服务。确保 rabbit_* 和 kombu_* 配置选项在 /etc/heat/heat.conf[DEFAULT] 部分中匹配,跨越将运行引擎的每台机器。通过使用相同的 AMQP 配置,每个引擎将订阅相同的 AMQP engine 队列,并以轮询方式与其他引擎一起获取工作。

每个主机可以部署一个或多个引擎。根据主机的 CPU 架构,在一台机器上部署多个引擎可能是有益的。

要在同一台机器上启动多个引擎,只需启动多个 heat-engine 进程

python bin/heat-engine --config-file=/etc/heat/heat.conf &
python bin/heat-engine --config-file=/etc/heat/heat.conf &

部署代理

为了简化 HAProxy 服务器的部署,我们将安装 devstack 时部署的 REST 和 CFN API 替换为 HAProxy 服务器。这样,无需在 CLI 上更新它应该查找 API 的地址。在这种情况下,当它对任何 API 进行调用时,它会找到代理,代表它们执行操作。

要在 devstack 服务器上部署 HAProxy 服务器,请运行 haproxy -f apis-proxy.conf,其中此配置文件如下所示

global
    daemon
    maxconn 4000

defaults
    log  global
    maxconn  8000
    option  redispatch
    retries  3
    timeout  http-request 10s
    timeout  queue 1m
    timeout  connect 10s
    timeout  client 1m
    timeout  server 1m
    timeout  check 10s

listen rest_api_proxy
    # The values required below are the original ones that were in
    # /etc/heat/heat.conf on the devstack server.
    bind {API_HOST}:{API_PORT}
    balance  source
    option  tcpka
    option  httpchk
    # The values required below are the different addresses supplied when
    # running the REST API instances.
    server SERVER_1 {HOST_1}:{PORT_1}
    ...
    server SERVER_N {HOST_N}:{PORT_N}

listen cfn_api_proxy
    # The values required below are the original ones that were in
    # /etc/heat/heat.conf on the devstack server.
    bind {API_CFN_HOST}:{API_CFN_PORT}
    balance  source
    option  tcpka
    option  httpchk
    # The values required below are the different addresses supplied when
    # running the CFN API instances.
    server SERVER_1 {HOST_1}:{PORT_1}
    ...
    server SERVER_N {HOST_N}:{PORT_N}

示例

本节旨在阐明扩展解决方案的某些方面,以及通过描述具体的示例来显示配置的更多详细信息。

架构

本节显示了一个基本的 OpenStack 架构和目标架构,该架构将用于测试扩展的 heat 服务。

基本架构

对于此示例,请考虑

  1. 我们有一个由配置在 LAN 中的 3 台机器组成的架构,地址为 A:10.0.0.1;B:10.0.0.2;和 C:10.0.0.3;

  2. 包括 heat 模块的 OpenStack devstack 安装已在机器 A 上完成,如 假设 部分所示。

目标架构

此时,所有内容都在单个 devstack 服务器上运行。接下来的小节显示了如何通过以下方式部署扩展 heat 架构

  1. 在机器 B 和 C 上运行一个 REST 和一个 CFN API;

  2. 在机器 A 上设置 HAProxy 服务器。

运行 API 和引擎服务

对于每台机器 B 和 C,您必须执行以下步骤

  1. 克隆 heat 仓库 https://opendev.org/openstack/heat,运行

::

git clone https://opendev.org/openstack/heat

  1. 创建机器 A 上 /etc/heat/heat.conf 配置文件的本地副本;

  2. 对配置文件进行必要的更改;

  3. 进入 heat 本地仓库并运行

python bin/heat-api --config-file=/etc/heat/heat.conf
python bin/heat-api-cfn --config-file=/etc/heat/heat.conf
  1. 启动您希望在该机器上运行的多个 heat-engine 进程

python bin/heat-engine --config-file=/etc/heat/heat.conf &
python bin/heat-engine --config-file=/etc/heat/heat.conf &
...

配置更改

A 上的原始文件如下所示

[DEFAULT]
...
sql_connection = mysql+pymysql://root:admin@127.0.0.1/heat?charset=utf8
rabbit_host = localhost
host = localhost
...

B 上的更改后如下所示

[DEFAULT]
...
sql_connection = mysql+pymysql://root:admin@10.0.0.1/heat?charset=utf8
rabbit_host = 10.0.0.1
host = 10.0.0.2
...

设置 HAProxy

在机器 A 上,通过运行 pkill heat-apipkill heat-api-cfn 杀死 heat-apiheat-api-cfn 进程。之后,使用以下配置运行 haproxy -f apis-proxy.conf

 global
    daemon
    maxconn 4000

defaults
    log  global
    maxconn  8000
    option  redispatch
    retries  3
    timeout  http-request 10s
    timeout  queue 1m
    timeout  connect 10s
    timeout  client 1m
    timeout  server 1m
    timeout  check 10s

listen rest_api_proxy
    bind 10.0.0.1:8004
    balance  source
    option  tcpka
    option  httpchk
    server rest-server-1 10.0.0.2:8004
    server rest-server-2 10.0.0.3:8004

listen cfn_api_proxy
    bind 10.0.0.1:8000
    balance  source
    option  tcpka
    option  httpchk
    server cfn-server-1 10.0.0.2:8000
    server cfn-server-2 10.0.0.3:8000