跳转到: 导航, 搜索

Neutron/LBaaS/Architecture

< Neutron‎ | LBaaS

范围

本文档描述了LBaaS的内部架构和工作流程。

模块分解

LBaaS架构基于引入到Quantum中的高级服务。结构如下:

Lbaas architecture new.png

  • 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' 块显示了请求的处理替代方案。

Sequence diagram.png

普通的更新工作流程是

  1. REST API请求被Quantum接受并路由到相应的扩展和插件。
  2. 插件执行请求验证(模式一致性、值和引用检查等)。如果验证失败,则返回40x错误代码之一(取决于原因)。
  3. 数据库对象被更新,对象移动到PENDING_UPDATE状态。
  4. 请求被转换为任务并推送到队列。
  5. 插件以HTTP 202回复用户。步骤1-5同步完成。
  6. Agent从队列中获取消息并将其转发给Driver。Driver更改负载均衡设备的配置。完成后,响应消息被推送到Plugin的队列。
  7. 插件检索消息并使用“ACTIVE”或“ERROR”状态更新数据库

数据模型应能抵抗不同故障和模块崩溃

  • 如果在1)、2)或3)中发生崩溃,所有更改都将丢失,向用户返回HTTP 500错误。
  • 如果在4)或5)中发生崩溃,插件会处理它并将对象移动到ERROR状态,返回HTTP 500错误。
  • 如果在6)或7)中发生崩溃,对象将保持在“PENDING_”状态。插件将在预配置的时间后或在重启后将对象移动到ERROR状态。

驱动API

有关详细信息,请参阅 Quantum/LBaaS/DriverAPI