📣

TiDB Cloud Serverless 现已更名为
TiDB Cloud Starter
!体验不变,名字焕新。
立即试用 →

为已有 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

TiProxy 对外暴露了一个 NodePort 类型的服务,该服务提供两个端口:

  • tiproxy-api:用于 API 访问。
  • tiproxy-sql:用于 MySQL 协议访问。

要获取这些服务的端口信息,运行以下命令:

kubectl -n tidb-cluster get service basic-tiproxy

输出示例如下:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE basic-tiproxy NodePort 10.101.114.216 <none> 3080:31006/TCP,6000:31539/TCP 3h19m

如需仅显示 tiproxy-sql 端点的详细信息,在命令中添加 jq

kubectl -n tidb-cluster get service basic-tiproxy -o json | jq '.spec.ports[]|select(.name == "tiproxy-sql")'

输出示例如下:

{ "name": "tiproxy-sql", "nodePort": 31539, "port": 6000, "protocol": "TCP", "targetPort": 6000 }

使用以上信息,你可以通过 MySQL 客户端连接 TiProxy:

mysql -h <clusterIP> -P <nodePort>

如果你使用 minikube,运行以下命令获取正确的 IP 地址和端口:

minikube service basic-tiproxy -n tidb-cluster

输出示例如下:

┌──────────────┬───────────────┬──────────────────┬───────────────────────────┐ │ NAMESPACE │ NAME │ TARGET PORT │ URL │ ├──────────────┼───────────────┼──────────────────┼───────────────────────────┤ │ tidb-cluster │ basic-tiproxy │ tiproxy-api/3080 │ http://192.168.49.2:31006 │ │ │ │ tiproxy-sql/6000 │ http://192.168.49.2:31539 │ └──────────────┴───────────────┴──────────────────┴───────────────────────────┘ [tidb-cluster basic-tiproxy tiproxy-api/3080 tiproxy-sql/6000 http://192.168.49.2:31006 http://192.168.49.2:31539]

在上述输出中,找到包含 tiproxy-sql/6000 的行,并使用 URL 列中的主机名和端口号进行连接。

移除 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 已经被成功删除。

文档内容是否有帮助?