为已有 TiDB 集群部署 HTAP 存储引擎 TiFlash

    适用于已经有一个 TiDB 集群,需要通过部署 TiFlash 使用 TiDB HTAP 功能的场景,例如:

    • 在线实时分析处理的混合负载场景
    • 实时流处理场景
    • 数据中枢场景

    如果你需要在现有的 TiDB 集群上部署 TiFlash 组件,请进行以下操作:

    1. 编辑 TidbCluster Custom Resource (CR):

    2. 按照如下示例增加 TiFlash 配置:

      1. spec:
      2. tiflash:
      3. #如果要部署企业版的 TiFlash, 请修改 `baseImage` 的值为 `pingcap/tiflash-enterprise`。
      4. baseImage: pingcap/tiflash
      5. maxFailoverCount: 0
      6. replicas: 1
      7. storageClaims:
      8. - resources:
      9. requests:
      10. storage: 100Gi
      11. storageClassName: local-storage
    3. TiFlash 支持挂载多个 PV。如果要为 TiFlash 配置多个 PV,可以在 tiflash.storageClaims 下面配置多个 resources 项,每个 resources 项可以分别配置 requests.storagestorageClassName,例如:

      1. tiflash:
      2. baseImage: pingcap/tiflash
      3. maxFailoverCount: 0
      4. replicas: 1
      5. storageClaims:
      6. - resources:
      7. requests:
      8. storage: 100Gi
      9. storageClassName: local-storage
      10. - resources:
      11. requests:
    4. 配置 TidbCluster CR 中 spec.tiflash.config 的相关参数。例如:

      1. spec:
      2. tiflash:
      3. config:
      4. config: |
      5. [flash]
      6. [flash.flash_cluster]
      7. log = "/data0/logs/flash_cluster_manager.log"
      8. [logger]
      9. count = 10
      10. level = "information"
      11. errorlog = "/data0/logs/error.log"
      12. log = "/data0/logs/server.log"

      要获取更多可配置的 TiFlash 配置参数,请参考 TiFlash 配置文档

    1. 编辑 TidbCluster Custom Resource (CR):

      1. kubectl edit tc ${cluster_name} -n ${namespace}
    2. TiDB Operator 会按照 storageClaims 列表中的配置按顺序自动挂载 PV,如果需要为 TiFlash 增加 resources 项,请确保只在列表原有配置最后添加,并且不能修改列表中原有配置的顺序。例如:

      1. tiflash:
      2. maxFailoverCount: 0
      3. replicas: 1
      4. storageClaims:
      5. - resources:
      6. requests:
      7. storage: 100Gi
      8. storageClassName: local-storage
      9. - resources:
      10. storage: 100Gi
      11. storageClassName: local-storage
      12. - resources: #新增
      13. requests: #新增
      14. storage: 100Gi #新增
      15. storageClassName: local-storage #新增
    3. 手动删除 TiFlash StatefulSet,等待 TiDB Operator 重新创建 TiFlash StatefulSet。

    如果你的 TiDB 集群不再需要 TiDB HTAP 存储引擎 TiFlash,请进行以下操作移除 TiFlash。

    1. 调整同步到 TiFlash 集群中的数据表的副本数。

      需要将集群中所有同步到 TiFlash 的数据表的副本数都设置为 0,才能完全移除 TiFlash。

      1. 参考的步骤连接到 TiDB 服务。

      2. 使用以下命令,调整同步到 TiFlash 集群中的数据表的副本数:

        1. alter table <db_name>.<table_name> set tiflash replica 0;
    2. 等待相关表的 TiFlash 副本被删除。

      连接到 TiDB 服务,执行如下命令,查不到相关表的同步信息时即为副本被删除:

      1. SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = '<db_name>' and TABLE_NAME = '<table_name>';
    3. 执行以下命令修改 spec.tiflash.replicas 为 0 来移除 TiFlash Pod。

      1. kubectl patch tidbcluster ${cluster_name} -n ${namespace} --type merge -p '{"spec":{"tiflash":{"replicas": 0}}}'
    4. 检查 TiFlash Pod 和 TiFlash 节点 store 状态。

        1. kubectl get pod -n ${namespace} -l app.kubernetes.io/component=tiflash,app.kubernetes.io/instance=${cluster_name}

        如果输出为空,则表示 TiFlash 集群的 Pod 已经被成功删除。

      1. 使用以下命令检查 TiFlash 节点 store 状态是否为 Tombstone:

        1. kubectl get tidbcluster ${cluster_name} -n ${namespace} -o yaml

        输出结果中的 status.tiflash 字段值类似下方实例。

        只有 TiFlash 集群的所有 Pod 已经被成功删除并且所有 TiFlash 节点 store 状态都变为 Tombstone 后,才能进行下一步操作。

    5. 删除 TiFlash StatefulSet。

      1. 使用以下命令修改 TiDB Cluster CR,删除 spec.tiflash 字段。

        1. kubectl patch tidbcluster ${cluster_name} -n ${namespace} --type json -p '[{"op":"remove", "path":"/spec/tiflash"}]'
      2. 使用以下命令删除 TiFlash StatefulSet:

        1. kubectl delete statefulsets -n ${namespace} -l app.kubernetes.io/component=tiflash,app.kubernetes.io/instance=${cluster_name}
      3. 执行以下命令检查是否成功删除 TiFlash 集群的 StatefulSet:

        1. kubectl get sts -n ${namespace} -l app.kubernetes.io/component=tiflash,app.kubernetes.io/instance=${cluster_name}

        如果输出为空,则表示 TiFlash 集群的 StatefulSet 已经被成功删除。

    6. (可选项) 删除 PVC 和 PV。

      如果确认 TiFlash 中的数据不会被使用,想要删除数据,需要严格按照以下操作步骤来删除 TiFlash 中的数据。

      1. 删除 PV 对应的 PVC 对象

        1. kubectl delete pvc -n ${namespace} -l app.kubernetes.io/component=tiflash,app.kubernetes.io/instance=${cluster_name}
      2. PV 保留策略是 Retain 时,删除 PVC 对象后对应的 PV 仍将保留。如果想要删除 PV,可以设置 PV 的保留策略为 Delete,PV 会被自动删除并回收。

        1. kubectl patch pv ${pv_name} -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'

        其中 ${pv_name} 表示 TiFlash 集群 PV 的名称,可以执行以下命令查看: