通过JDBC调用TiDB分析复杂SQL,如何做负载均衡,为何 默认没有进行tidb节点的负载均衡?

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v4.0.7
  • 【问题描述】:

我在进行压力测试的时候,是通过jdbc连接TiDB集群的某一台节点,然后通过jdbc调用tidb执行复杂SQL来进行分析的。
在监控界面,在进行复杂SQL分析的时候,这个SQL开启10个并行的程序,每个程序执行同一个SQL。10个SQL并行执行,共占用了70多个G。问题是,这70多个G,全都在一个tidb节点上,很容易导致tidb宕机。
我的问题是,为什么PD节点不进行复杂均衡,把这个10个并行的SQL分配到不同TiDB节点上运行,而是10个SQL全都集中在一个TiDB节点上执行?
tidb内存监控,可以发现,所有的SQL都在同一个tidb节点上执行的,没有用上3台tidb节点,只用上了一台


我的jdbc调用方式

请问如何做节点间SQL执行的负载均衡?

可以在前面加一个 lb 做负载均衡,比如 HAproxy
https://docs.pingcap.com/zh/tidb/stable/haproxy-best-practices#启动-haproxy

好的,我配置上了。用的是roundrobin的负载均衡方式。
不过我还有两个问题:
1、PD节点,不是会自动实现负载均衡吗?我记得PD节点就是用于进行调度和负载均衡的。
2、即使用上了HaProxy负载均衡,也存在宕机的情况,我是用while循环来调用jdbc的,一次分析完,立马进行下一次分析,每次分析在10多秒。请问能不能实现一个队列?就像Yarn,或者Impala一样,将任务放在队列里面,如果没有资源了,就等待着,等到有资源了再执行?
3、这个HAProxy的roundrobin策略,为什么没有按照轮训的方式来分配呢?包括 leastconn策略我也试来着,分配的也不均匀。我是jdbc长连接。我有三台节点,有的就是并发为3,有的并发为1,有的并发为0。我用ngnix,可以实现相同的功能吗?我打算用ngnix,这个熟悉一点
4、TiDB组件的自动重启功能挺好的,比如tidb节点挂了,可以自动重启。请问如果tidb节点压力大,自动重启了,那后期再来请求的话,会自动判定这个节点已经可用是吧。


目前节点之间的任务分布就很不均匀,使用的是 leastconn策略

  1. pd 是使 tikv 中的 region 数量和 leader 数量均衡,和 业务使用哪个 tidb 没有关系
  2. 那你要看是不是两个 sql 就OOM了,宕机时候tidb.log 和 操作系统/var/log/message 日志有什么报错,如果是资源不足,需要扩容
  3. 可以使用 ngnix