ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Apache Airflow 3.4 Team 命名规则收紧:小写约束、`__` 禁令与数据库迁移全解析

Apache Airflow 3.4 Team 命名规则收紧:小写约束、`__` 禁令与数据库迁移全解析 Apache Airflow 3.4 Team 命名规则收紧小写约束、__禁令与数据库迁移全解析【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow本指南以 Airflow 3.4.0 的 significant 变更对应仓库 newsfragment 70886.significant.rst为核心深入讲解团队Team命名规则的收紧背景、新正则规则的精确语义、airflow teams create/airflow teams sync/airflow db migrate的行为变化以及旧数据如何被安全迁移。读完你将掌握为什么 Team 名必须全小写且禁止连续双下划线这条规则由哪些源码强制实施以及在升级前需要做哪些检查与改名操作。变更概览Team 名称从此只允许小写从 Apache Airflow 3.4.0 开始Team 名称必须为小写且不能包含两个连续的下划线__。airflow teams create与airflow teams sync两个命令现在只接受符合以下正则的团队名(?!.*__)[a-z0-9_-]{3,50}即小写字母a-z、数字0-9、连字符-与单个下划线_组成的、长度在 3 到 50 个字符之间的字符串且整体不得出现__连续下划线。此前的版本接受大写字母也接受__连续下划线本次变更是一次破坏性significant收紧。为什么必须小写AIRFLOW_CONN__TEAM___ID命名空间的陷阱这次规则收紧并非凭空设计而是源于 Team 级密钥secret在环境变量命名空间中的解析冲突。Airflow 的环境变量 Secrets 后端使用如下格式承载 Team 级密钥参见 environment_variables.py 中的实现AIRFLOW_CONN__TEAM___ID # Team 级 Connection AIRFLOW_VAR__TEAM___VAR_KEY # Team 级 Variable其中___三个连续下划线是团队名与密钥 ID 之间的分隔符源码中注释为 Separates the team name from the secret id in a team namespaced environment variable name。而 Secrets 后端在拼接该变量名时会执行team_name.upper()将团队名转为大写# airflow-core/src/airflow/secrets/environment_variables.py team_var : os.environ.get(f{CONN_ENV_PREFIX}_{team_name.upper()}___ conn_id.upper())由此产生两个直接后果大小写不同的团队名会撞车后端统一 upper-case因此data_eng与Data_Eng会被折叠到同一个环境变量命名空间AIRFLOW_CONN__DATA_ENG___...两个团队会彼此读到对方的 Connection 与 Variable形成隐性的跨团队泄密。含__的名字会破坏分隔符语义若团队名本身包含___就无法与命名空间中的___分隔符区分开解析必然错乱。这两点正是新规则排除大写字母与连续双下划线的根因。规则的正式定义位于 team.py# What airflow teams create and airflow teams sync accept as a team name. # 该模式刻意不锚定unanchored并始终配合 re.fullmatch 使用 # 因为 re.match 配合 $ 锚点仍会接受结尾换行而 teams sync 路径不会对 bundle 配置做 strip。 TEAM_NAME_PATTERN r(?!.*__)[a-z0-9_-]{3,50}注意(?!.*__)是负向前瞻只要名字任意位置出现连续双下划线即判为非法{3,50}限定了长度区间整个模式必须通过re.fullmatch才能通过校验。同文件还提供了find_invalid_team_names()用于批量找出不合规的名字并排序返回。命令行为变化create / sync / delete / verify团队管理的 CLI 实现在 team_command.py本次变更对各子命令的影响如下。airflow teams create强校验创建路径使用_extract_new_team_name()严格按TEAM_NAME_PATTERN做re.fullmatch校验不通过直接以非零退出并输出提示def _extract_new_team_name(args): Extract a team name for a creation path, holding it to the name rule. team_name _extract_team_name(args) if not re.fullmatch(TEAM_NAME_PATTERN, team_name): raise SystemExit(fInvalid team name: must match regex {TEAM_NAME_PATTERN}) return team_name创建时还会检查重名Team with name ... already exists并在core.multi_team开启时自动为团队创建默认 Pool_create_default_team_pool。airflow teams sync双向校验历史遗留名导致非零退出team_sync()从 DAG bundle 配置中读取bundle.team_name集合与数据库中已有团队取并集后统一校验。这里有一个容易被忽略的关键点校验对象不止是待同步的新配置还包括数据库中已存储的名字。原因在源码注释中说明得很清楚——早期的teams sync发布时没有任何校验因此一个部署环境中可能已经存在规则不接受的名字若只检查传入配置就会漏掉“此前由 sync 创建、后来被从配置中移除”的团队。因此if invalid : find_invalid_team_names(dag_bundle_teams | existing_teams): raise SystemExit( fInvalid team name(s): {, .join(invalid)}. fTeam names must match regex {TEAM_NAME_PATTERN}. Names already stored must be corrected before syncing. )也就是说如果库里残留着含__之类的非法名字airflow teams sync会直接失败退出非零——即使这些名字不是本次要同步的。需要先把它们改掉sync 才能恢复。此外sync 仅在core.multi_team开启时执行否则打印 multi-team is not enabled; nothing to synchronize. 并返回。airflow teams delete豁免规则保证可删除与 create/sync 不同删除路径使用_extract_team_name()不套用命名规则。原因同样是历史遗留如果一个团队名是旧规则下存储的、当前规则判为非法的行必须仍然允许它被删除否则该团队将永远无法清理“otherwise a team that violates it could never be removed”。删除前会检查 DAG bundle、Connection、Variable、Pool 的关联数量有关联时拒绝删除并要求先解除随后要求交互确认或用--yes跳过。airflow teams verify一致性体检team_verify()检查每个团队是否都有默认 Pool以及每个 DAG bundle 引用的team_name是否真实存在发现问题以非零退出并逐条打印✗详情。数据库迁移airflow db migrate的小写折叠迁移前置检查拒绝“仅大小写不同”的团队对airflow db migrate在真正执行迁移前会运行check_team_names_can_be_lower_cased()实现在 utils/db.py把库中所有团队名按name.lower()分组只要存在两个名字仅大小写不同折叠后相同迁移就拒绝启动并给出明确指引Teams Data_Eng, data_eng differ only in case and would both become data_eng. Rename all but one with airflow teams create / airflow teams delete, moving its Dag bundles, Connections, Variables and Pools across, before migrating.原因很直接迁移会把所有存储的名字折叠成小写两个仅大小写不同的名字折叠后会落到同一行两个团队会被静默合并后者的 Dag bundles、Connections、Variables、Pools、Triggers 全部归并到前者名下。合并哪个名字、丢弃哪个资源不是迁移脚本该替运维做的决定因此迁移直接拒绝要求先手动改名。迁移脚本连坐改名五类关联数据迁移本体是 0131_3_4_0_lower_case_team_names.pyrevisionc7f0a5d2e9b4airflow_version 3.4.0。由于team.name是主键、且外键没有ON UPDATE CASCADE改名必须“连坐”所有引用它的行否则要么违反约束要么把团队的资源遗留在无人可解析的名字下。迁移覆盖五张引用表_REFERRING_TABLES (dag_bundle_team, connection, variable, slot_pool, trigger)迁移按以下顺序生成语句对大小写敏感与大小写不敏感两种排序规则都兼容把需要折叠的旧名以小写形式插入team表INSERT INTO team (name) SELECT lower(team.name) ...仅当name lower(name)依次把五张引用表中team_name IS NOT NULL的行更新为lower(team_name)其中connection与trigger表还承载着无团队部署的行只有 Team 作用域的行才被改写删除旧的、非小写的团队行DELETE FROM team WHERE name lower(name)最后无条件执行UPDATE team SET namelower(team.name)完成原地改名。其中仅 MySQL 需要特殊处理InnoDB 拒绝在仍有外键引用时更新主键而外键又没有级联更新因此 MySQL 分支会在最后的改名语句前后分别执行SET FOREIGN_KEY_CHECKS0与SET FOREIGN_KEY_CHECKS1临时挂起外键检查其他数据库如 PostgreSQL则直接在检查生效的状态下改名。注意挂起检查并不放开主键约束——若名字折叠后会撞主键依然会冲突这正是前置校验要拦截的场景。迁移语句的构造刻意不读取任何行数据因此airflow db migrate --show-sql-only可以离线输出完整 SQL离线迁移没有行可读。这一点由单元测试 test_0131_lower_case_team_names.py 直接验证它断言生成的 SQL 包含INSERT INTO team (name) SELECT lower(team.name)与UPDATE team SET namelower(team.name)并分别断言 MySQL 与非 MySQL 方言的收尾语句序列。该测试还验证了“改名会带着引用行一起走”——把Data-Eng团队及其 Connection/Variable/Pool 一起改名成data-eng所有引用行的team_name同步更新。折中处理因__等其它原因非法的名字如何迁移需要特别指出迁移的折中策略因含__等其它原因不合规但仅大小写不同除外的名字不会被拒绝而是原样迁移——它们折叠成小写后继续可用业务不受影响但如前文所述只要这类名字还在库里airflow teams sync就会以非零状态退出直到它们被重命名为止。这保证了迁移可执行不阻断升级同时把“修正非法名”的责任显式交给运维。升级前的检查清单与操作指引结合以上源码分析从旧版本允许大写与__升级到 3.4.0 及以后版本前建议按以下顺序处理盘点存量团队名列出所有 Team 名用正则(?!.*__)[a-z0-9_-]{3,50}配合 fullmatch 语义逐一核对重点找出① 仅大小写不同的名字对如Data_Eng/data_eng② 含连续双下划线的名字。先处理“仅大小写不同”的名字对这是唯一会阻断airflow db migrate的情况。用airflow teams create创建一个合规名或选一个既有的合规名用airflow teams delete删掉另一个并在删除前把它的 Dag bundles、Connections、Variables、Pools 迁移过去删除命令会在有关联时拒绝执行并提示需先解除关联。处理含__的名字它们不会阻断迁移但会导致airflow teams sync持续非零退出建议在迁移后尽快改名恢复 sync 的可用性。执行迁移airflow db migrate可先用--show-sql-only预览 SQL尤其确认 MySQL 场景下的SET FOREIGN_KEY_CHECKS语句。验证运行airflow teams verify做一致性体检确认每个团队都有默认 Pool、所有 DAG bundle 引用的团队均存在。小结本次 Team 命名规则收紧是围绕AIRFLOW_CONN__TEAM___ID环境变量命名空间的安全性修复统一小写消除了大小写折叠导致的跨团队密钥串读禁止__保证了与___分隔符的可区分性。规则由TEAM_NAME_PATTERN统一在 team.py 中定义teams create与teams sync强校验执行db migrate通过前置检查 五表连坐迁移 MySQL 外键检查挂起完成存量数据的安全折叠并配套了完整的单元测试test_0131_lower_case_team_names.py保证迁移语义正确。升级前只需重点排查“仅大小写不同”的团队对即可平稳过渡。【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表