Neutron/LBaaS/Architecture
< 中子 | LBaaS(重定向自 Quantum/LBaaS/Architecture)
范围
本文档描述了LBaaS的内部架构和工作流程。
模块分解
LBaaS架构基于引入到Quantum中的高级服务。结构如下
- LBaaS Quantum扩展 - 负责处理REST API调用 (BP: lbaas-restapi-tenant)
- LBaaS Quantum AdvSvc 插件 - 是服务的核心,负责:(BP: lbaas-plugin-api-crud)
- 数据库存储
- 请求验证
- 负载均衡服务的调度(部署到LB设备)
- LBaaS Agent - 是一个独立的,管理驱动的服务 (BP: lbaas-agent-and-rpc)
- 驱动 - 是一个模块,将LBaaS对象模型转换为特定厂商的模型,并将配置部署到负载均衡设备 (BP: lbaas-driver-api)
工作流程
LBaaS管理通过REST API进行。如果调用仅涉及数据库(读取、名称更新),则以同步方式完成,所有其他调用(如状态检索、写入操作)都以异步方式完成。有关更多详细信息,请参阅 Quantum/LBaaS/REST API。
有两种类型的锁
- 对象级别锁作用于一个实例(VIP、池、成员),并限制并发修改。通过将对象移动到 PENDING_* 状态之一来实现锁定。
- 设备级别锁用于锁定整个配置,禁止并发修改。由于这是一个限制性策略,请求实际上被放入队列,然后由驱动程序逐一处理。队列可以完全用 Python 代码实现,也可以是外部 MQ。
下图显示了 2 个并发更新请求,'alt' 块显示了请求的处理替代方案。
普通的更新工作流程是
- REST API请求被Quantum接受并路由到相应的扩展和插件。
- 插件执行请求验证(模式一致性、值和引用检查等)。如果验证失败,则返回40x代码之一(取决于原因)。
- 数据库对象被更新,对象移动到PENDING_UPDATE状态。
- 请求被转换为任务并推送到队列。
- 插件以HTTP 202回复用户。步骤1-5同步完成。
- Agent从队列中获取消息并将其转发给Driver。Driver更改负载均衡设备的配置。完成后,响应消息被推送到Plugin的队列。
- 插件检索消息并使用“ACTIVE”或“ERROR”状态更新数据库
数据模型应能抵抗不同故障和模块崩溃
- 如果在1)、2)或3)中发生崩溃,所有更改都将丢失,HTTP 500错误将返回给用户。
- 如果在4)或5)中发生崩溃,则插件会处理它并将对象移动到ERROR状态,返回HTTP 500错误。
- 如果在6)或7)中发生崩溃,则对象将保持在“PENDING_”状态。插件将在预配置的时间后或在重新启动后将对象移动到ERROR状态。
驱动API
有关详细信息,请参阅 Quantum/LBaaS/DriverAPI。

