为已有 TiDB 集群部署 HTAP 存储引擎 TiFlash
适用于已经有一个 TiDB 集群,需要通过部署 TiFlash 使用 TiDB HTAP 功能的场景,例如:
- 在线实时分析处理的混合负载场景
- 实时流处理场景
- 数据中枢场景
如果你需要在现有的 TiDB 集群上部署 TiFlash 组件,请进行以下操作:
编辑 TidbCluster Custom Resource (CR):
按照如下示例增加 TiFlash 配置:
spec:
tiflash:
#如果要部署企业版的 TiFlash, 请修改 `baseImage` 的值为 `pingcap/tiflash-enterprise`。
baseImage: pingcap/tiflash
maxFailoverCount: 0
replicas: 1
storageClaims:
- resources:
requests:
storage: 100Gi
storageClassName: local-storage
TiFlash 支持挂载多个 PV。如果要为 TiFlash 配置多个 PV,可以在
tiflash.storageClaims
下面配置多个resources
项,每个resources
项可以分别配置requests.storage
和storageClassName
,例如:tiflash:
baseImage: pingcap/tiflash
maxFailoverCount: 0
replicas: 1
storageClaims:
- resources:
requests:
storage: 100Gi
storageClassName: local-storage
- resources:
requests:
配置 TidbCluster CR 中
spec.tiflash.config
的相关参数。例如:spec:
tiflash:
config:
config: |
[flash]
[flash.flash_cluster]
log = "/data0/logs/flash_cluster_manager.log"
[logger]
count = 10
level = "information"
errorlog = "/data0/logs/error.log"
log = "/data0/logs/server.log"
要获取更多可配置的 TiFlash 配置参数,请参考 TiFlash 配置文档。
编辑 TidbCluster Custom Resource (CR):
kubectl edit tc ${cluster_name} -n ${namespace}
TiDB Operator 会按照
storageClaims
列表中的配置按顺序自动挂载 PV,如果需要为 TiFlash 增加resources
项,请确保只在列表原有配置最后添加,并且不能修改列表中原有配置的顺序。例如:tiflash:
maxFailoverCount: 0
replicas: 1
storageClaims:
- resources:
requests:
storage: 100Gi
storageClassName: local-storage
- resources:
storage: 100Gi
storageClassName: local-storage
- resources: #新增
requests: #新增
storage: 100Gi #新增
storageClassName: local-storage #新增
手动删除 TiFlash StatefulSet,等待 TiDB Operator 重新创建 TiFlash StatefulSet。
如果你的 TiDB 集群不再需要 TiDB HTAP 存储引擎 TiFlash,请进行以下操作移除 TiFlash。
调整同步到 TiFlash 集群中的数据表的副本数。
需要将集群中所有同步到 TiFlash 的数据表的副本数都设置为 0,才能完全移除 TiFlash。
参考的步骤连接到 TiDB 服务。
使用以下命令,调整同步到 TiFlash 集群中的数据表的副本数:
alter table <db_name>.<table_name> set tiflash replica 0;
等待相关表的 TiFlash 副本被删除。
连接到 TiDB 服务,执行如下命令,查不到相关表的同步信息时即为副本被删除:
SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = '<db_name>' and TABLE_NAME = '<table_name>';
执行以下命令修改
spec.tiflash.replicas
为 0 来移除 TiFlash Pod。kubectl patch tidbcluster ${cluster_name} -n ${namespace} --type merge -p '{"spec":{"tiflash":{"replicas": 0}}}'
检查 TiFlash Pod 和 TiFlash 节点 store 状态。
-
kubectl get pod -n ${namespace} -l app.kubernetes.io/component=tiflash,app.kubernetes.io/instance=${cluster_name}
如果输出为空,则表示 TiFlash 集群的 Pod 已经被成功删除。
使用以下命令检查 TiFlash 节点 store 状态是否为 Tombstone:
kubectl get tidbcluster ${cluster_name} -n ${namespace} -o yaml
输出结果中的
status.tiflash
字段值类似下方实例。只有 TiFlash 集群的所有 Pod 已经被成功删除并且所有 TiFlash 节点 store 状态都变为 Tombstone 后,才能进行下一步操作。
-
删除 TiFlash StatefulSet。
使用以下命令修改 TiDB Cluster CR,删除
spec.tiflash
字段。kubectl patch tidbcluster ${cluster_name} -n ${namespace} --type json -p '[{"op":"remove", "path":"/spec/tiflash"}]'
使用以下命令删除 TiFlash StatefulSet:
kubectl delete statefulsets -n ${namespace} -l app.kubernetes.io/component=tiflash,app.kubernetes.io/instance=${cluster_name}
执行以下命令检查是否成功删除 TiFlash 集群的 StatefulSet:
kubectl get sts -n ${namespace} -l app.kubernetes.io/component=tiflash,app.kubernetes.io/instance=${cluster_name}
如果输出为空,则表示 TiFlash 集群的 StatefulSet 已经被成功删除。
(可选项) 删除 PVC 和 PV。
如果确认 TiFlash 中的数据不会被使用,想要删除数据,需要严格按照以下操作步骤来删除 TiFlash 中的数据。
删除 PV 对应的 PVC 对象
kubectl delete pvc -n ${namespace} -l app.kubernetes.io/component=tiflash,app.kubernetes.io/instance=${cluster_name}
PV 保留策略是 Retain 时,删除 PVC 对象后对应的 PV 仍将保留。如果想要删除 PV,可以设置 PV 的保留策略为 Delete,PV 会被自动删除并回收。
kubectl patch pv ${pv_name} -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'
其中
${pv_name}
表示 TiFlash 集群 PV 的名称,可以执行以下命令查看: