| 【bugfix】 client dns parser error fix Co-authored-by: littleyellowbicycle<liguo29@h-partners.com> # message auto-generated for no-merge-commit merge: !396 merge ip_fix into develop 【bugfix】 client dns parser error fix Created-by: littleyellowbicycle Commit-by: littleyellowbicycle Merged-by: yrewzjsx Description: # 合入来源 - [ ] 需求 - [ ] 问题单 - [√ ] issue # 问题/功能描述 dns 修改后,client没有重新进行域名解析,导致client 跟 meta_service 断链 # 修改方案描述 DNS 更新后重连特性 · 方案描述 1. 背景与目标 集群/HA 场景下,meta service 可能因主备切换、Pod 重建等原因换 IP,通过 DNS(域名 → 新 IP)对外暴露稳定端点。要求:local service 不重启、不改配置文件的情况下,DNS 指向变更后,到 meta service 的连接自动切到新 IP 并重连。 涉及两条到 meta service 的连接: - meta 网络连接(meta_service_url,端口如 5010):元数据操作(put/get/remove/bm 注册)。 - config store 连接(config_store_url,端口如 6000/6010):BM 成员信息交换/心跳同步。 两条连接由不同组件实现,DNS-follow 的实现机制也不同。 2. 现状与约束 - meta_service_url 由 memcache 的 MetaNetClient 实现,自带断链回调(RegLinkBrokenHandler),可事件驱动重解析重连——天然支持 DNS 切换。 - config_store_url 由 memfabric 的 smem_bm(3rdparty 库对象)实现,其重连是库内部 ReConnectAfterBroken 自做的、连固定 IP,不向 memcache 暴露断链回调(smem_bm 仅有 group-member 回调)。memcache 拿不到 BM 的断链事件,无法在"重连那一刻"触发重解析。 - 配置层 Configuration::ResolveAllUrlDomains 原本把 config_store_url 解析成 IP 后丢弃域名,BM 只持有 IP,没有重解析的素材。 结论:meta_service_url 可事件驱动;config_store_url 在 memcache 仓内只能周期性主动喂新 IP(真·断链事件驱动需给 memfabric 加 smem_bm_register_client_broken_handler,属跨仓改动,暂不做)。 3. 总体架构 配置层 Configuration::ResolveAllUrlDomains ├ meta_service_url → 保留域名(kPreservedUrlKeys) 给 MetaNetClient 每次连接重解析 ├ local config_store_url → 解析成IP覆盖 + 保留域名到domain key 给 BM 初始化用IP + 周期重解析用域名 └ 其它URL(meta config_store/http, hcom) → 解析成IP覆盖 这些不需DNS切换 meta service (服务端) └ LoadConfig() 补调 ResolveAllUrlDomains → 域名配置文件启动时解析成IP再bind local service (客户端, memcache代码) ├ MetaNetClient (meta_service_url) │ └ 断链回调 HandleLinkBroken → ResolveAndConnect → ResolveUrlToIpPort 重解析 → 重连(事件驱动, 零延迟) │ + 连接前 ExtractIpPortFromUrl 注册端口到memfabric表(修ConnectToPeerServer的GetParser断言) └ MmcBmProxy → smem_bm对象(config_store_url, memfabric库) └ 周期任务 ReResolveStoreUrl → 重解析域名 → UpdateStoreUrl喂新IP → smem ReConnectAfterBroken重连(轮询, ≤interval延迟) 4. 配置项与触发条件 mmc-local.conf: ock.mmc.meta_service_url = tcp://<域名>:5010 # 域名, 事件驱动重连 ock.mmc.local_service.config_store_url = tcp://<域名>:6010 # 域名, 周期重解析 ock.mmc.dynamic_config.enable = true # 开周期任务 ock.mmc.dynamic_config.interval = 5 # 重解析周期(秒) - 两个 URL 都必须用域名(字面 IP 重解析得同值、切不了)。 - local service 须从配置文件启动(MMC_LOCAL_CONFIG_PATH),周期任务靠 configFilePath 触发;程序化 setup(config) 无文件则不跑周期任务。 - meta_service_url 的断链重连不依赖 dynamic_config.enable(MetaNetClient 自带)。 5. 未覆盖项 - 真·断链事件驱动的 config store 重解析:需给 memfabric(3rdparty)加 smem_bm_register_client_broken_handler API,memcache 在 BM 建好后挂回调、断链即重解析。零延迟、不轮询,但跨仓改 3rdparty,暂未做;当前周期方案为其可接受的替代。 - hcom_url 的 DNS 切换:UpdateConfig 目前未单独处理 hcom_url 的 UpdateStoreUrl(如需要可补)。 # 是否涉及UT/ST - [√ ] 是 - [ ] 否(说明理由) # 开发自检 - [√ ] 规范:未超过1k;超过1k已完成备案;反合入需要标题注明【反合】 - [√ ] 规范:已关联issue或里程碑 - [√ ] 规范:不需要UT/ST且已说明理由;需要且已包含UT/ST - [√ ] 安全:涉及对外接口/参数/环境变量改动,并同步修改资料 - [√ ] 安全:未引入三方开源软件;引入三方开源软件并经过安全评审 - [√ ] 安全:未新增对外接口/参数;新增对外接口/参数有校验 - [ √] 规范:未涉及资料改动;涉及资料改动并已完成修改     See merge request: Ascend/memcache!396 | 1 个月前 |