针对这种场景,TiProxy 的负载均衡策略主要有两点改进:
负载均衡是动态的,能把连接从一台 TiDB 迁移到另一台,而不只是在路由时做负载均衡,这对长连接的应用更有效。例如你使用了连接池,而每个连接的负载是不固定的,所以 TiDB 的负载也是起伏的。又例如,你新扩了一台 TiDB 出来,长连接也会迁到新 TiDB 上。
负载均衡是基于资源使用率的,而不仅仅是 round-robin、随机这些简单的策略,因为简单策略假设每个连接的负载是相同的,但数据库应用更随机多变。
根据以上你的截图,我简单猜测下:要么 237 是新扩出来的节点;要么是断开连接时,刚好 237 上断开的连接更多。
你…
感谢。我说下之前的规划:
比较结果集:采集时记录行数、结果集的 checksum,然后在测试集群比对。问题是本来就很难保证结果一致,所以会产生很多误报。
比较性能:采集时记录 SQL 延迟,在测试集群比对。
比较执行计划:采集流量后,建两个测试集群,分别对应两个版本,TiProxy 在 SQL 前面加上 explain 去比对两个集群的计划,这样能比较所有 SQL 的所有参数,但是操作链路太长。
对比 STATEMENTS_SUMMARY_HISTORY 确实是个很好的方案,能比较的维度很多,尤其是扫描行数。缺点是比较不全面,例如 COMMIT 语句区分不出是哪个事务的,但问题也不大。
监控缺失是三台一起缺失,跟 “某一台虚拟机网络延迟很高” 不是同一件事吧?
如果是网络带宽问题,可能是 tiproxy 所在的那台机器网络带宽打满了
感谢反馈,我们近期就把 http api 加到文档上。
直接连 3080 的话,跟 tidb 的 10080 一样可以用 curl 127.0.0.1:3080/xxx 获取,常见的接口有:
/api/debug/health 是否健康
/api/admin/config/ 获取或设置配置
/metrics 获取监控
/debug/pprof/xxx 获取 profile
tidb v6.5.0 引入的包有 bug,需要升级到 v6.5.1。
不过升级之后 host 的 IP 是对的,port 一直为 0。
现在只考虑了连接数,不支持配置权重。上面的规划里考虑了 CPU、内存等。你说的资源应该主要指 CPU?如果考虑 CPU 使用率的时候结合了 TiDB 实例的核数,应该也能满足你的需求。
可以用 bin/tiproxyctl,它会连 3080。tiproxyctl --help 可以看到支持的命令,例如 tiproxyctl config get 获取 config。
直接连 3080 的话,跟 tidb 的 10080 一样可以用 curl 127.0.0.1:3080/xxx 获取,常见的接口有:
/api/admin/config/ 获取配置
/metrics 获取监控
/debug/pprof/xxx 获取 profile
TiDB Serverless 在开发了,但是线下和 TiDB Dedicated 版本没有计划。
受教了,让 TiProxy 自己管理 VIP 确实更好。
不过我想调整一下,把 raft 选举改为在 PD 上的 etcd 选主,因为 TiDB 的正常运行都是依赖于 PD 的。在网络分区的情况下,etcd 选主总能选到和 PD leader 在同一个分区的 TiProxy,也就能路由到正常的 TiDB;而 raft 可能会路由到另一个分区,导致集群完全不可用。
另外我在想,也许让用户选择 primary 偏好,或者像 keepalived 一样配置权重能适应更多场景:
因为只有一台 primary 实例,它的硬件配置可能需要很高。用户为了省成本,可能想要 primary 32C,s…
开启 proxy-protocol 后用 select host from information_schema.processlist where id=connection_id();
可以通过 tiproxy 日志,有 [new connection] [connID=0] [client_addr=127.0.0.1:63187],可以根据 client_addr 找客户端地址。
如果没有开启 proxy-protocol,也可以通过 show processlist 看 host,这里的 host 就是 tiproxy 地址,因为对 tidb 来说,tiproxy 就是客户端。
目前没有其他办法,有什么建议吗
statements_summary 最大保存条数 tidb_stmt_summary_max_stmt_count 指的是保留的所有 SQL 的种类,而不是单个时间段的种类。也就是说,可能由于新的 SQL 进来,把旧的 SQL 刷下去了。
可以查询
select count(distinct schema_name, digest, plan_digest) from information_schema.statements_summary_history where digest_text != ‘commit’;
先看看大体的种类。