作者: ShawnYan 原文来源:https://tidb.net/blog/31e0cdbd
TiDB 不止可以运行在 OP 也可以运行在各种云上,或者可以直接选择 TiDB Cloud。
但是很多企业也会选择自建云或者自建容器池,比如,Amazon EKS, Google Cloud GKE, Azure AKS 或者自托管的 Kubernetes。
今天介绍一位 TiDB 的新朋友,一款可在 k8s 上运行和管理数据库的开源控制平台:KubeBlocks
TiDB 介绍
TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 协议和 MySQL 生态等重要特性。目标是为用户提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解决方案。TiDB 适合高可用、强一致要求较高、数据规模较大等各种应用场景。
与传统的单机数据库相比,TiDB 具有以下优势:
纯分布式架构,拥有良好的扩展性,支持弹性的扩缩容
支持 SQL,对外暴露 MySQL 的网络协议,并兼容大多数 MySQL 的语法,在大多数场景下可以直接替换 MySQL
默认支持高可用,在少数副本失效的情况下,数据库本身能够自动进行数据修复和故障转移,对业务透明
支持 ACID 事务,对于一些有强一致需求的场景友好,例如:银行转账
具有丰富的工具链生态,覆盖数据迁移、同步、备份等多种场景
KubeBlocks 介绍
KubeBlocks 是基于 Kubernetes 的云原生数据基础设施,将顶级云服务提供商的大规模生产经验与增强的可用性和稳定性改进相结合,帮助用户轻松构建容器化、声明式的关系型、NoSQL、流计算和向量型数据库服务。
KubeBlocks 的名字源自 Kubernetes(K8s)和乐高积木,致力于让 K8s 上的数据基础设施管理就像搭乐高积木一样,既高效又有趣。
主要功能有:
支持多云,与 AWS、GCP、Azure、阿里云等云平台兼容。
支持 MySQL、PostgreSQL、TiDB 等 32 个主流数据库和流计算引擎。
提供生产级性能、弹性、可扩展性和可观察性。
简化 day-2 操作,例如升级、扩展、监控、备份和恢复。
包含强大且直观的命令行工具。
仅需几分钟,即可建立一个适用于生产环境的完整数据基础设施。
KubeBlocks 可以帮助用户轻松构建关系型、NoSQL、流计算和向量型数据库服务,目前已支持 30 余种数据库引擎,比如 TiDB。
KubeBlocks 环境准备
1. 操作系统
推荐在 Rocky Linux 9 操作系统进行部署测试,CentOS 7 的内核版本太低了。
 [root@shawnyan ~]# cat /etc/redhat-release Rocky Linux release 9.3 (Blue Onyx)[root@shawnyan ~]# uname -r5.14.0-362.13.1.el9_3.x86_64
       复制代码
 2. 安装 go, docker, kubectl, kind
由于篇幅原因,具体安装步骤略。
查看已安装的组件版本信息:
 [root@shawnyan ~]# go versiongo version go1.21.9 linux/amd64[root@shawnyan ~]#[root@shawnyan ~]# docker --versionDocker version 26.1.2, build 211e74b[root@shawnyan ~]#[root@shawnyan ~]# kubectl version --clientClient Version: v1.30.0Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
       复制代码
 
(only can deploy kb with docker, can not launch with podman.)
3. 创建 k8s 集群
本文仅做 PoC 演示,非标准生产环境部署步骤,因此这里使用 kind 创建 k8s 集群。
 kind create clusterkubectl cluster-info
       复制代码
 
输出:
 [root@shawnyan ~]# kind create clusterCreating cluster "kind" ... ✓ Ensuring node image (kindest/node:v1.29.2) 🖼  ✓ Preparing nodes 📦   ✓ Writing configuration 📜  ✓ Starting control-plane 🕹️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️  ✓ Installing CNI 🔌  ✓ Installing StorageClass 💾 Set kubectl context to "kind-kind"You can now use your cluster with:
kubectl cluster-info --context kind-kind
Thanks for using kind! 😊[root@shawnyan ~]# kubectl cluster-info --context kind-kindKubernetes control plane is running at https://127.0.0.1:34967CoreDNS is running at https://127.0.0.1:34967/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
       复制代码
 
到此,Kubernetes 集群部署完成,接下来安装 KubeBlocks 。
4. 安装 kbcli
kbcli 是 KubeBlocks 的命令行界面 (CLI) 工具。
kbcli 具有以下特点:
管理 KubeBlock,包括安装、卸载、查看状态、升级等。
管理集群,包括创建、删除、配置更改、备份和恢复等。
支持 playground 在本地或云端快速体验 KubeBlocks。
执行下面的命令安装 kbcli。
 curl -fsSL https://kubeblocks.io/installer/install_cli.sh | bash
       复制代码
 
输出:
 Your system is linux_amd64Installing kbcli ...
Getting the latest kbcli ......kbcli installed successfully.kbcli: 0.8.2
       复制代码
 
(but, this cmd only can use under root user, that’s not good enough.)
5. 开启 kbcli 自动补全
kbcli 支持命令自动补全,例如在 Linux 下为 bash 增加自动补全功能:
 kbcli completion bash > /etc/bash_completion.d/kbclisource /etc/bash_completion.d/kbcli
       复制代码
 6. 使用 kbcli 安装 KubeBlocks
标准模式下,在安装 KubeBlocks 之前,需要先安装 k8s。
这里为便于演示,启用 kbcli playground 功能搭建 demo 环境。
初始化过程中,将使用 K3d 在容器中创建 Kubernetes 集群,在 K3d 集群中部署 KubeBlocks,并创建独立的 MySQL 集群。
输出:
 [root@shawnyan ~]# kbcli playground initCreate k3d cluster: kb-playground                  OKMerge kubeconfig to /root/.kube/config             OKSwitch current context to k3d-kb-playground        OKWrite kubeconfig to /root/.kbcli/playground/kubeconfig OKKubeBlocks will be installed to namespace "kb-system"Kubernetes version 1.23.8+k3s1Kubernetes provider K3Skbcli version 0.8.2Create CRDs                                        OKAdd and update repo kubeblocks                     OKInstall KubeBlocks 0.8.2                           OKWait for addons to be enabled  apecloud-mysql                                   OK...Create cluster mycluster (ClusterDefinition: apecloud-mysql) OK
KubeBlocks playground init SUCCESSFULLY!
Kubernetes cluster "kb-playground" has been created.Cluster "mycluster" has been created.Elapsed time: 5m50s...[root@shawnyan ~]# 
       复制代码
 使用 KubeBlocks 创建 TiDB 集群
1. 在 KubeBlocks 中启用 TiDB 插件
KubeBlocks 支持部署若干国产数据库,下面演示如何启用 TiDB 插件。
查找 tidb 插件
安装 tidb 插件
查看插件列表
启用 tidb 插件
输出:
 [root@shawnyan ~]# kbcli addon search tidbADDON   VERSION         INDEX        tidb    0.1.0-alpha.1   kubeblocks   [root@shawnyan ~]# [root@shawnyan ~]# kbcli addon install tidbDefault addon index "kubeblocks" has been added.addon tidb installed successfully[root@shawnyan ~]# [root@shawnyan ~]# kbcli addon list | egrep 'NAME|tidb'NAME                           VERSION         PROVIDER    STATUS     AUTO-INSTALL   tidb                           0.1.0-alpha.1   community   Enabled    true[root@shawnyan ~]# [root@shawnyan ~]# kbcli addon enable tidbaddon.extensions.kubeblocks.io/tidb enabled
       复制代码
 2. 创建 TiDB 集群
使用 kbcli cluster 命令管理集群。
创建 TiDB 集群,并查看集群列表。
 [root@shawnyan ~]# kbcli cluster create tidb-demo --cluster-definition tidbInfo: --cluster-version is not specified, ClusterVersion tidb-v7.1.2 is applied by defaultCluster tidb-demo created[root@shawnyan ~]# [root@shawnyan ~]# kbcli cluster listNAME        NAMESPACE   CLUSTER-DEFINITION   VERSION           TERMINATION-POLICY   STATUS    CREATED-TIME                 tidb-demo   default     tidb                 tidb-v7.1.2       Delete               Running   May 10,2024 18:57 UTC+0800   
       复制代码
 
这里可以看到,集群已创建成功,并运行正常。
查看集群定义和版本信息:
 [root@shawnyan ~]# kbcli clusterdefinition list | egrep 'NAME|tidb'NAME               MAIN-COMPONENT-NAME   STATUS      AGEtidb               tidb                  Available   41h[root@shawnyan ~]# [root@shawnyan ~]# kbcli clusterversion list | egrep 'NAME|tidb'NAME                   CLUSTER-DEFINITION   STATUS      IS-DEFAULT   CREATED-TIME                 tidb-v7.1.2            tidb                 Available   false        May 10,2024 18:48 UTC+0800   
       复制代码
 
查看集群中的组件和实例信息:
 [root@shawnyan ~]# kbcli cluster list-components tidb-demoNAME   NAMESPACE   CLUSTER     TYPE   IMAGE                           pd     default     tidb-demo   pd     docker.io/pingcap/pd:v7.1.2     tikv   default     tidb-demo   tikv   docker.io/pingcap/tikv:v7.1.2   tidb   default     tidb-demo   tidb   docker.io/pingcap/tidb:v7.1.2   [root@shawnyan ~]# [root@shawnyan ~]# kbcli cluster list-instances tidb-demoNAME               NAMESPACE   CLUSTER     COMPONENT   STATUS    ROLE     ACCESSMODE   AZ       CPU(REQUEST/LIMIT)   MEMORY(REQUEST/LIMIT)   STORAGE     NODE                                    CREATED-TIME                 tidb-demo-pd-0     default     tidb-demo   pd          Running   <none>   <none>       <none>   1 / 1                1Gi / 1Gi               data:20Gi   k3d-kb-playground-server-0/172.19.0.2   May 12,2024 09:28 UTC+0800   tidb-demo-tikv-0   default     tidb-demo   tikv        Running   <none>   <none>       <none>   1 / 1                1Gi / 1Gi               data:20Gi   k3d-kb-playground-server-0/172.19.0.2   May 12,2024 09:28 UTC+0800   tidb-demo-tidb-0   default     tidb-demo   tidb        Running   <none>   <none>       <none>   1 / 1                1Gi / 1Gi               data:20Gi   k3d-kb-playground-server-0/172.19.0.2   May 12,2024 09:28 UTC+0800   
       复制代码
 
查看 pod 信息:
 [root@shawnyan ~]# kubectl get podNAME               READY   STATUS    RESTARTS       AGEtidb-demo-pd-0     1/1     Running   0              159mtidb-demo-tikv-0   1/1     Running   0              159mtidb-demo-tidb-0   2/2     Running   6 (149m ago)   159m
       复制代码
 3. 连接 TiDB 集群
在确认 TiDB 集群创建成功后,我们连接到 TiDB 集群,并查看 TiDB 数据库的版本。
 [root@shawnyan ~]# mysql -uroot -h127.0.0.1 -P4000Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 405Server version: 5.7.25-TiDB-v7.1.2 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
(root@127.0.0.1) [(none)]> select tidb_version()\G*************************** 1. row ***************************tidb_version(): Release Version: v7.1.2Edition: CommunityGit Commit Hash: aa6ed99ae63191bc98e883fd4c369ae7482cccb7Git Branch: heads/refs/tags/v7.1.2UTC Build Time: 2023-10-21 07:46:04GoVersion: go1.20.10Race Enabled: falseTiKV Min Version: 6.2.0-alphaCheck Table Before Drop: falseStore: tikv1 row in set (0.01 sec)
(root@127.0.0.1) [(none)]> select now();+---------------------+| now()               |+---------------------+| 2024-05-12 01:16:40 |+---------------------+1 row in set (0.01 sec)
(root@127.0.0.1) [(none)]> 
       复制代码
 
到此,我们借助 KubeBlocks 成功在 k8s 上运行一套 TiDB 集群。
总结
了解 TiDB 的同学看过本文之后或许会感慨,好产品是有共性的。
比如,TiDB 有 tiup,KubeBlocks 有 kbcli,TiDB/KB 都有 playbook,以便于开发者快速上手学习。
更多内容,请参阅官方文档:
-- END –
🌻 往期精彩 ▼
如果这篇文章为你带来了灵感或启发,就请帮忙点『赞』吧,感谢!(๑˃̵ᴗ˂̵)
评论