为 ipam 模块引入分布式锁

https://blueprints.launchpad.net/neutron/+spec/introduce-distributed-locks-to-ipam RFE:https://bugs.launchpad.net/neutron/+bug/1836834

在 ipam 模块中引入 OpenStack tooz 分布式锁。在大型端口创建场景下,避免 ip 分配超过最大重试限制失败,并提高 ip 分配效率。

问题描述

  1. 当前的端口创建存在失败的可能性。

    当虚拟机批量创建时,nova 会并发调用 neutron API 创建端口。如果存在 ip 分配冲突,端口创建将失败,请参阅 [1]

    批量创建端口也存在类似的问题,当在同一子网上同时调用多个“create_port_bulk” API 时,尽管这种场景使用频率较低。

  2. 并发创建端口时,neutron 服务器 CPU 利用率增加,分配效率降低。

    当 ip 分配冲突导致无法提交数据库时,会抛出 DB ERROR 异常。 Create_port 会捕获上述异常,并在 retry_interval=0.1 后重试,并重新调用 create_port 直到超过 max_retries=10。 当超过 max_retries=10 次后,“Create_port” 将失败。当并发量大且冲突加剧时,重复调用 create_port 会增加 CPU 负担并降低分配效率。调整 retry_intervalmax_retries 只能降低出现问题的概率,但无法彻底解决它们。

提议的变更

此解决方案通过引入分布式锁来实现一个新的 ipam 驱动程序,以彻底解决 ip 地址分配冲突导致失败的问题。

对于分布式锁,我们将使用 OpenStack tooz [2],它支持许多后端驱动程序,例如 Zookeeper、Memcached、Redis、Mysql 等,并且是一个 OpenStack 原生项目。 我们将在 neutron.conf 中支持 tooz 后端驱动程序的配置,例如添加 [tooz] 配置项。

新的 IPAM 分配 ip 流程图。

../../_images/ipam-allocate.png

备选方案

  • 如果无法实现新的 ipam 驱动程序,我们可以修改当前的 ipam 驱动程序以引入分布式锁来解决上述问题。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

  • 操作员可以使用 neutron.conf 中的 [tooz] 配置块配置 tooz 的后端驱动程序。

    [tooz]
    # Tooz backend connection string.
    backend_url = file://$state_path
    
    # Number of seconds between heartbeats for distributed coordination.
    heartbeat = 1.0
    
    # Number of seconds to wait after failed reconnection to Tooz backend.
    initial_reconnect_backoff = 0.1
    
    # Maximum number of seconds between sequential reconnection retries to Tooz backend.
    max_reconnect_backoff = 60.0
    
  • 操作员可以通过在 neutron.conf 中设置“ipam_driver”来切换到我们新的 ipam 驱动程序。

    [default]
    # Neutron IPAM (IP address management) driver to use. By default, the reference
    # implementation of the Neutron IPAM driver is used. (string value)
    ipam_driver = ipam_with_dlm
    

性能影响

在使用 rally 并发测试创建虚拟机或端口或类似场景时。

优点

  • 解决了由于 ip 分配冲突导致创建虚拟机或端口失败的问题,并提高了成功率。

  • 减少了创建虚拟机或端口的平均时间。

  • 创建虚拟机或端口的时间分布更平滑。

轻微影响

  • 创建虚拟机或端口的最小时间略有增加,并且在非并发场景下创建端口的时间也会略有增加。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

qinhaizhong

其他贡献者

zhouhenglc

工作项

  • 创建一个新的 ipam 驱动程序。

  • 支持解析 [tooz] 后端驱动程序,封装分布式锁模块,并实现分布式锁初始化、加锁、解锁等。

  • 使“create_port”支持新的 ipam 驱动程序。

  • 使“bulk_create_port”支持新的 ipam 驱动程序。

  • 文档工作。

依赖项

测试

单元测试、功能测试。

文档影响

参考资料