为已有 TiDB 集群部署负载均衡 TiProxy

本文介绍在 Kubernetes 上如何为已有的 TiDB 集群部署或删除 TiDB 负载均衡 TiProxy。TiProxy 放置在客户端和 TiDB server 之间,为 TiDB 提供负载均衡、连接保持、服务发现等功能。

部署 TiProxy

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

  1. 编辑 TidbCluster Custom Resource (CR):

    kubectl edit tc ${cluster_name} -n ${namespace}
  2. 按照如下示例增加 TiProxy 配置:

    spec: tiproxy: baseImage: pingcap/tiproxy replicas: 3
  3. 配置 TidbCluster CR 中 spec.tiproxy.config 的相关参数。例如:

    spec: tiproxy: config: | [log] level = "info"

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

  4. 配置 TidbCluster CR 中 spec.tidb 的相关参数:

    • 推荐设置 TiDB graceful-wait-before-shutdown 的值大于应用程序中事务的最长的持续时间,配合 TiProxy 的连接迁移。详见 TiProxy 使用限制

      spec: tidb: config: | graceful-wait-before-shutdown = 30
    • 如果开启了集群 TLS,则跳过这一步;如果没有开启集群 TLS,还需要生成自签名证书,并手动配置 TiDB 的 session-token-signing-certsession-token-signing-key

      spec: tidb: additionalVolumes: - name: sessioncert secret: secretName: sessioncert-secret additionalVolumeMounts: - name: sessioncert mountPath: /var/session config: | session-token-signing-cert = "/var/session/tls.crt" session-token-signing-key = "/var/session/tls.key"

      详见 session-token-signing-key

TiProxy 启动后,可通过以下命令找到对应的 tiproxy-sql 负载均衡服务。

kubectl get svc -n ${namespace}

移除 TiProxy

如果你的 TiDB 集群不再需要 TiProxy,执行以下操作移除。

  1. 执行以下命令修改 spec.tiproxy.replicas0 来移除 TiProxy Pod。

    kubectl patch tidbcluster ${cluster_name} -n ${namespace} --type merge -p '{"spec":{"tiproxy":{"replicas": 0}}}'
  2. 检查 TiProxy Pod 状态。

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

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

  3. 删除 TiProxy StatefulSet。

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

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

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

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

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

文档内容是否有帮助?