Eventlet 弃用参考¶
本文档包含与 eventlet 库弃用相关的信息。每个部分描述了每个模块的迁移方式、注意事项、待处理的技术债务和缺失的部分。
OVN Agent¶
启动过程¶
OVN agent 的执行已被替换。不再使用仍在利用 eventlet 的 oslo_services.launch,agent 创建一个 threading.Event 实例,并通过等待此事件来保持主线程执行。
注意
一旦 oslo_services 库删除了 eventlet 的使用,之前的实现将被恢复。 oslo_services.service.ProcessLauncher 服务启动器实现了一个信号处理程序。
Metadata proxy¶
UnixDomainWSGIServer 类已被新的实现替换。此实现不依赖于 neutron.api.wsgi.Server 或 eventlet.wsgi.server。它继承自内置库类 socketserver.StreamRequestHandler。
注意
此实现不使用 oslo_services 来根据 metadata_workers 配置变量生成进程或本地线程。目前仅实现了嵌入式形式(本地线程)(metadata_workers=0,默认值)。未来的实现将重新启用此配置变量。
OVN metadata agent¶
Metadata proxy¶
OVN metadata agent 使用与 OVN agent 相同的实现。相同的限制适用。
Metadata agent¶
Metadata agent 使用与 OVN agent 相同的实现,并且相同的限制适用。 MetadataProxyHandler 类现在每次进行新的请求时都会被实例化;调用结束后,该实例将被销毁。用于存储先前 RPC 调用结果的缓存不再相关,已被删除。为了实现 RPC 缓存,应该在上述类之外实现它。
L3 agent¶
L3 agent 现在使用 oslo_service.backend.BackendType.THREADING 后端,该后端不导入 eventlet。HA 变体用 UnixDomainWSGIThreadServer 替换了 UnixDomainWSGIServer。这个新的 Unix socket WSGI 服务器基于 socketserver.ThreadingUnixStreamServer,不使用 eventlet。
在 eventlet 完全从仓库和测试框架中删除之前,已经跳过了几个功能和完整堆栈测试。WSGI 服务器无法在打补丁的 eventlet 环境中生成。等待新消息的线程是一个阻塞函数。在内核线程环境中,其中线程是抢占式的,不需要手动释放 Python GIL;相反,在 eventlet 环境中,线程必须将执行器让给下一个线程。
Neutron API¶
Neutron API 目前只能使用 uWSGI 模块执行;eventlet 执行器已被弃用,尽管代码尚未从仓库中删除。现在必须在 uWSGI 配置文件中定义配置变量 start-time,使用魔术变量 [1] “%t”,它提供Unix 时间(以秒为单位,在实例启动时收集)。
[uwsgi]
start-time = %t
Neutron API 由以下可执行文件组成
API 服务器:是一个多进程工作者;每个进程由
uWSGI服务器创建。周期性工作者:一个多进程工作者,它生成多个线程来执行周期性工作者。
RPC 工作者:一个多进程工作者,它处理来自 RPC 客户端(例如 Neutron agent)的请求。
ML2/OVN 维护工作者:单个进程工作者,由 ML2/OVN 机制驱动程序需要。
注意
目前,API 服务器、OVN 维护任务和周期性工作者任务正在没有 eventlet 的情况下运行。
ML2/OVN¶
ML2/OVN 机制驱动程序需要在所有节点(控制器)和工作者之间进行同步方法。OVN 数据库事件将由所有节点中的所有工作者接收;但是,只有一名工作者应该处理此事件。在每个工作者中本地实例化的 HashRingManager 负责哈希接收到的事件并决定哪个工作者将处理该事件。
HashRingManager 使用存储在 Neutron 数据库中的信息来确定此时有多少工作者处于活动状态。每个工作者将在 Neutron 数据库中注册自身,在 ovn_hash_ring 表中创建一个注册项。每个注册项的 UUID 使用一种确定性方法创建,该方法取决于 (1) 哈希环组(对于 API 工作者始终为“mechanism_driver”),(2) 主机名和 (3) 工作者 ID。如果工作者重新启动,此方法将提供相同的注册项 UUID,并且先前注册项(如果存在于数据库中)将被覆盖。
OVN 维护任务¶
OvnDbSynchronizer 类现在使用 threading.Thread 来生成 do_sync 函数。这由 Northbound 和 Southbound 同步类(OvnNbSynchronizer、OvnSbSynchronizer)使用。
注意
stop 方法需要进行重构,以及每个子类中实现的 do_sync 函数。 stop 方法需要支持快速退出机制,以尽快停止正在运行的同步。
移除和弃用¶
基于 eventlet 的 api.wsgi.Server 类,用于在 Neutron API 和 Metadata 服务器中处理多个 WSGI 套接字,已被从仓库中删除。