首页 > 编程知识 正文

it运维系统开源(开源智能运维)

时间:2023-05-04 03:18:04 阅读:97138 作者:218

TiDB Operator是TiDB在Kubernetes平台上的自动部署和操作工具。目前,TiDB Operator已经正式开源。

在TiDB Operator的帮助下,TiDB可以在公有云厂商提供的Kubernetes平台上无缝运行,使TiDB成为真正的Cloud-Native数据库。运营商来源地址:https://github.com/pingcap/tidb-operator/.

要理解TiDB Operator,首先需要对TiDB和Kubernetes有所了解。相信关注TiDB很久的同学可能已经对TiDB很熟悉了。本文首先简单介绍Tidb和Kubernetes,说说为什么我们要做Tidb运营商,然后说说如何快速体验TiDB运营商,如何参与TiDB运营商项目成为Contributor。

TiDB和Kubernetes简介

TiDB作为开源的分布式数据库产品,多副本一致性强,可以非常方便地根据业务需求灵活伸缩,在扩容收缩时对上层业务没有感知。TiDB包括三个核心组件:TiDB/TiKV/PD。

TiDB Server:主要负责SQL的解析器和优化器,相当于计算执行层,也负责客户端的访问和交互。TiKV服务器:是一套分布式的Key-Value存储引擎,负责整个数据库的存储层,在这个层实现数据的横向扩展和多副本的高可用性。PD服务器:相当于分布式数据库的大脑。一方面,它负责收集和维护每个TiKV节点中的数据分布。另一方面,PD扮演调度器的角色,根据数据分布和各个存储节点的负载情况采取合适的调度策略,维持整个系统的平衡和稳定。以上三个组件,每个角色都是一个多节点集群,所以最后TiDB的架构看起来是这样的。

Kubernetes最初是作为一个纯容器编排系统诞生的。用户部署Kubernetes集群后,直接使用其内置功能部署应用服务。

因为这个PaaS平台使用起来非常方便,吸引了很多用户,不同的用户提出了各种各样的需求。有些特性要求Kubernetes直接在其核心代码中实现,但有些特性不适合合并到主分支中。

为了满足这种需求,Kubernetes为用户开放了一些API来扩展和满足自己的需求。目前Kubernetes内部的API越来越开放,更像是一个运行在云上的操作系统。用户可以将其用作云SDK或Framework,并且可以轻松开发组件进行扩展以满足自己的业务需求。对有状态服务的支持就是一个典型的例子。

为什么我们要成为TiDB运营商?

首先,使用传统自动化工具带来了高部署和运维成本。TiDB的层次结构在分布式系统中很常见。每个组件都可以根据业务需求独立扩展,TiKV和TiDB都可以独立使用。例如,可以在TiKV上构建一个与Redis协议兼容的KV数据库,TiDB也可以与LevelDB这样的KV存储引擎接口。

然而,这种多组件分布式系统增加了手动部署和操作维护的成本。一些传统的自动部署和操作工具,如Puppet/Chef/SaltStack/Ansible,由于缺乏全局状态管理,无法及时对各种异常情况进行故障切换,难以充分发挥分布式系统的弹性可扩展性。其中有些还需要编写大量的DSL甚至与Shell脚本混用,可移植性差,维护成本高。

其次,在云时代,容器已经成为应用分发和部署的基本单元,由谷歌基于博格的经验推出的开源容器编排系统Kubernetes已经在内部使用了几十年,成为当前容器编排技术的事实标准。如今,主要的云供应商开始提供托管的Kubernetes集群。部署在Kubernetes平台上的应用可以在各种云平台之间轻松迁移,无需绑定到特定的云平台,其容器化的打包和发布方式也解决了对操作系统环境的依赖。

在最早的阶段,Kubernetes项目只支持无状态服务的管理。无状态服务通过ReplicationController定义多个副本,Kubernetes调度器决定在不同节点上启动多个PODs,实现负载均衡和故障转移。对于无状态服务来说,多个副本对应的POD是等价的,所以当一个节点发生故障时,在新节点上启动一个Pod就相当于一个失败的Pod,不会涉及到状态转换的问题,所以管理非常简单。

但是,对于有状态服务,由于数据需要持久化到磁盘上,不同的PODs不再被认为是等价的,它们也不能像无状态服务一样自由地被调度和迁移。

Kubernetes v1.3提出了PetSet的概念来管理state服务,并在v1.5中将其重命名为state。

fulSet。StatefulSet 明确定义一组 Pod 中每个的身份,启动和升级都按特定顺序来操作。另外使用持久化卷存储(PersistentVolume)来作为存储数据的载体,当节点失效 Pod 需要迁移时,对应的 PV 也会重新挂载,而 PV 的底层依托于分布式文件系统,所以 Pod 仍然能访问到之前的数据。同时 Pod 在发生迁移时,其网络身份例如 IP 地址是会发生变化的,很多分布式系统不能接受这种情况。所以 StatefulSet 在迁移 Pod 时可以通过绑定域名的方式来保证 Pod 在集群中网络身份不发生变化。

但是由于有状态服务的特殊性,当节点出现异常时,出于数据安全性考虑,Kubernetes 并不会像无状态服务那样自动做故障转移。尽管网络存储能挂载到不同的节点上供其上的 Pod 使用,但是如果出现节点故障时,简单粗暴地将网络 PV 挂载到其它节点上是比较危险的。

Kubernetes 判断节点故障是基于部署在每个节点上的 Kubelet 服务是否能正常上报节点状态,Kubelet 能否正常工作与用户应用并没有必然联系,在一些特殊情况下,Kubelet 服务进程可能无法正常启动,但是节点上的业务容器还在运行,将 PV 再挂载到其它节点可能会出现双写问题。

为了在 Kubernetes 上部署和管理 TiDB 这种有状态的服务,我们需要扩展 StatefulSet 的功能。TiDB Operator 正是基于 Kubernetes 内置的 StatefulSet 开发的 TiDB 集群管理和运维工具。

Kubernetes 直到 v1.7 才试验性引入本地 PV,在这之前只有网络 PV,TiKV 自身在存储数据时就是多副本的,网络 PV 的多副本会增加数据冗余,降低 TiDB 的性能。在这之前我们基于 Kubernetes 内置的 hostPath volume 实现了本地 PV 满足 TiKV 对磁盘 IO 的要求。官方本地 PV 方案直到最近的 Kubernetes v1.10 才相对稳定地支持调度功能,满足用户对本地 PV 的需求。为了降低用户的使用和管理成本并且拥抱 Kubernetes 开源社区,我们又重新基于官方的本地 PV 方案实现了对数据的管理。

TiDB Operator 原理解析

Operator 本质上是 Kubernetes 的控制器(Controller),其核心思想是用户给定一个 Spec 描述文件,Controller 根据 Spec 的变化,在 Kubernetes 集群中创建对应资源,并且不断调整资源使其状态满足用户预期的 Spec。

上图是 TiDB Operator 工作流程原理图,其中 TidbCluster 是通过 CRD(Custom Resource Definition)扩展的内置资源类型:

用户通过 Helm 往 Kubernetes API Server 创建或更新 TidbCluster 对象。TiDB Operator 通过 watch API Server 中的 TidbCluster 对象创建更新或删除,维护 PD/TiKV/TiDB StatefulSet, Service 和 Deployment 对象更新。Kubernetes 根据 StatefulSet, Service 和 Deployment 对象创建更新或删除对应的容器和服务。

在第 2 步中,TiDB Operator 在更新 StatefulSet 等对象时会参考 PD API 给出的集群状态来做出 TiDB 集群的运维处理。通过 TiDB Operator 和 Kubernetes 的动态调度处理,创建出符合用户预期的 TiDB 集群。

快速体验 TiDB Operator

TiDB Operator 需要运行在 Kubernetes v1.10 及以上版本。TiDB Operator 和 TiDB 集群的部署和管理是通过 Kubernetes 平台上的包管理工具 Helm 实现的。运行 TiDB Operator 前请确保 Helm 已经正确安装在 Kubernetes 集群里。

如果没有 Kubernetes 集群,可以通过 TiDB Operator 提供的脚本快速在本地启动一个多节点的 Kubernetes 集群:

git clone https://github.com/pingcap/tidb-operator

cd tidb-operator

NUM_NODES=3 # the default node numble is 2

KUBE_REPO_PREFIX=uhub.ucloud.cn/pingcap manifests/local-dind/dind-cluster-v1.10.sh up

等 Kubernetes 集群准备好,就可以通过 Helm 和 Kubectl 安装部署 TiDB Operator 和 TiDB 集群了。

1. 安装 TiDB Operator

kubectl apply -f manifests/crd.yaml

helm install charts/tidb-operator --name=tidb-operator --namespace=tidb-admin

2. 部署 TiDB 集群

helm install charts/tidb-cluster --name=demo-tidb --namespace=tidb --set clusterName=demo

集群默认使用 local-storage 作为 PD 和 TiKV 的数据存储,如果想使用其它持久化存储,需要修改 charts/tidb-cluster/values.yaml 里面的 storageClassName。

参与 TiDB Operator

TiDB Operator 让 TiDB 成为真正意义上的 Cloud-Native 数据库,开源只是一个起点,需要 TiDB 社区和 Kubernetes 社区的共同参与。

大家在使用过程发现 bug 或缺失什么功能,都可以直接在 GitHub 上面提 issue 或 PR,一起参与讨论。要想成为 Contributor 具体可以参考 这个文档。

作者:bldby

OSC开源社区头条号,每日推送最新优质的技术类文章,包括外文翻译,软件更新,技术博客等。关注开源社区OSC头条号,每日获取最新技术资讯,点击“了解更多”阅读原文章,获取TiDB Operator 下载链接。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。