在阿里云上部署 TiDB 集群

    你可以使用阿里云的服务来进行操作,云命令行中已经预装并配置好了所有工具。

    完整部署集群需要具备以下权限:

    • AliyunECSFullAccess
    • AliyunESSFullAccess
    • AliyunVPCFullAccess
    • AliyunSLBFullAccess
    • AliyunCSFullAccess
    • AliyunEIPFullAccess
    • AliyunECIFullAccess
    • AliyunVPNGatewayFullAccess
    • AliyunNATGatewayFullAccess

    概览

    默认配置下,会创建:

    • 一个新的 VPC
    • 一台 ECS 实例作为堡垒机
    • 一个托管版 ACK(阿里云 Kubernetes)集群以及一系列 worker 节点:
      • 属于一个伸缩组的 2 台 ECS 实例(2 核 2 GB),托管版 Kubernetes 的默认伸缩组中必须至少有两台实例,用于承载整个的系统服务,例如 CoreDNS
      • 属于一个伸缩组的 3 台 实例,用于部署 PD
      • 属于一个伸缩组的 3 台 ecs.i2.2xlarge 实例,用于部署 TiKV
      • 属于一个伸缩组的 2 台 ecs.c5.4xlarge 实例用于部署 TiDB
      • 属于一个伸缩组的 1 台 ecs.c5.xlarge 实例用于部署监控组件

    除了默认伸缩组之外的其它所有实例都是跨可用区部署的。而伸缩组 (Auto-scaling Group) 能够保证集群的健康实例数等于期望数值。因此,当发生节点故障甚至可用区故障时,伸缩组能够自动为我们创建新实例来确保服务可用性。

    安装部署

    使用如下步骤部署 ACK,TiDB Operator 和 TiDB 集群节点池。

    1. 设置目标 Region 和阿里云密钥(也可以在运行 terraform 命令时根据命令提示输入):

      用于部署集群的各变量的默认值存储在 variables.tf 文件中,如需定制可以修改此文件或在安装时通过 -var 参数覆盖。

    2. 使用 Terraform 进行安装:

      1. git clone --depth=1 https://github.com/pingcap/tidb-operator && \
      2. cd tidb-operator/deploy/aliyun

      可以新建或者编辑 terraform.tfvars,在其中设置变量的值,按需配置集群,可以通过 variables.tf 查看有哪些变量可以设置以及各变量的详细描述。例如,下面示例配置 ACK 集群名称、TiDB 集群名称,TiDB Operator 版本及 PD、TiKV 和 TiDB 节点的数量:

      1. cluster_name = "testack"
      2. tidb_cluster_name = "testdb"
      3. tikv_count = 3
      4. tidb_count = 2
      5. pd_count = 3
      6. operator_version = "v1.1.0-rc.1"

      如果需要在集群中部署 TiFlash,需要在 terraform.tfvars 中设置 create_tiflash_node_pool = true,也可以设置 tiflash_counttiflash_instance_type 来配置 TiFlash 节点池的节点数量和实例类型,tiflash_count 默认为 2tiflash_instance_type 默认为 ecs.i2.2xlarge

      注意:

      请通过 variables.tf 文件中的 operator_version 确认当前版本脚本中默认的 TiDB Operator 版本,如果默认版本不是想要使用的版本,请在 terraform.tfvars 中配置 operator_version

      配置完成后,使用 terraform 命令初始化并部署集群:

      1. terraform init

      apply 过程中需要输入 yes 来确认执行:

      1. terraform apply

      假如在运行 terraform apply 时出现报错,可根据报错信息(例如缺少权限)进行修复后再次运行 terraform apply

      1. Apply complete! Resources: 3 added, 0 changed, 1 destroyed.
      2. Outputs:
      3. bastion_ip = 47.96.174.214
      4. cluster_id = c2d9b20854a194f158ef2bc8ea946f20e
      5. kubeconfig_file = /tidb-operator/deploy/aliyun/credentials/kubeconfig
      6. monitor_endpoint = not_created
      7. region = cn-hangzhou
      8. tidb_endpoint = not_created
      9. tidb_version = v3.0.0
      10. vpc_id = vpc-bp1v8i5rwsc7yh8dwyep5
    3. kubectlhelm 对集群进行操作:

      1. export KUBECONFIG=$PWD/credentials/kubeconfig
      1. kubectl version
    1. 准备 TidbCluster 和 TidbMonitor CR 文件:

      1. cp manifests/db.yaml.example db.yaml && cp manifests/db-monitor.yaml.example db-monitor.yaml

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

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

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

      根据实际情况修改 replicasstorageClaims[].resources.requests.storagestorageClassName

    2. 创建 Namespace

      1. kubectl --kubeconfig credentials/kubeconfig create namespace ${namespace}

      注意:

      namespace命名空间,可以起一个方便记忆的名字,比如和 tidb_cluster_name 相同的名称。

    3. 部署 TiDB 集群:

      1. kubectl --kubeconfig credentials/kubeconfig create -f db.yaml -n ${namespace} &&
      2. kubectl --kubeconfig credentials/kubeconfig create -f db-monitor.yaml -n ${namespace}

    连接数据库

    通过堡垒机可连接 TiDB 集群进行测试,相关信息在安装完成后的输出中均可找到:

    1. ssh -i credentials/${cluster_name}-key.pem root@${bastion_ip}
    1. mysql -h ${tidb_lb_ip} -P 4000 -u root

    tidb_lb_ip 为 TiDB Service 的 LoadBalancer IP。

    你可以通过浏览器访问 <monitor-lb>:3000 地址查看 Grafana 监控指标。

    monitor-lb 是集群 Monitor Service 的 LoadBalancer IP。

    默认帐号密码为:

    • 用户名:admin
    • 密码:admin

    升级 TiDB 集群

    要升级 TiDB 集群,可以通过 kubectl --kubeconfig credentials/kubeconfig edit tc ${tidb_cluster_name} -n ${namespace} 修改 spec.version

    升级操作可能会执行较长时间,可以通过以下命令来持续观察进度:

    1. kubectl get pods --namespace ${namespace} -o wide --watch

    TiDB 集群扩容

    注意:

    • 由于缩容过程中无法确定会缩掉哪个节点,目前还不支持 TiDB 集群的缩容。
    • 扩容过程会持续几分钟,你可以通过 kubectl --kubeconfig credentials/kubeconfig get po -n ${namespace} --watch 命令持续观察进度。

    销毁集群

    可以参考删除集群。

    然后通过如下命令销毁 ACK 集群:

    假如 Kubernetes 集群没有创建成功,那么在 destroy 时会出现报错,无法进行正常清理。此时需要手动将 Kubernetes 资源从本地状态中移除:

    1. terraform state list
    1. terraform state rm module.ack.alicloud_cs_managed_kubernetes.k8s

    销毁集群操作需要执行较长时间。

    通过在 terraform.tfvars 中设置变量的值来配置 TiDB Operator,大多数配置项均能按照 variable 的注释理解语义后进行修改。需要注意的是,operator_helm_values 配置项允许为 TiDB Operator 提供一个自定义的 values.yaml 配置文件,示例如下:

    • terraform.tfvars 中设置 operator_helm_values

      1. operator_helm_values = "./my-operator-values.yaml"
    • main.tf 中设置 operator_helm_values

      1. operator_helm_values = file("./my-operator-values.yaml")

    同时,在默认配置下 Terraform 脚本会创建一个新的 VPC,假如要使用现有的 VPC,可以在 variable.tf 中设置 vpc_id。注意,当使用现有 VPC 时,没有设置 vswitch 的可用区将不会部署 Kubernetes 节点。

    参考 API 文档和修改 TiDB 集群配置。

    管理多个 TiDB 集群

    需要在一个 Kubernetes 集群下管理多个 TiDB 集群时,需要编辑 ./main.tf,按实际需要新增 tidb-cluster 声明,示例如下:

    1. module "tidb-cluster-dev" {
    2. source = "../modules/aliyun/tidb-cluster"
    3. providers = {
    4. helm = helm.default
    5. }
    6. cluster_name = "dev-cluster"
    7. ack = module.tidb-operator
    8. pd_count = 1
    9. tikv_count = 1
    10. tidb_count = 1
    11. }
    12. module "tidb-cluster-staging" {
    13. source = "../modules/aliyun/tidb-cluster"
    14. providers = {
    15. helm = helm.default
    16. }
    17. cluster_name = "staging-cluster"
    18. ack = module.tidb-operator
    19. pd_count = 3
    20. tikv_count = 3
    21. tidb_count = 2
    22. }

    注意,多个 TiDB 集群之间 cluster_name 必须保持唯一。下面是 tidb-cluster 模块的所有可配置参数:

    管理多个 Kubernetes 集群

    推荐针对每个 Kubernetes 集群都使用单独的 Terraform 模块进行管理(一个 Terraform Module 即一个包含 .tf 脚本的目录)。

    deploy/aliyun 实际上是将 deploy/modules 中的数个可复用的 Terraform 脚本组合在了一起。当管理多个集群时(下面的操作在 tidb-operator 项目根目录下进行):

    1. 首先针对每个集群创建一个目录,如:

      1. mkdir -p deploy/aliyun-staging
    2. 参考 deploy/aliyunmain.tf,编写自己的脚本,下面是一个简单的例子:

      1. provider "alicloud" {
      2. region = ${REGION}
      3. access_key = ${ACCESS_KEY}
      4. secret_key = ${SECRET_KEY}
      5. }
      6. module "tidb-operator" {
      7. source = "../modules/aliyun/tidb-operator"
      8. region = ${REGION}
      9. access_key = ${ACCESS_KEY}
      10. secret_key = ${SECRET_KEY}
      11. cluster_name = "example-cluster"
      12. key_file = "ssh-key.pem"
      13. kubeconfig_file = "kubeconfig"
      14. }
      15. provider "helm" {
      16. alias = "default"
      17. insecure = true
      18. install_tiller = false
      19. kubernetes {
      20. config_path = module.tidb-operator.kubeconfig_filename
      21. }
      22. }
      23. module "tidb-cluster" {
      24. source = "../modules/aliyun/tidb-cluster"
      25. providers = {
      26. helm = helm.default
      27. }
      28. cluster_name = "example-cluster"
      29. ack = module.tidb-operator
      30. }
      31. module "bastion" {
      32. source = "../modules/aliyun/bastion"
      33. bastion_name = "example-bastion"
      34. key_name = module.tidb-operator.key_name
      35. vpc_id = module.tidb-operator.vpc_id
      36. vswitch_id = module.tidb-operator.vswitch_ids[0]
      37. enable_ssh_to_worker = true
      38. }

    上面的脚本可以自由定制,比如,假如不需要堡垒机则可以移除 module "bastion" 相关声明。

    使用限制

    目前,pod cidr, 和节点型号等配置在集群创建后均无法修改。