火山引擎 veDB 作为字节跳动自研的云原生分布式数据库,旨在解决传统单机 MySQL 在扩展性、性能、运维复杂度及中间件使用约束上的诸多挑战。依托于计算存储分离的核心架构,并借助云原生技术,veDB 实现了:
-
**极致的运维效率:**通过完全自研的 K8s Operator,我们将数据库的重启、规格变更、版本升级等高危操作对业务的影响降至 秒级,用户业务侧仅感知到一次连接中断。
-
极高的部署密度: 经过对 Kubelet、systemd 等底层组件的深度优化,我们成功将单台物理机(宿主机)的 Pod 部署上限提升至 800 个,线上已有大量节点稳定承载超过 300 个 Pod 运行,资源利用率大幅提升。
-
**海量的集群规模:**目前,我们已能在单个 Kubernetes 集群的单一命名空间下,稳定管理数万级别的资源(如 5 万 Pod、5 万 Service),支撑包括云上和字节跳动内部业务(抖音/电商/财经/广告/番茄小说/懂车帝/豆包/飞书等)在内的海量数据库实例的可靠运行。
这一切是如何实现的?当企业面临数据库规模化瓶颈时,云原生究竟能带来什么价值?本文将为你揭开火山引擎 veDB 在大规模实践背后的思考与选择。

图1. veDB 计算存储分离架构
数据库规模化之困:云原生为何是破局关键?
在早期,veDB 与许多数据库系统一样,采用基于虚拟机(VM)的部署模式。这种模式在初期尚可,但随着业务量的爆发式增长,一系列棘手的问题开始浮现:
-
**资源利用率低下:**虚拟机模式导致资源碎片化严重,难以精细化调度与共享,大量物理资源被闲置浪费。
-
**扩缩容笨重迟缓:**无论是增加计算节点还是提升规格,都需要申请新虚拟机、重新部署,流程长且无法快速响应业务峰值。
-
**运维操作高风险:**版本升级、参数变更等操作依赖人工或脚本在多台机器上执行,不仅流程繁琐,更容易因环境差异导致不一致,且故障恢复严重依赖人工介入。
-
**变更窗口难以协调:**传统的运维方式需要与业务方协商较长的停机维护窗口,直接影响业务的连续性。
这些痛点本质上源于缺乏一个现代化的基础设施抽象层。我们需要一种能从根本上解决资源调度、生命周期管理和自动化运维难题的方案。云原生,尤其是以 Kubernetes 为核心的容器化技术,正是破局的关键。

图2. 虚拟机部署形态
破局核心:容器化+声明式运维双轮驱动
为了彻底解决上述问题,我们将 veDB 的演进方向锁定在"容器化"和"声明式运维"两大核心。
容器化筑基:资源+高可用的双重突破
通过将数据库的各个组件(如 DBEngine、Proxy)封装成容器,并交由 Kubernetes 统一管理,我们获得了立竿见影的改变:
-
资源池化与弹性 :Kubernetes 将底层物理资源整合成一个巨大的资源池。数据库实例的创建不再是寻找一台合适的"虚拟机",而是在资源池中申请一块"CPU+内存"。这使得资源的调度和回收变得极为高效和灵活,部署效率从小时级缩短至分钟级。
-
标准化交付:容器镜像提供了一致的运行环境,彻底告别了"环境不一致"带来的诡异问题。无论是开发、测试还是生产,我们都能确保交付物的标准化。
-
故障自愈:借助 Kubernetes 的健康检查与自愈能力,当某个数据库节点因故障宕机时,系统能自动在其他健康的主机上拉起一个新的实例,大幅缩短了 RTO(恢复时间目标)。
-
高可用保障:利用亲和性与反亲和性、拓扑感知调度等策略,我们可以轻松地将一个数据库实例的多个副本分散部署到不同的物理机、机架甚至可用区,从基础设施层面规避单点故障风险。

图3. 容器化部署形态
Operator 赋能:让数据库迈入"声明式运维"时代
尽管容器化解决了资源层面的诸多问题,但 Kubernetes 本身并不理解"数据库"这种复杂有状态应用的运维逻辑,例如主从切换、备份恢复、有序升级等。
为此,我们基于 Kubernetes 的扩展机制,开发了 veDB 的"智能运维大脑"------ veDB Operator。
它的核心思想,是将运维操作从"命令式 "转变为"声明式"。
-
过去(命令式):运维人员需要手动执行一系列步骤:"先升级只读节点 A,观察 10 分钟,然后升级读写节点 B,最后执行主从切换..."。
-
现在(声明式):用户只需提交一个 YAML 文件,告诉 Operator"我期望数据库版本是5.10.2"。Operator 便会自动执行所有必要的、安全的、经过验证的最佳实践操作,将数据库平滑地升级到目标版本。

图4. 基于 operator 的部署形态
这个 Operator 将所有关于 veDB 的运维知识和最佳实践都固化成了代码逻辑。它像一个 7x24 小时待命的专家,持续监控数据库的实际状态,一旦发现与用户声明的"期望状态"不符,就会立即采取行动进行修复。这使得高可用和一致性策略从"流程手册"变成了"代码保障"。

图5. operator管控架构
价值落地:破解三大规模化运维难题
在将 veDB 全面云原生化的过程中,我们遇到并解决了一系列有状态数据库的云原生运维难题和大规模场景下的典型难题。
挑战一:如何让数据库升级对业务无感?
对于有状态的数据库而言,版本升级或规格变更过程中不可避免要重启 DBEngine Pod,这往往意味着会出现服务中断,这是业务方最不愿看到的。同时由于传统的有状态服务滚动更新模式通常是先停止老Pod再创建新Pod,变更期间实例的在线节点数会减少,新节点启动后又涉及缓存预热、Redo 回放、分布式事务恢复等操作,如果控制不好节奏,很容易在高峰期叠加 IO 抖动,引发长尾延迟甚至雪崩。
核心解法:
-
智能升级序列:Operator 在升级时,会严格按照"先只读节点,后读写节点"的顺序执行,以此避免在更新过程中发生不必要的读写节点切换。
-
"先扩后缩"式平滑变更:在需要重建 Pod 的场景(如大版本升级),Operator 会先批量拉起新版本的 Pod,待新节点全部就绪后,再将流量瞬间切换过去,最后安全下线旧节点。相比于逐个节点滚动升级更新的模式,先扩后缩模式只需要一次拉起,一次下线,不仅极大加速了整体变更的耗时,还避免了过程中计算容量的下降。
-
我们还利用镜像预热,代理优雅下线,Kubernetes 的原地资源调整等诸多能力,从多个方向优化实例运维变更的耗时和对用户IO的影响
实践效果 :在绝大多数场景下,veDB 的运维操作对业务读写 IO 的影响时间可以控制在 5 秒以内 。用户感知到的连接中断次数基本只有1次,如果业务客户端具备完善的重连机制,完全可以做到平滑无感。
挑战二:如何破解高密部署 & 解决 K8s 资源数瓶颈?
随着硬件迭代,底层物理机规格越来越大,为了最大化资源利用率,我们需要在单台物理机上部署数百个数据库 Pod,这对宿主机和 Kubernetes 组件都构成了巨大压力。同时随着管理的数据库实例越来越多,Kubernetes 控制面的瓶颈也逐渐显现。
核心解法:
-
我们定位并解决了单机高密度下的一系列性能瓶颈。例如,我们发现高频的
exec探针会导致宿主机systemd负载过高,通过升级runc版本并优化探针类型,我们彻底解决了该问题。同时,我们对 Kubelet 等核心组件的性能参数进行了深度调优。 -
根据资源类型对 etcd 集群进行拆分,使用 APF(API Priority and Fairness)实现精细化限流,防止 apiserver 和 etcd 过载影响管控可用性。
-
在访问 apiserver 的客户端侧,通过 infromer 和请求参数优化,同时通过 Kyverno 在预发布环境设置自动化拦截校验,避免客户端的不合理用法对Kubernetes 管控组件产生过高负载。
实践效果:通过一系列优化,我们将单机 Pod 的部署上限成功提升至 800 ,目前线上已有大量物理机稳定运行着超过 300 个 Pod。在单个 Kubernetes 集群的单一命名空间下,稳定管理数万级别的资源(如 5 万 Pod、5 万 Service),支撑海量数据库实例的可靠运行。
挑战三:如何管理跨集群、多角色的复杂实例?
在实际业务中,一个数据库实例可能需要同时服务于不同场景。例如:
-
在线业务:需要高规格、低延迟的读写节点。
-
报表查询:可以使用较低规格的只读节点,避免对主业务产生干扰。
-
跨K8s集群部署:为了故障域隔离或资源规划,实例节点甚至需要部署在不同的 Kubernetes 集群,或者需要迁移至另一个K8s集群。
核心解法:
我们在 CRD(自定义资源定义)中引入了 NodeSet 的概念,允许用户为同一实例内的 DBEngine 节点进行分组。每个 NodeSet 可以拥有独立的规格、版本、调度策略甚至归属的 Kubernetes 集群。Operator 以 NodeSet 为单位执行运维操作,实现了精细化的角色管理和跨集群编排。
实践效果:用户可以为同一个数据库实例按需配置不同规格的节点组,并通过独立的 Service 对外提供服务,实现资源隔离且互不影响。同时,我们能在业务近乎无感的情况下,完成整个实例的跨 Kubernetes 集群迁移。
未来演进:Serverless 与 AI 驱动的数据库新范式
随着 AI 应用的爆发,我们预见到开发者对数据库的需求将更加轻量、高频和自动化。veDB 的云原生演进之路,将继续向着以下方向深化:
-
面向海量实例的 Serverless 化:我们将持续探索基于 Serverless 架构的自动启停(Scale-to-Zero)与按需计费模式,为中小型业务和个人开发者解决海量小微实例的成本痛点。
-
极致的自动化与效率:在 AI Agent 驱动开发的模式下,数据库的创建、销毁将成为高频操作。我们的目标是将这些管控操作的耗时压缩到 秒级,满足程序化、高并发的严苛调用需求。
-
探索"DB as Git"的敏捷范式:我们正在探索将数据库的结构变更、数据快照与版本控制系统(如 Git)相结合。设想未来可以像切换代码分支一样,在数据库的不同版本或快照间瞬时切换,这将极大提升开发、测试与数据恢复的效率。
火山引擎 veDB 致力于通过云原生技术,为用户提供更稳定、更弹性、更高效的数据库服务。
关于产品
veDB MySQL 版是字节跳动自研的基于计存分离架构的云原生分布式数据库,100% 兼容 MySQL 5.7、MySQL 8.0。支持一主多备部署,具备高弹性、高并发、高可用的企业级数据库能力,历经字节跳动内部业务与外部的丰富场景与海量流量打磨。在字节跳动内部,veDB MySQL 在关系型数据库领域占比超过 70%,总实例数 10 万级,数据量百 PB 级,支撑所有业务线(抖音/电商/财经/广告/番茄小说/懂车帝/豆包/飞书等),覆盖全球 7 个服务区。在2021春晚红包雨活动中,全国一共发起了 703 亿次红包雨互动,veDB MySQL 集群承接读写 QPS 峰值超过 800 万。