扩展部署¶
当在需要处理大量传入请求的环境中部署时,API 和引擎服务可能会过载。在这种情况下,为了提高系统性能,运行多个负载均衡的 API 和引擎可能会有所帮助。
本指南详细介绍了如何扩展 REST API、CFN API 和引擎,分别称为 heat-api、heat-api-cfn 和 heat-engine 服务。
假设¶
本指南使用 OpenStack 的 devstack 安装,假设
您已配置来自 单机安装指南 的 devstack;
您已在 devstack 上设置 heat,如 heat 和 DevStack 中定义;
您已安装 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 发送的请求如下所示
CLI 联系代理;
HAProxy 服务器充当负载均衡器,将调用重定向到 API 实例;
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_connection 和 rabbit_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 服务。
基本架构¶
对于此示例,请考虑
我们有一个由配置在 LAN 中的 3 台机器组成的架构,地址为 A:10.0.0.1;B:10.0.0.2;和 C:10.0.0.3;
包括 heat 模块的 OpenStack devstack 安装已在机器 A 上完成,如 假设 部分所示。
目标架构¶
此时,所有内容都在单个 devstack 服务器上运行。接下来的小节显示了如何通过以下方式部署扩展 heat 架构
在机器 B 和 C 上运行一个 REST 和一个 CFN API;
在机器 A 上设置 HAProxy 服务器。
运行 API 和引擎服务¶
对于每台机器 B 和 C,您必须执行以下步骤
克隆 heat 仓库 https://opendev.org/openstack/heat,运行
- ::
git clone https://opendev.org/openstack/heat
创建机器 A 上 /etc/heat/heat.conf 配置文件的本地副本;
对配置文件进行必要的更改;
进入 heat 本地仓库并运行
python bin/heat-api --config-file=/etc/heat/heat.conf python bin/heat-api-cfn --config-file=/etc/heat/heat.conf
启动您希望在该机器上运行的多个 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-api 和 pkill heat-api-cfn 杀死 heat-api 和 heat-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