为已有 TiDB 集群部署异构集群

本文介绍如何为已有的 TiDB 集群部署一个异构集群。异构集群是与已有 TiDB 集群不同配置的节点构成的集群。

适用场景

适用于基于已有的 TiDB 集群需要创建一个差异化配置的实例节点的场景,例如:

  • 创建不同配置不同 Label 的 TiKV 集群用于热点调度
  • 创建不同配置的 TiDB 集群分别用于 OLTP 和 OLAP 查询

前置条件

已经存在一个 TiDB 集群。如果尚未部署 TiDB 集群,可以参考在标准 Kubernetes 上部署 TiDB 集群进行部署。

部署异构集群

依据你是否需要为异构集群开启 TLS (Transport Layer Security,安全传输层协议),请选择以下方案之一:

  • 部署未开启 TLS 的异构集群
  • 部署开启 TLS 的异构集群

  • 非 TLS

  • TLS

部署未开启 TLS 的异构集群

要部署一个异构集群,请进行以下操作:

  1. 为异构集群新建一个集群配置文件。

    例如,将如下配置存为 cluster.yaml 文件,并替换 ${heterogeneous_cluster_name} 为自己想命名的异构集群名字,替换 ${origin_cluster_name} 为想要加入的已有集群名称。

    注意:

    相比于普通 TiDB 集群配置文件,异构集群配置文件的唯一区别是,你需要额外配置 spec.cluster.name 字段为已有的 TiDB 集群名。通过此字段,TiDB Operator 会将该异构集群加入到已有的 TiDB 集群。

    1. apiVersion: pingcap.com/v1alpha1
    2. kind: TidbCluster
    3. metadata:
    4. name: ${heterogeneous_cluster_name}
    5. spec:
    6. configUpdateStrategy: RollingUpdate
    7. version: v5.4.0
    8. timezone: UTC
    9. pvReclaimPolicy: Delete
    10. discovery: {}
    11. cluster:
    12. name: ${origin_cluster_name}
    13. tikv:
    14. baseImage: pingcap/tikv
    15. maxFailoverCount: 0
    16. replicas: 1
    17. # 如果不设置 storageClassName,TiDB Operator 将使用 Kubernetes 集群默认的 Storage Class
    18. # storageClassName: local-storage
    19. requests:
    20. storage: "100Gi"
    21. config: {}
    22. tidb:
    23. baseImage: pingcap/tidb
    24. maxFailoverCount: 0
    25. replicas: 1
    26. service:
    27. type: ClusterIP
    28. config: {}
    29. tiflash:
    30. baseImage: pingcap/tiflash
    31. maxFailoverCount: 0
    32. replicas: 1
    33. storageClaims:
    34. - resources:
    35. requests:
    36. storage: 100Gi

    TiDB 集群更多的配置项和字段含义,请参考 TiDB 集群配置文档

  2. 依据需要,修改异构集群配置文件中各节点的配置项。

    例如,你可以修改 cluster.yaml 文件中各组件的 replicas 数量,或者删除不需要的组件。

  3. 执行以下命令创建异构集群。你需要将 cluster.yaml 替换为你的异构集群配置文件名。

    1. kubectl create -f cluster.yaml -n ${namespace}

    如果输出提示 tidbcluster.pingcap.com/${heterogeneous_cluster_name} created,表示执行成功。TiDB Operator 会根据集群配置文件,创建对应配置的 TiDB 集群。

部署开启 TLS 的异构集群

开启异构集群 TLS 需要显示声明,需要创建新的 Secret 证书文件,使用和目标集群相同的 CA (Certification Authority) 颁发。如果使用 cert-manager 方式,需要使用和目标集群相同的 Issuer 来创建 Certificate

为异构集群创建证书的详细步骤,可参考以下文档:

创建证书后,要部署一个开启 TLS 的异构集群,请进行以下操作:

  1. 为异构集群新建一个集群配置文件。

    例如,将如下配置存为 cluster.yaml 文件,并替换 ${heterogeneous_cluster_name} 为自己想命名的异构集群名字,${origin_cluster_name} 替换为想要加入的已有集群名称。

    注意:

    相比于普通 TiDB 集群配置文件,异构集群配置文件的唯一区别是,你需要额外配置 spec.cluster.name 字段为已有的 TiDB 集群名。通过此字段,TiDB Operator 会将该异构集群加入到已有的 TiDB 集群。

    1. apiVersion: pingcap.com/v1alpha1
    2. kind: TidbCluster
    3. metadata:
    4. name: ${heterogeneous_cluster_name}
    5. spec:
    6. tlsCluster:
    7. enabled: true
    8. configUpdateStrategy: RollingUpdate
    9. version: v5.4.0
    10. timezone: UTC
    11. pvReclaimPolicy: Delete
    12. discovery: {}
    13. cluster:
    14. name: ${origin_cluster_name}
    15. tikv:
    16. baseImage: pingcap/tikv
    17. maxFailoverCount: 0
    18. replicas: 1
    19. # 如果不设置 storageClassName,TiDB Operator 将使用 Kubernetes 集群默认的 Storage Class
    20. # storageClassName: local-storage
    21. requests:
    22. storage: "100Gi"
    23. config: {}
    24. tidb:
    25. baseImage: pingcap/tidb
    26. maxFailoverCount: 0
    27. replicas: 1
    28. service:
    29. type: ClusterIP
    30. config: {}
    31. tlsClient:
    32. enabled: true
    33. tiflash:
    34. baseImage: pingcap/tiflash
    35. maxFailoverCount: 0
    36. replicas: 1
    37. storageClaims:
    38. - resources:
    39. requests:
    40. storage: 100Gi

    其中,spec.tlsCluster.enabled 表示组件间是否开启 TLS,spec.tidb.tlsClient.enabled 表示 MySQL 客户端是否开启 TLS。

  2. 依据需要,修改异构集群配置文件中各节点的配置项。

    例如,你可以修改 cluster.yaml 文件中各组件的 replicas 数量或者删除不需要的组件。

  3. 执行以下命令创建开启 TLS 的异构集群。你需要将 cluster.yaml 替换为你的异构集群配置文件名。

    1. kubectl create -f cluster.yaml -n ${namespace}

    如果执行成功,输出会提示 tidbcluster.pingcap.com/${heterogeneous_cluster_name} created。TiDB Operator 会根据集群配置文件,创建对应配置的 TiDB 集群。

部署集群监控

如果你需要为异构集群部署监控,请在已有 TiDB 集群的 TidbMonitor CR 文件增加异构集群名。具体操作如下:

  1. 编辑已有 TiDB 集群的 TidbMonitor Custom Resource (CR):

    1. kubectl edit tm ${cluster_name} -n ${namespace}
  2. 参考以下示例,替换 ${origin_cluster_name} 为想要加入的集群名称,替换 ${heterogeneous_cluster_name} 为异构集群名称:

    1. apiVersion: pingcap.com/v1alpha1
    2. kind: TidbMonitor
    3. metadata:
    4. name: heterogeneous
    5. spec:
    6. clusters:
    7. - name: ${origin_cluster_name}
    8. - name: ${heterogeneous_cluster_name}
    9. prometheus:
    10. baseImage: prom/prometheus
    11. version: v2.27.1
    12. grafana:
    13. baseImage: grafana/grafana
    14. version: 7.5.11
    15. initializer:
    16. baseImage: pingcap/tidb-monitor-initializer
    17. version: v5.4.0
    18. reloader:
    19. baseImage: pingcap/tidb-monitor-reloader
    20. version: v1.0.1
    21. prometheusReloader:
    22. baseImage: quay.io/prometheus-operator/prometheus-config-reloader
    23. version: v0.49.0
    24. imagePullPolicy: IfNotPresent