云原生数据库如何设计运维系统?
传统数据库运维在如今日渐流行的云原生时代下捉襟见肘,不断面临新的挑战: 云原生时代下,我们到底需要一个怎么样数据库运维系统 ? 根据我们长期的研究和实践,我们总结了云原生时代下的数据库运维应该具备如下特点:
自动驾驶能力
类比于无人车的自动驾驶级别,我们希望数据库的运维管理是尽可能地无人化和智能化。一旦数据库集群出现问题,管控面可以智能地进行自我修复,从而收敛进而解决问题。
完全的自动驾驶能力要求数据库控制面必须具备全面的可观测性能力,能基于采集到的数据做出最优的自动运维处理。
在愈发强调企业降本增效的今天,更智能的管控面也就意味着更高的人效比,我们可以用尽可能少的人力成本去运维大规模数据库集群。
符合开发者工程学
无论我们的数据库运维管理系统提供了多么强大的功能,在面对终端用户时,一定是一个尽可能简洁的抽象模型。用户可以在不需要掌握太多前置领域知识的前提下,非常方便地运转起一个完整的数据库运维管理系统。
当随着用户的进一步使用,用户也可以通过逐渐增加新的配置选项来方便地扩展功能。
统一化架构
云原生时代下,未来的数据库必然构建于多云之上。在这样的背景下,我们的数据库运维管理也必然面向多云设计。无论用户用了什么云,数据库的控制面都能很好地控制其差异性,并向上暴露出一个统一的用户模型。
数据库的运维管理系统具备一定的架构弹性,在面向不同的基础设施面前,都可以用同一套代码结合不同的配置来部署功能一致的数据库集群。
综上所述,GreptimeDB 团队在开源 GreptimeDB 的同时,也开源了 greptimedb-operator 和 gtctl 项目,其目标就是希望让用户在体验 GreptimeDB 的同时,也能更好地在云上运维和管理 GreptimeDB 集群。
拥抱 Kubernetes
Kubernetes 是如今衔接 PaaS 与 IaaS 层事实上的标准。经过几年的发展和运营,Kubernetes 生态已发展出了大量成熟且被广泛使用的各种类型的基础设施(从 CNCF Landscape 可见一斑)。
对于任何一个数据库,如果想在云原生时代更好地借力生态茁壮成长,就必须拥抱 Kubernetes,换句话说,任何一个数据库都必须能做到平稳顺滑地运行在 Kubernetes 之上。
只有做到这一点,我们的数据库才能轻而易举地在不同的底层基础设施上畅游无阻。
Kubernetes 生态为开发者提供了 Operator 的开发模式,可理解为在 Kubernetes API 之上开发 Application。与简单地将整个数据库集群系统打包成 Kubernetes 原生资源进行部署不同的是,Operator 模式更具扩展性和灵活度。Operator 封装了大量与数据库底层运维相关的领域知识,并对外暴露成用户更易理解的 CRD 模型,并可以在运行时结合 Kubernetes 独有的 Reconcile 循环,不断地将数据库集群维持在我们基于 CRD 所声明的预期状态。我们可以将 Operator 理解成是一个智能的运维机器人,始终如一地执行着我们赋予的原始指令,一旦发生各种意外,机器人会根据其封装好的领域知识,自动地处理意外,并最终让其系统状态符合指令预期。
greptimedb-operator
GreptimeDB 从 Day 1 开始就决定拥抱 Kubernetes,我们甚至在数据库还处于最简单的单机版本的时候,就开始以 Mock 的形式开发 GreptimeDB 集群的 Operator,也就是今天的 greptimedb-operator。
GreptimeDB 集群由 3 种不同组件(未来还将设计出更多不同角色的节点)组成:
Frontend:
提供兼容不同协议(MySQL、PostgreSQL、Prometheus、InfluxDB 等)的 Proxy 服务,用户可以用各种不同的标准客户端通过 Frontend 节点连接 GreptimeDB。Frontend 还会将用户请求基于元数据生成不同的逻辑计划,并最终转发给 Datanode 节点进行处理。
Metasrv
GreptimeDB 集群的元数据中心,底层存储基于 etcd。Metasrv 就相当于 GreptimeDB 的大脑,存储集群元数据并基于不同的策略调度请求。
Datanode
GreptimeDB 集群的数据节点。Datanode 会从 Frontend 节点接收发来的请求并实际转换成物理计划进行处理。它会通过其存储引擎将最终数据存储于远端的 S3 上,并在节点上基于内存和磁盘维护数据缓存以提升数据读写性能。Datanode 就好比是 GreptimeDB 集群的 “肌肉”,为 GreptimeDB 集群提供最终的计算和存储服务。
由此看来,一个完整的 GreptimeDB 集群将包含着多种不同功能和不同资源需求的节点,且每一种不同角色的节点都实际拥有多个副本实例,副本数量可随着请求负载的不同而弹性伸缩。如果没有一个统一的运维管理和编排调度系统,我们很难运维一个大规模的 GreptimeDB 集群。为了解决这个问题,greptimedb-operator 抽象出了一个 GreptimeDBCluster
的 CRD,即终端用户需要理解的数据模型。典型地,当用户安装好 greptimedb-operator 和 etcd 之后,他只需要一份简单的 YAML 配置,就能很容易地在 Kubernetes 上拉起一个完整的 GreptimeDB 集群:
对于不同的集群,我们只需要创建不同的 GreptimeDBCluster
资源即可。一旦创建成功,greptimedb-operator 将会基于 Kubernetes 的 List-Watch 机制监测到这一事件,然后基于 CRD 中的 Spec 创建符合其需求的 GreptimeDB 集群。
一旦 GreptimeDB 集群发生异常情况,greptimedb-operator 也将会自动进行处理,解决异常,将 GreptimeDB 集群维持在 GreptimeDBCluster
资源所声明的预期状态。
有了抽象化的 GreptimeDBCluster
数据模型和 greptimedb-operator,我们能更好地融入 Kubernetes 技术生态中。我们可以在 GreptimeDBCluster
整合其他 Operator 的 CRD(比如 prometheus-operator 的 CRD),从而为 greptimedb-operator 更方便地增加新的功能。
为了更好地进行发布和部署,我们也同步打包了基于 greptimedb-operator 的 Helm Charts。用户可以用常见的 Helm 命令添加我们的 Helm 仓库,从而更加简单方便地安装我们的 greptimedb-operator 和 GreptimeDB 集群。
当一个完整的 GreptimeDB cluster 在 Kubernetes 上成功运行起来后,我们可以观察将启动如下 GreptimeDB 相关的 Pod:
由上我们不难发现,GreptimeDB 在分布式的集群化场景下更像是微服务化系统。不同的微服务运行在 Kubernetes 上,并由 greptimedb-operator 来进行自动化运维。
其整体架构如下图所示:
更易用的现代命令行工具
尽管我们已经有了 greptimedb-operator 来为我们部署和运维 GreptimeDB 集群,但对于更多的开发者用户而言,其使用还是具备一定的入门门槛。为此,我们开发了 gtctl (<font color=blue > https://github.com/GreptimeTeam/gtctl </font>) 项目来让 GreptimeDB 集群的管理更加简单易用。
gtctl 项目提供了一个命令行工具 gtctl
,它可以帮助用户在一个 Kubernetes like 环境上部署一个完整的 GreptimeDB 集群,比如下面这句命令:
它将会在 Kubernetes 上创建一个名为 my-awesome-greptimedb
的 GreptimeDB 集群:
gtctl
计划设计成一个 All-in-One 的全功能且可扩展的现代命令行工具。我们希望任何一个用户,甚至都可以不需要太感知 GreptimeDB 的任何前置领域知识,就可以用 gtctl
极其简单的启动生产可用的 GreptimeDB 集群,并用其熟悉的客户端工具或 SDK 直接连接使用。用户对于 GreptimeDB 集群的任何运维操作(甚至包括开发调试),都可以用 gtctl
来进行完成。
GreptimeDB Dashboard 项目(<font color=blue > https://github.com/GreptimeTeam/dashboard </font>) 是 GreptimeDB 的可视化 Web UI,而 gtctl
则是 GreptimeDB 的 Command Line UI。
未来规划与展望
greptimedb-operator 和 gtctl 这两个项目都仍然处于不成熟的早期阶段,大量的开发工作仍在紧锣密鼓地计划和迭代中。
greptimedb-operator 项目的成熟度依赖于我们对 GreptimeDB 运维经验的不断积累和总结。我们只有在更多真实的场景中运维 GreptimeDB 集群,才能够持续不断地将运维经验沉淀成代码融入 greptimedb-operator 中。因此,greptimedb-operator 未来的开发重点将聚焦于功能的完善和整体质量的提升,持续基于 GreptimeDB 的最新特性来丰富 greptimedb-operator 的能力。
同 greptimedb-operator 项目一样,gtctl 项目未来也将会不断丰富功能和提升整体质量。目前计划 gtctl 项目未来将会支持以下几个大的特性:
支持更多环境下 GreptimeDB 集群的管理
我们希望 GreptimeDB 集群不仅可以运行于标准 Kubernetes 环境中,还可以运行于非 Kubernetes 的 Bare Metal 环境中。
支持更多开发者功能
我们不仅希望普通用户能用 gtctl 来管理 GreptimeDB 集群,同样也希望数据库开发者能用 gtctl 来更好地调试和开发 GreptimeDB。为此,我们会为 gtctl 增加相应的开发者功能来辅助 GreptimeDB 的调试与开发。
插件系统
我们希望 gtctl 能以灵活的插件系统来进一步扩展功能,从而让用户以自定义插件的形式来支持更多差异化场景。随着 GreptimeDB 的发展和场景的不断增加,gtctl 的插件未来也可以成长为一个子生态。
融入 Greptime Cloud 生态
我们将在不久的将来推出 Greptime Cloud 版本,让用户可以以 DBaaS 的体验来使用 GreptimeDB。除了支持在我们的 Web UI 操作 Greptime Cloud 之外,gtctl 可通过对接 Greptime Cloud API 来以命令行的方式管理云上 GreptimeDB。
云原生时代下的数据库运维和管理是一个体系化的综合性难题,很难用单一的技术手段来解决,只能在真实的场景中千锤百炼才有可能诞生优雅的解法。开源给了我们得以千锤百炼的机会,能让 GreptimeDB 被尽可能多的用户在各种不同的场景下被不断尝试。greptimedb-operator 和 gtctl 未来同样离不开各位读者的关注与尝试,欢迎广大读者积极参与我们社区来建设和完善更强大的 GreptimeDB。
关于 Greptime
Greptime 格睿科技于 2022 年创立,目前正在完善和打造时序数据库 GreptimeDB 和格睿云 Greptime Cloud 这两款产品。GreptimeDB 是款用 Rust 语言编写的时序数据库。具有分布式,开源,云原生,兼容性强等特点,帮助企业实时读写、处理和分析时序数据的同时,降低长期存储的成本。
微信公众号:GreptimeDB
GitHub: https://github.com/GreptimeTeam/greptimedb
Twitter: https://twitter.com/Greptime
Slack: https://greptime.com/slack
评论