背景
TiDB 数据库是一款云原生的分布式数据库,本身具备负载均衡机制,默认会将业务负载均匀地分布到不同计算或存储节点上,更好地利用上整体系统资源。但是,在某些场景下会出现业务负载不能被很好地分散,节点间的负载不均衡,从而影响性能。
TiDB 数据库是计算存储分离的,负载不均衡可能出现在计算节点,也可能出现在存储节点,本文只介绍出现在存储节点上出现负载不均衡的处理方式。
TiKV存储节点负载不均衡案例分析
对TiDB数据库进行TPC-C测试,观察grafana面板中tikv CPU使用情况,发现6个tikv节点的CPU使用并不均衡,CPU使用率差别很大。如下图所示:
观察Overview中tikv主机的CPU使用率,CPU使用率最高的节点能达到2251%,而CPU使用率最低的节点只有1151%,说明存储节点的负载不均衡。
观察tikv的leader分布情况,leader最多的节点有429个,leader最低的节点有389个,差距在10%左右
通过如下sql,查看表的region leader所在的存储节点上的数量,发现这张表在每个tikv节点上的leader数量不均衡。
select trs.table_name,tss.address,count(trp.region_id) leader_region_count
from TIKV_STORE_STATUS tss,TIKV_REGION_PEERS trp,(select distinct region_id,table_name,db_name from TIKV_REGION_status where is_index=0) trs
where trs.region_id=trp.region_id and trp.store_id=tss.store_id and trp.is_leader=1 and trs.table_name='tab1'
and trs.db_name='db1' group by trs.table_name,tss.address order by trs.table_name,tss.address;
region leader 重分布方法
对表region leader重分布,有两种方式:
- 通过TiDB的API接口进行打散
- 通过SQL命令 split table 进行打散
通过TiDB的API接口进行打散
执行如下命令,可以对表的 region leader 进行打散,结合上一章节的sql脚本进行校验。
curl http://192.168.1.1:10081/tables/tpcc/bmsql_config/scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_customer/scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_district/scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_history/scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_new_order/scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_item/scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_oorder/scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_order_line/scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_stock/scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_warehouse/scatter
通过如上命令对表进行打散后,需要手动关闭,命令如下:
curl http://192.168.1.1:10081/tables/tpcc/bmsql_config/stop-scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_customer/stop-scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_district/stop-scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_history/stop-scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_new_order/stop-scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_item/stop-scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_oorder/stop-scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_order_line/stop-scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_stock/stop-scatter
curl http://192.168.1.1:10081/tables/tpcc/bmsql_warehouse/stop-scatter
通过SQL命令 split table 进行打散
参考官网链接:
https://docs.pingcap.com/zh/tidb/stable/sql-statement-split-region#%E8%AF%AD%E6%B3%95%E5%9B%BE
通过如上方式,对region leader 打散后,再次执行TPCC,发现存储节点的CPU使用率相差无几,每个存储节点的负载都均衡。