拓冰建站拓冰建站
首页 / 资讯中心 / 正文

VictoriaMetrics vmanomaly 分片与高可用架构:全局配置拆分、确定性放置与副本复制机制详解

VictoriaMetrics vmanomaly 分片与高可用架构全局配置拆分、确定性放置与副本复制机制详解【免费下载链接】VictoriaMetricsVictoriaMetrics: fast, cost-effective monitoring solution and time series database项目地址: https://gitcode.com/GitHub_Trending/vi/VictoriaMetrics本指南聚焦 VictoriaMetrics 企业版异常检测服务vmanomaly的分片Sharding与高可用High Availability机制。文章以官方架构图及其说明文档为骨架完整解析“全局配置拆分 → 子配置确定性放置 → 按副本因子复制”的三段式原理并给出VMANOMALY_MEMBERS_COUNT、VMANOMALY_MEMBER_NUM、VMANOMALY_REPLICATION_FACTOR、VMANOMALY_SPLIT_BY、VMANOMALY_SHARDING_STRATEGY等核心环境变量的语义、默认值与推荐用法。读完本文你将能够独立规划并部署一套横向可扩展、具备冗余能力的多节点vmanomaly集群并理解节点增减、配置变更对任务归属的影响。一、核心机制总览拆、放、复三段式流程vmanomaly服务运行依赖 YAML 全局配置其中定义了调度器schedulers、模型models、数据读取reader与结果写入writer等组件。在单机模式下一个vmanomaly进程承担全部配置对应的检测任务而一旦数据规模、指标数量或调度频率增长到单节点无法承载就需要将这份全局配置横向切分。官方架构说明以一张图概括了全部要点对应仓库文档 vmanomaly-sharding-ha-diagram.md 与可编辑源文件 vmanomaly-sharding-ha-diagram.d2拆分Splitting全局配置被拆分为N个彼此独立、各自有效的子配置sub-configurations拆分依据由VMANOMALY_SPLIT_BY决定默认值为complete确定性放置Deterministic placementN个子配置被分布到K个成员member上每个成员即为一个vmanomaly服务实例复制Replication当启用复制R时每个子配置恰好被分配给R个成员以实现高可用冗余局部执行成员k只处理分配给它的子集互不越权。从源码角度该图由 D2 语言绘制渲染命令为d2 --layout elk --theme 0 --pad 20 vmanomaly-sharding-ha-diagram.d2 vmanomaly-sharding-ha-diagram.svg图中明确标注了三个关键环境变量VMANOMALY_MEMBERS_COUNT成员总数 K、VMANOMALY_MEMBER_NUM成员索引、VMANOMALY_REPLICATION_FACTOR副本数 R以及拆分入口VMANOMALY_SPLIT_BY默认complete。这段机制在完整的实践文档 Scaling-vmanomaly.md 中有系统展开下面各节逐一深入。二、全局配置与子配置Sub-configuration2.1 一个典型的全局配置vmanomaly的全局配置以 YAML 描述包含调度器、模型、读取器与写入器四个必需板块。以下示例节选自 Scaling-vmanomaly.md定义了 1 个周期性调度器、1 个zscore_online在线模型和 2 条查询schedulers: periodic_1d: # 调度器别名 class: periodic # 调度器类 infer_every: 30s # 推理频率 fit_every: 1000d # 拟合频率此处为 bootstrap-only 方案 fit_window: 24h # 拟合窗口 models: zscore: # 模型别名 class: zscore_online z_threshold: 3.5 decay: 0.99 # 对近期数据赋予更高权重 queries: [cpu_seconds_total, host_network_receive_errors] reader: datasource_url: https://play.victoriametrics.com/ tenant_id: 0:0 class: vm sampling_period: 30s # 从 /query_range 拉取数据的解析度 queries: cpu_seconds_total: expr: avg(rate(node_cpu_seconds_total[5m])) by (mode) host_network_receive_errors: expr: rate(node_network_receive_errs_total[3m]) / rate(node_network_receive_packets_total[3m]) writer: datasource_url: http://victoriametrics:8428/仓库中一份可运行的最小化配置见 deployment/docker/vmanomaly/vmanomaly-integration/vmanomaly_config.yml其组件结构与上述示例一致并额外启用了monitoring.pull以暴露:8490/metrics供自我监控。2.2 子配置的拆分逻辑全局配置可被拆分为N 1个通过校验的子配置。拆分依据的逻辑实体包括调度器schedulers、查询queries、模型models、额外过滤器extra_filters。拆分后每个子配置仍然功能完整且尊重模型、查询、调度器之间多对多的挂载关系。一个最小有效子配置 1 个模型类型 × 1 条查询 × 1 个调度器。以 2.1 的示例配置为例按查询拆分可得 2 个子配置子配置 1zscore模型 periodic_1d调度器 cpu_seconds_total查询子配置 2zscore模型 periodic_1d调度器 host_network_receive_errors查询。三、确定性放置N 个子配置如何落到 K 个成员vmanomaly支持横向扩展该能力自 v1.21.0 起提供见 Changelog通过分片子配置实体实现跨节点负载分配同时保持一致性并保留单一全局配置入口。N个子配置可被分配给索引为{0, K-1}的任意分片节点若再叠加复制因子R ≥ 1则每个子配置拥有R份冗余从而兼顾扩展性与高可用。整个放置由以下 5 个环境变量控制全部定义见 Scaling-vmanomaly.md环境变量语义默认值VMANOMALY_MEMBERS_COUNT分片总数 K即可供分配子配置的节点数1向后兼容VMANOMALY_MEMBER_NUM当前节点分片索引0 到 K-1决定该节点运行哪些子配置子集0VMANOMALY_REPLICATION_FACTOR复制因子 RR 1 时每个子配置恰好分配给 R 个分片1不复制VMANOMALY_SPLIT_BY拆分全局配置所依据的逻辑实体COMPLETEVMANOMALY_SHARDING_STRATEGY子配置到分片的分配策略自 v1.30.3 起ROUND_ROBIN值得注意的两个细节VMANOMALY_MEMBER_NUM支持 Kubernetes StatefulSet 中的自动 Pod 名称发现。例如 Pod 名为vmanomaly-node-exporter-7则分片 7 会被自动提取无需手工设置索引拓扑类参数成员数、复制因子、拆分依据、分配策略由环境变量在进程启动时确定热重载只会按启动时给定的拓扑重新评估分配修改这些变量必须通过编排滚动发布或进程重启生效。所有成员必须使用相同的VMANOMALY_MEMBERS_COUNT、VMANOMALY_REPLICATION_FACTOR、VMANOMALY_SPLIT_BY与VMANOMALY_SHARDING_STRATEGY而每个成员持有各自唯一的VMANOMALY_MEMBER_NUM。四、拆分策略VMANOMALY_SPLIT_BY详解VMANOMALY_SPLIT_BY接受五个取值大小写不敏感SCHEDULERS、MODELS、QUERIES、EXTRA_FILTERS、COMPLETE。各策略的拆分单元与推荐场景如下VMANOMALY_SPLIT_BY每个子配置中的工作单元推荐用途SCHEDULERS一个调度器及其挂载的工作负载按拟合/推理节奏分离工作负载子配置数量受被引用的调度器数量限制MODELS一个已配置的模型别名及其挂载的调度器与查询隔离计算开销差异大的模型或让多个模型处理同一批查询QUERIES单变量模型取一条查询多变量模型取完整挂载查询集分发相互独立的查询负载同一多变量模型的查询必须同驻模型需要全部通道且该策略不拆分单条查询返回的序列EXTRA_FILTERS一个reader.extra_filters选择器完整保留模型/查询/调度器拓扑按 region、cluster 等稳定标签或 VictoriaMetrics 租户vm_account_id/vm_project_id选择器 multitenant 端点切分大查询返回的序列过滤器必须已定义在全局配置中COMPLETE一个有效的调度器/模型/查询组合多变量查询集保持同驻最细粒度的通用拆分均衡分片的默认选择该策略不展开reader.extra_filters4.1 策略效果示例以一份包含 2 个调度器fast、seasonal、2 个模型cpu_zscore单变量、gpu_envelope多变量、4 条查询cpu、error_rate、temperature、power和 2 个数据分区{regionus-east}、{regioneu-west}的全局配置为例完整配置见 Scaling-vmanomaly.md各策略产生的子配置为VMANOMALY_SPLIT_BY生成结果SCHEDULERSfastseasonalMODELScpu_zscoregpu_envelopeQUERIEScpuerror_rate多变量集power,temperatureEXTRA_FILTERS{regionus-east}{regioneu-west}各自保留全部调度器/模型/查询查询上下文被选择器限定COMPLETEfast:cpu_zscore:cpufast:cpu_zscore:error_rateseasonal:gpu_envelope:power,temperature例如选择按查询拆分并运行在 3 节点集群的第 1 个分片environment: VMANOMALY_MEMBERS_COUNT: 3 VMANOMALY_MEMBER_NUM: 0 VMANOMALY_REPLICATION_FACTOR: 1 VMANOMALY_SPLIT_BY: QUERIES若希望切分同一条大查询返回的序列则应先在reader.extra_filters中定义互不重叠的选择器再使用VMANOMALY_SPLIT_BY: EXTRA_FILTERS。五、分配策略VMANOMALY_SHARDING_STRATEGY轮询与 RendezvousVMANOMALY_SHARDING_STRATEGY自 v1.30.3 起决定子配置如何被分配到分片ROUND_ROBIN默认向后兼容基于数量与规范顺序的位置分配。当子配置成本相近且全局配置规范化顺序稳定时分布均匀但插入或删除实体会使后续位置整体平移可能把大量既有子配置搬到别的分片。RENDEZVOUS最高随机权重 HRW 哈希以每个子配置的稳定逻辑身份为输入独立计算放置位置。插入、删除、重排或编辑某个实体不会移动未变更分片集合上的无关实体因此当需要保留分片本地持久化模型状态、且全局配置经常变动时最适用。选择建议若子配置成本可比、配置序稳定用ROUND_ROBIN获得均匀分布若实体经常增删改排、且希望无关分片分配尽量不动用RENDEZVOUS小规模负载下分布可能略不均匀。5.1 Rendezvous 算法细节Rendezvous 哈希不需要协调器、哈希环或持久化放置表每个分片都能从同一份全局配置独立推导出相同结果。其输入为分片数N、复制因子R、去重后的目标分片数R min(R, N)。每个子配置拥有一个紧凑的规范身份canonical identityVMANOMALY_SPLIT_BY规范身份SCHEDULERS[schedulers, scheduler-alias]MODELS[models, model-alias]QUERIES[queries, [sorted-query-aliases]]EXTRA_FILTERS[extra_filters, exact-filter]COMPLETE[complete, scheduler-alias, model-alias, [sorted-query-group]]对每个身份e与候选分片s0 到 N-1权重计算方式为确定性 SHA-256weight(e, s) SHA-256( vmanomaly-sharding-v1\0 canonical_json(e) \0 decimal(s) )权重最高的R个分片持有该子配置。N仅定义候选集合R只取同一确定性分片排序的前缀二者均不参与哈希输入——因此所有实例必须使用相同的全局配置、策略、N、R与算法版本。身份由别名与挂载关系决定与配置内容无关。例如在相同别名下修改查询表达式或 step不会改变放置位置但会触发持有该子配置的分片重载而重命名别名、改变模型-查询或调度器挂载则视为删除旧身份、新增新身份。多变量COMPLETE身份保持其排序后的查询组不拆分。一个直观例子N2, R1, COMPLETE已有s1/m1/q1 → shard 0、s1/m1/q2 → shard 1、s1/m2/q1 → shard 1、s1/m2/q2 → shard 0。此时向m2添加q3只会产生新的身份s1/m2/q3并独立分配四个既有归属完全不变而轮询策略会因为插入新实体导致后续位置整体平移。预期移动量均匀 SHA-256 排序下的期望值非严格均衡保证变更放置影响固定 N、R 下增删实体既有/幸存身份全部保持仅新增身份获得 R 个归属或删除身份消失实体重排放置不变增加一个分片N → N1受影响身份最多以一个新分片替换一个旧副本期望影响实体数E * R / (N1)移除一个分片N → N-1R ≤ N-1仅原属该分片的身份各选一个替代期望影响实体数E * R / N增大 R既有放置保留每个身份补足至 N 个副本减小 R新放置集为旧集子集保留的副本不移动设置 R N复制上限封顶为全部 N 个不同分片并记录警告日志切换策略的代价从ROUND_ROBIN切换到RENDEZVOUS会发生一次性重新映射RENDEZVOUS的取舍是概率性而非保证性的均衡子配置很少时最明显、配置加载期O(E * N log N)的选择开销以及无法抑制因真实配置变更引发的重载。六、横向扩展与高可用的实际分布示例6.1 横向扩展无复制R 1将全局配置拆分为9 个子配置[1, 2, 3, ..., 9]设置VMANOMALY_MEMBERS_COUNT 33 个分片VMANOMALY_REPLICATION_FACTOR 1默认无复制得到的分布为节点 1索引 0[1, 4, 7]节点 2索引 1[2, 5, 8]节点 3索引 2[3, 6, 9]每个子配置恰好分配到一个节点无冗余。这正是横向扩展的本质全部工作被拆分执行但任何单节点故障都会导致其负责的子配置检测中断。6.2 高可用R 2同样 9 个子配置设置VMANOMALY_REPLICATION_FACTOR 2每个子配置恰好分配 2 个节点得到复制的分片分布节点 1索引 0[1, 3, 4, 6, 7, 9]节点 2索引 1[1, 2, 4, 5, 7, 8]节点 3索引 2[2, 3, 5, 6, 8, 9]此时子配置 1–9 全部存在于恰好 2 个节点上子配置 5 在节点 2 与 3子配置 7 在节点 1 与 2子配置 9 在节点 1 与 3……单节点故障不再造成检测能力缺失。vmanomaly通过子配置复制实现高可用同样自 v1.21.0 起这与 VictoriaMetrics 生态中 VMAgent、VMAlert 的高可用思路一脉相承。6.3 去重注意事项重要分片模式下多个vmanomaly服务会向同一个 writer 上报指标。为避免每个子配置的重复指标被多次写入务必在 writer 所指向的 VictoriaMetrics 实例上开启去重deduplication单机版在 vmsingle 配置集群版需同时配置 vmselect 与 vmstorage。七、空闲分片与拓扑变更v1.30.4 起在RENDEZVOUS对小规模负载分配不均等情况下可能出现某个分片未分到任何可运行子配置。此时该分片保持存活与可观测但不启动任何调度器或模型任务同时仍响应外部关闭请求。其生命周期可概括为加载并校验全局配置判断本分片是否分到可运行工作分到工作 → 恢复可用兼容模型状态 → 创建调度器并执行任务未分到工作 → 保持存活并空闲。若开启了热重载空闲分片会持续等待配置变更一旦后续配置为其分配工作它会在原地恢复兼容的模型状态、创建所需调度器并开始执行任务无需重启进程若未开启热重载则需外部配置发布或重启才能获得新工作。此外仅修改配置内容不改动拓扑环境变量也可以唤醒空闲分片。八、部署方案Docker、Docker Compose 与 Helm8.1 Docker以两分片、无复制的集群为例运行第 1 个分片索引 0docker run -i -t --rm \ --user$(id -u):$(id -g) \ --cap-dropALL \ -e VM_LICENSE_FILE/.secret/license \ -e VMANOMALY_MEMBERS_COUNT2 \ -e VMANOMALY_MEMBER_NUM0 \ -e VMANOMALY_REPLICATION_FACTOR1 \ -e VMANOMALY_SPLIT_BYCOMPLETE \ -v $PWD/global_config.yaml:/global_config.yaml \ -v $PWD/.secret/license:/.secret/license \ -p 8080:8080 \ -p 8490:8490 \ vmanomaly:v1.21.0 \ /global_config.yaml \ --loggerLevelINFO第二个分片使用同样的参数、仅将VMANOMALY_MEMBER_NUM改为1。注意vmanomaly属 Enterprise 功能需要 license 文件示例中通过VM_LICENSE_FILE或--licenseFile提供。8.2 Docker ComposeCompose 便于统一编排多个分片。以下示例部署两个分片各持全局配置的不同子集VMANOMALY_REPLICATION_FACTOR为 1不复制services: vmanomaly-1: image: victoriametrics/vmanomaly:v1.21.0 user: 1000:1000 restart: always healthcheck: test: [CMD, curl, -f, http://127.0.0.1:8490/health] interval: 30s timeout: 10s retries: 5 volumes: - ./vmanomaly-config:/config command: - /config/global_config.yml - --licenseYOUR_LICENSE environment: VMANOMALY_MEMBERS_COUNT: 2 VMANOMALY_MEMBER_NUM: 0 VMANOMALY_REPLICATION_FACTOR: 1 VMANOMALY_SPLIT_BY: COMPLETE vmanomaly-2: image: victoriametrics/vmanomaly:v1.21.0 user: 1000:1000 restart: always healthcheck: test: [CMD, curl, -f, http://127.0.0.1:8490/health] interval: 30s timeout: 10s retries: 5 volumes: - ./vmanomaly-config:/config command: - /config/global_config.yml # 与 vmanomaly-1 保持同一份全局配置 - --licenseYOUR_LICENSE environment: VMANOMALY_MEMBERS_COUNT: 2 VMANOMALY_MEMBER_NUM: 1 VMANOMALY_REPLICATION_FACTOR: 1 VMANOMALY_SPLIT_BY: COMPLETE仓库中的完整观测栈编排参考见 deployment/docker/vmanomaly/vmanomaly-integration/compose.yml其中vmanomaly服务使用v1.30.4镜像、挂载vmanomaly_config.yml与 license 文件并通过monitoring.pull暴露:8490的/metrics与/health端点见其配置 vmanomaly_config.yml。8.3 Helm Charts在 Kubernetes 中部署N 1个分片时需使用chart 版本 1.9.0 或更新的victoria-metrics-anomalyHelm chart并在values.yaml中配置.Values.shardsCount分片数量N 1启用横向扩展.Values.replicationFactor可选复制因子R 1 时每个子配置恰好分配到 R 个分片启用高可用。启用 StatefulSet 后vmanomaly会自动从 Pod 名称提取分片号例如 Podvmanomaly-node-exporter-0自动获得VMANOMALY_MEMBER_NUM0无需手工指定。九、自我监控验证分片是否生效分片模式是否正确生效可通过vmanomaly的自我监控指标验证。vmanomaly_config_entities指标详细说明见 monitoring.md同时报告全局与当前分片的子配置数量# HELP vmanomaly_config_entities Number of sub-configs (entities) in the configuration available for sharding. # TYPE vmanomaly_config_entities gauge vmanomaly_config_entities{presetdefault,scopetotal} 8.0 vmanomaly_config_entities{presetdefault,scopeshard} 4.0含义scopetotal为全局拆分得到的子配置总数scopeshard为当前分片实际使用的子配置数。上例表示该分片使用全局 8 个子配置中的 4 个。结合前文示例9 个子配置、3 分片、R1每个分片的scopeshard应为 3。十、小结与决策建议何时分片当单节点vmanomaly的推理/拟合负载成为瓶颈时先按COMPLETE默认拆分获得最细粒度、最均衡的分布若想按节奏、模型类型或数据分区隔离再切换SCHEDULERS/MODELS/QUERIES/EXTRA_FILTERS。何时复制当检测任务不允许因单节点故障而中断时将VMANOMALY_REPLICATION_FACTOR设为大于 1并同步在目标 VictoriaMetrics 上开启去重。何时用 RENDEZVOUS当配置频繁增删改、且希望无关子配置的归属尽量稳定以保留分片本地模型状态时选用RENDEZVOUS替代默认的ROUND_ROBIN。拓扑变更纪律成员数、副本数、拆分依据与分配策略都是进程级环境变量变更必须走滚动发布或重启并保证所有成员除VMANOMALY_MEMBER_NUM外使用完全一致的拓扑参数。以上机制的全部权威定义均可回溯至仓库文档 vmanomaly-sharding-ha-diagram.md架构总览、Scaling-vmanomaly.md完整实操指南以及 vmanomaly 组件文档配置各板块的字段级说明。【免费下载链接】VictoriaMetricsVictoriaMetrics: fast, cost-effective monitoring solution and time series database项目地址: https://gitcode.com/GitHub_Trending/vi/VictoriaMetrics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门