部署 TiDB Binlog

本文档介绍如何在 Kubernetes 上部署 TiDB 集群的 TiDB Binlog

部署准备

部署 TiDB 集群的 TiDB Binlog

默认情况下,TiDB Binlog 在 TiDB 集群中处于禁用状态。若要创建一个启用 TiDB Binlog 的 TiDB 集群,或在现有 TiDB 集群中启用 TiDB Binlog,可根据以下步骤进行操作。

部署 Pump

可以修改 TidbCluster CR,添加 Pump 相关配置,示例如下:

  1. spec
  2. ...
  3. pump:
  4. baseImage: pingcap/tidb-binlog
  5. version: v3.0.11
  6. replicas: 1
  7. storageClassName: local-storage
  8. requests:
  9. storage: 30Gi
  10. schedulerName: default-scheduler
  11. config:
  12. addr: 0.0.0.0:8250
  13. gc: 7
  14. heartbeat-interval: 2

按照集群实际情况修改 versionreplicasstorageClassNamerequests.storage 等配置。

如果在生产环境中开启 TiDB Binlog,建议为 TiDB 与 Pump 组件设置亲和性和反亲和性。如果在内网测试环境中尝试使用开启 TiDB Binlog,可以跳过此步。

默认情况下,TiDB 和 Pump 的 affinity 亲和性设置为 {}。由于目前 Pump 组件与 TiDB 组件默认并非一一对应,当启用 TiDB Binlog 时,如果 Pump 与 TiDB 组件分开部署并出现网络隔离,而且 TiDB 组件还开启了 ignore-error,则会导致 TiDB 丢失 Binlog。推荐通过亲和性特性将 TiDB 组件与 Pump 部署在同一台 Node 上,同时通过反亲和性特性将 Pump 分散在不同的 Node 上,每台 Node 上至多仅需一个 Pump 实例。

  • spec.tidb.affinity 按照如下设置:

    1. spec:
    2. tidb:
    3. affinity:
    4. podAffinity:
    5. preferredDuringSchedulingIgnoredDuringExecution:
    6. - weight: 100
    7. podAffinityTerm:
    8. labelSelector:
    9. matchExpressions:
    10. - key: "app.kubernetes.io/component"
    11. operator: In
    12. values:
    13. - "pump"
    14. - key: "app.kubernetes.io/managed-by"
    15. operator: In
    16. values:
    17. - "tidb-operator"
    18. - key: "app.kubernetes.io/name"
    19. operator: In
    20. values:
    21. - "tidb-cluster"
    22. - key: "app.kubernetes.io/instance"
    23. operator: In
    24. values:
    25. - ${cluster_name}
    26. topologyKey: kubernetes.io/hostname
  • spec.pump.affinity 按照如下设置:

    1. spec:
    2. pump:
    3. affinity:
    4. podAffinity:
    5. preferredDuringSchedulingIgnoredDuringExecution:
    6. - weight: 100
    7. podAffinityTerm:
    8. labelSelector:
    9. matchExpressions:
    10. - key: "app.kubernetes.io/component"
    11. operator: In
    12. values:
    13. - "tidb"
    14. - key: "app.kubernetes.io/managed-by"
    15. operator: In
    16. values:
    17. - "tidb-operator"
    18. - key: "app.kubernetes.io/name"
    19. operator: In
    20. values:
    21. - "tidb-cluster"
    22. - key: "app.kubernetes.io/instance"
    23. operator: In
    24. values:
    25. - ${cluster_name}
    26. topologyKey: kubernetes.io/hostname
    27. podAntiAffinity:
    28. preferredDuringSchedulingIgnoredDuringExecution:
    29. - weight: 100
    30. podAffinityTerm:
    31. labelSelector:
    32. matchExpressions:
    33. - key: "app.kubernetes.io/component"
    34. operator: In
    35. values:
    36. - "pump"
    37. - key: "app.kubernetes.io/managed-by"
    38. operator: In
    39. values:
    40. - "tidb-operator"
    41. - key: "app.kubernetes.io/name"
    42. operator: In
    43. values:
    44. - "tidb-cluster"
    45. - key: "app.kubernetes.io/instance"
    46. operator: In
    47. values:
    48. - ${cluster_name}
    49. topologyKey: kubernetes.io/hostname

注意:

如果更新了 TiDB 组件的亲和性配置,将引起 TiDB 组件滚动更新。

部署 drainer

可以通过 tidb-drainer Helm chart 来为 TiDB 集群部署多个 drainer,示例如下:

  1. 确保 PingCAP Helm 库是最新的:

    1. helm repo update
    1. helm search tidb-drainer -l
  2. 获取默认的 values.yaml 文件以方便自定义:

    1. helm inspect values pingcap/tidb-drainer --version=${chart_version} > values.yaml
  3. 修改 values.yaml 文件以指定源 TiDB 集群和 drainer 的下游数据库。示例如下:

    1. clusterName: example-tidb
    2. clusterVersion: v3.0.0
    3. storageClassName: local-storage
    4. storage: 10Gi
    5. config: |
    6. detect-interval = 10
    7. [syncer]
    8. worker-count = 16
    9. txn-batch = 20
    10. disable-dispatch = false
    11. ignore-schemas = "INFORMATION_SCHEMA,PERFORMANCE_SCHEMA,mysql"
    12. safe-mode = false
    13. db-type = "tidb"
    14. [syncer.to]
    15. host = "slave-tidb"
    16. user = "root"
    17. password = ""
    18. port = 4000

    clusterNameclusterVersion 必须匹配所需的源 TiDB 集群。

    有关完整的配置详细信息,请参阅 Kubernetes 上的 TiDB Binlog Drainer 配置

  4. 部署 drainer:

    1. helm install pingcap/tidb-drainer --name=${cluster_name} --namespace=${namespace} --version=${chart_version} -f values.yaml

    注意:

    该 chart 必须与源 TiDB 集群安装在相同的命名空间中。

开启 TLS

如果要为 TiDB 集群及 TiDB Binlog 开启 TLS,请参考为 TiDB 组件间开启 TLS 进行配置。