TiDB Binlog 运维

本文档介绍如何在 Kubernetes 上运维 TiDB 集群的 TiDB Binlog

运维准备

启用 TiDB 集群的 TiDB Binlog

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

  1. 按照以下说明修改 values.yaml 文件:

    • binlog.pump.create 的值设为 true
    • binlog.drainer.create 的值设为 true
    • binlog.pump.storageClassNamebinlog.drainer.storageClassName 设为所在 Kubernetes 集群上可用的 storageClass
    • binlog.drainer.destDBType 设为所需的下游存储类型。

      TiDB Binlog 支持三种下游存储类型:

      • PersistenceVolume:默认的下游存储类型。可通过修改 binlog.drainer.storage 来为 drainer 配置大 PV。

      • 与 MySQL 兼容的数据库:通过将 binlog.drainer.destDBType 设置为 mysql 来启用。同时,必须在 binlog.drainer.mysql 中配置目标数据库的地址和凭据。

      • Apache Kafka:通过将 binlog.drainer.destDBType 设置为 kafka 来启用。同时,必须在 binlog.drainer.kafka 中配置目标集群的 zookeeper 地址和 Kafka 地址。

  2. 为 TiDB 与 Pump 组件设置亲和性和反亲和性:

    注意:

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

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

    注意:

    <release-name> 需要替换为目标 tidb-cluster 的 Helm release name。

    • tidb.affinity 按照如下设置:

      1. tidb:
      2. affinity:
      3. podAffinity:
      4. requiredDuringSchedulingIgnoredDuringExecution:
      5. - labelSelector:
      6. matchExpressions:
      7. - key: "app.kubernetes.io/component"
      8. operator: In
      9. values:
      10. - "pump"
      11. - key: "app.kubernetes.io/managed-by"
      12. operator: In
      13. values:
      14. - "tidb-operator"
      15. - key: "app.kubernetes.io/name"
      16. operator: In
      17. values:
      18. - "tidb-cluster"
      19. - key: "app.kubernetes.io/instance"
      20. operator: In
      21. values:
      22. - <release-name>
      23. topologyKey: kubernetes.io/hostname
    • binlog.pump.affinity 按照如下设置:

      1. binlog:
      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. - <release-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. - <release-name>
      49. topologyKey: kubernetes.io/hostname
  3. 创建一个新的 TiDB 集群或更新现有的集群:

    • 创建一个启用 TiDB Binlog 的 TiDB 新集群:

      1. helm install pingcap/tidb-cluster --name=<release-name> --namespace=<namespace> --version=<chart-version> -f <values-file>
    • 更新现有的 TiDB 集群以启用 TiDB Binlog:

      注意:

      如果设置了 TiDB 组件的亲和性,那么更新现有的 TiDB 集群将引起 TiDB 集群中的 TiDB 组件滚动更新。

      1. helm upgrade <release-name> pingcap/tidb-cluster --version=<chart-version> -f <values-file>

部署多个 drainer

默认情况下,仅创建一个下游 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=<release-name> --namespace=<namespace> --version=<chart-version> -f values.yaml

    注意:

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