在 GCP GKE 上部署 TiDB 集群

    如果需要部署 TiDB Operator 及 TiDB 集群到自托管 Kubernetes 环境,请参考部署 TiDB Operator及等文档。

    部署前,请确认已完成以下环境准备:

    • Helm 3:用于安装 TiDB Operator

    • :用于创建和管理 GCP 服务的命令行工具

    • 完成 GKE 快速入门 中的准备工作 (Before you begin)

      该教程包含以下内容:

      • 启用 Kubernetes API
      • 配置足够的配额等

    推荐机型及存储

    • 推荐机型:出于性能考虑,推荐以下机型:
      • PD 所在节点:
      • TiDB 所在节点:n2-standard-8
      • TiKV 或 TiFlash 所在节点:n2-highmem-8
    • 推荐存储:推荐 TiKV 与 TiFlash 使用 pd-ssd 类型的存储。

    配置 GCP 服务

    使用以上命令,设置好你的 GCP 项目和默认的区域。

    创建 GKE 集群和节点池

    1. 创建 GKE 集群和一个默认节点池:

      1. gcloud container clusters create tidb --region us-east1 --machine-type n1-standard-4 --num-nodes=1

      该命令创建一个区域 (regional) 集群,在该集群模式下,节点会在该区域中分别创建三个可用区 (zone),以保障高可用。--num-nodes=1 参数,表示在各分区各自创建一个节点,总节点数为 3 个。生产环境推荐该集群模式。其他集群类型,可以参考 。

      以上命令集群创建在默认网络中,若希望创建在指定的网络中,通过 --network/subnet 参数指定。更多可查询 GKE 集群创建文档

    2. 分别为 PD、TiKV 和 TiDB 创建独立的节点池:

      1. gcloud container node-pools create pd --cluster tidb --machine-type n2-standard-4 --num-nodes=1 \
      2. --node-labels=dedicated=pd --node-taints=dedicated=pd:NoSchedule
      3. gcloud container node-pools create tikv --cluster tidb --machine-type n2-highmem-8 --num-nodes=1 \
      4. --node-labels=dedicated=tikv --node-taints=dedicated=tikv:NoSchedule
      5. gcloud container node-pools create tidb --cluster tidb --machine-type n2-standard-8 --num-nodes=1 \
      6. --node-labels=dedicated=tidb --node-taints=dedicated=tidb:NoSchedule

    此过程可能需要几分钟。

    创建 GKE 集群后默认会存在三个不同存储类型的 StorageClass:

    • standard:pd-standard 存储类型(默认)
    • standard-rwo:pd-balanced 存储类型
    • premium-rwo:pd-ssd 存储类型(推荐)

    为了提高存储的 IO 性能,推荐在 StorageClass 的 mountOptions 字段中,添加存储挂载选项 nodelallocnoatime。详情可见 。

    1. kind: StorageClass
    2. apiVersion: storage.k8s.io/v1
    3. # ...
    4. mountOptions:

    注意

    默认的 pd-standard 存储类型不支持设置挂载选项 nodelallocnoatime

    请使用区域永久性磁盘作为生产环境的存储类型。如果需要模拟测试裸机部署的性能,可以使用 GCP 部分实例类型提供的。可以为 TiKV 节点池选择这一类型的实例,以便提供更高的 IOPS 和低延迟。

    GCP GKE - 图2注意

    • 运行中的 TiDB 集群不能动态更换 StorageClass,可创建一个新的 TiDB 集群测试。
    • 由于 GKE 升级过程中节点重建会导致本地盘数据会丢失,在重建前你需要提前备份数据,因此不建议在生产环境中使用本地盘。
    1. 为 TiKV 创建附带本地存储的节点池。

      1. gcloud container node-pools create tikv --cluster tidb --machine-type n2-highmem-8 --num-nodes=1 --local-ssd-count 1 \
      2. --node-labels dedicated=tikv --node-taints dedicated=tikv:NoSchedule

      若命名为 tikv 的节点池已存在,可先删除再创建,或者修改名字规避名字冲突。

    2. 部署 local volume provisioner。

      本地存储需要使用 程序发现并管理。以下命令会部署并创建一个 local-storage 的 StorageClass。

      1. kubectl apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/v1.3.2/manifests/gke/local-ssd-provision/local-ssd-provision.yaml
    3. 使用本地存储。

      完成前面步骤后,local-volume-provisioner 即可发现集群内所有本地 SSD 盘。在 tidb-cluster.yaml 中添加 tikv.storageClassName 字段并设置为 local-storage 即可。

    部署 TiDB Operator

    部署 TiDB 集群和监控

    下面介绍如何在 GCP GKE 上部署 TiDB 集群和监控组件。

    创建 namespace

    执行以下命令,创建 TiDB 集群安装的 namespace:

    1. kubectl create namespace tidb-cluster

    注意

    这里创建的 namespace 是指 。本文档使用 tidb-cluster 为例,若使用了其他名字,修改相应的 -n--namespace 参数为对应的名字即可。

    部署 TiDB 集群

    首先执行以下命令,下载 TidbCluster 和 TidbMonitor CR 的配置文件。

    1. curl -O https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/gcp/tidb-cluster.yaml &&
    2. curl -O https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/gcp/tidb-monitor.yaml

    如需了解更详细的配置信息或者进行自定义配置,请参考

    执行以下命令,在 GKE 集群中部署 TidbCluster 和 TidbMonitor CR。

    当上述 yaml 文件被应用到 Kubernetes 集群后,TiDB Operator 会负责根据 yaml 文件描述,创建对应配置的 TiDB 集群。

    GCP GKE - 图4注意

    如果要将 TiDB 集群部署到 ARM64 机器上,可以参考在 ARM64 机器上部署 TiDB 集群

    使用以下命令查看 TiDB 集群启动状态:

    1. kubectl get pods -n tidb-cluster

    当所有 pods 都处于 Running & Ready 状态时,则可以认为 TiDB 集群已经成功启动。如下是一个正常运行的 TiDB 集群的示例输出:

    1. NAME READY STATUS RESTARTS AGE
    2. tidb-discovery-5cb8474d89-n8cxk 1/1 Running 0 47h
    3. tidb-monitor-6fbcc68669-dsjlc 3/3 Running 0 47h
    4. tidb-pd-0 1/1 Running 0 47h
    5. tidb-pd-1 1/1 Running 0 46h
    6. tidb-pd-2 1/1 Running 0 46h
    7. tidb-tidb-0 2/2 Running 0 47h
    8. tidb-tidb-1 2/2 Running 0 46h
    9. tidb-tikv-0 1/1 Running 0 47h
    10. tidb-tikv-2 1/1 Running 0 47h

    访问数据库

    准备一台堡垒机

    我们为 TiDB 集群创建的是内网 LoadBalancer。我们可在集群 VPC 内创建一台来访问数据库。

    1. gcloud compute instances create bastion \
    2. --machine-type=n1-standard-4 \
    3. --image-project=centos-cloud \
    4. --image-family=centos-7 \
    5. --zone=${your-region}-a

    注意

    ${your-region}-a 为集群所在的区域的 a 可用区,比如 us-central1-a。也可在同区域下的其他可用区创建堡垒机。

    安装 MySQL 客户端并连接

    待创建好堡垒机后,我们可以通过 SSH 远程连接到堡垒机,再通过 MySQL 客户端来访问 TiDB 集群。

    1. 用 SSH 连接到堡垒机:

      1. gcloud compute ssh tidb@bastion
    2. 安装 MySQL 客户端:

      1. sudo yum install mysql -y
    3. 连接到 TiDB 集群:

      1. mysql --comments -h ${tidb-nlb-dnsname} -P 4000 -u root

      ${tidb-nlb-dnsname} 为 TiDB Service 的 LoadBalancer IP,可以通过 kubectl get svc basic-tidb -n tidb-cluster 输出中的 EXTERNAL-IP 字段查看。

      示例:

      1. $ mysql --comments -h 10.128.15.243 -P 4000 -u root
      2. Welcome to the MariaDB monitor. Commands end with ; or \g.
      3. Your MySQL connection id is 7823
      4. Server version: 5.7.25-TiDB-v5.4.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible
      5. Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
      6. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
      7. MySQL [(none)]> show status;
      8. +--------------------+--------------------------------------+
      9. | Variable_name | Value |
      10. +--------------------+--------------------------------------+
      11. | Ssl_cipher | |
      12. | Ssl_cipher_list | |
      13. | Ssl_version | |
      14. | ddl_schema_version | 22 |
      15. | server_id | 717420dc-0eeb-4d4a-951d-0d393aff295a |
      16. +--------------------+--------------------------------------+
      17. 6 rows in set (0.01 sec)

      GCP GKE - 图6注意

      • mysql_native_password 更新为 caching_sha2_password,因此如果使用 MySQL 8.0 客户端访问 TiDB 服务(TiDB 版本 < v4.0.7),并且用户账户有配置密码,需要显式指定 --default-auth=mysql_native_password 参数。
      • TiDB(v4.0.2 起)默认会定期收集使用情况信息,并将这些信息分享给 PingCAP 用于改善产品。若要了解所收集的信息详情及如何禁用该行为,请参见遥测

    先获取 Grafana 的 LoadBalancer 域名:

    示例:

    1. $ kubectl -n tidb-cluster get svc basic-grafana
    2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    3. basic-grafana LoadBalancer 10.15.255.169 34.123.168.114 3000:30657/TCP 35m

    你可以通过浏览器访问 ${grafana-lb}:3000 地址查看 Grafana 监控指标。其中 ${grafana-lb} 替换成前面获取的 IP。

    注意

    Grafana 默认用户名和密码均为 admin。

    要升级 TiDB 集群,可以通过 kubectl patch tc basic -n tidb-cluster --type merge -p '{"spec":{"version":"${version}"}} 命令修改。

    升级过程会持续一段时间,你可以通过 kubectl get pods -n tidb-cluster --watch 命令持续观察升级进度。

    扩容 TiDB 集群

    扩容前需要对相应的节点组进行扩容,以便新的实例有足够的资源运行。以下展示扩容 GKE 节点组和 TiDB 集群组件的操作。

    扩容 GKE 节点组

    下面是将 GKE 集群 tidbtikv 节点池扩容到 6 节点的示例:

    1. gcloud container clusters resize tidb --node-pool tikv --num-nodes 2

    GCP GKE - 图8注意

    在区域集群下,节点分别创建在 3 个可用区下。这里扩容后,节点数为 2 * 3 = 6 个。

    扩容 TiDB 组件

    然后通过 修改各组件的 replicas 为期望的新副本数进行扩容。

    更多节点池管理可参考 Node Pools 文档

    部署 TiFlash/TiCDC

    TiFlash 是 TiKV 的列存扩展, 是一款通过拉取 TiKV 变更日志实现的 TiDB 增量数据同步工具。这两个组件不是必选安装项,这里提供一个快速安装上手示例。

    为 TiFlash 新增节点组:

    1. gcloud container node-pools create tiflash --cluster tidb --machine-type n1-highmem-8 --num-nodes=1 \
    2. --node-labels dedicated=tiflash --node-taints dedicated=tiflash:NoSchedule

    为 TiCDC 新增节点组:

    1. gcloud container node-pools create ticdc --cluster tidb --machine-type n1-standard-4 --num-nodes=1 \
    2. --node-labels dedicated=ticdc --node-taints dedicated=ticdc:NoSchedule

    配置并部署 TiFlash/TiCDC

    如果要部署 TiFlash,可以在 tidb-cluster.yaml 中配置 spec.tiflash,例如:

    1. spec:
    2. ...
    3. tiflash:
    4. baseImage: pingcap/tiflash
    5. maxFailoverCount: 0
    6. replicas: 1
    7. storageClaims:
    8. - resources:
    9. requests:
    10. storage: 100Gi
    11. nodeSelector:
    12. dedicated: tiflash
    13. tolerations:
    14. - effect: NoSchedule
    15. key: dedicated
    16. operator: Equal
    17. value: tiflash

    其他参数可以参考进行配置。

    警告

    由于 TiDB Operator 会按照 storageClaims 列表中的配置按顺序自动挂载 PV,如果需要为 TiFlash 增加磁盘,请确保只在列表原有配置末尾添加,并且不能修改列表中原有配置的顺序。

    如果要部署 TiCDC,可以在 tidb-cluster.yaml 中配置 spec.ticdc,例如:

    1. spec:
    2. ...
    3. ticdc:
    4. baseImage: pingcap/ticdc
    5. replicas: 1
    6. nodeSelector:
    7. dedicated: ticdc
    8. tolerations:
    9. - effect: NoSchedule
    10. key: dedicated
    11. operator: Equal
    12. value: ticdc

    根据实际情况修改 replicas 等参数。

    最后使用 kubectl -n tidb-cluster apply -f tidb-cluster.yaml 更新 TiDB 集群配置。

    更多可参考 API 文档和完成 CR 文件配置。

    使用企业版

    部署企业版 TiDB、PD、TiKV、TiFlash、TiCDC 时,只需要将 tidb-cluster.yaml 中 spec.[tidb|pd|tikv|tiflash|ticdc].baseImage 配置为企业版镜像,格式为 pingcap/[tidb|pd|tikv|tiflash|ticdc]-enterprise

    例如:

    1. spec:
    2. ...
    3. pd:
    4. baseImage: pingcap/pd-enterprise
    5. ...
    6. baseImage: pingcap/tikv-enterprise