暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

价值几十万的TiDB优化

雷雷DBA 2021-06-12
1645

         价值几十万的TiDB优化

                                     --2021-06-12  刘春雷


首先请大家理解我这次成为了“标题党”,违背了我每次的内容至上的追求;因为这次业务损失了几十万,所以就叫:价值几十万的TiDB优化


1、前言

    58同城每年的年初为业务流量高峰,例如租房、找工作、本地服务等等,几乎所有的业务都会疯狂增长,对数据库来说是个很大的挑战。TiDB数据库同样压力山大~

TiDB很多重要的业务,年前都优化过,扩容过,也反馈给开发相关慢SQL、业务逻辑问题等,就是希望在年后能平稳度过业务高峰期。

然鹅,事与愿违,面对全业务线的高峰,TiDB某重点业务出问题了:3月初某天,业务反馈写入慢,导致部分订单损失,价值几十万,情况万分危急~


2、问题排查定位

【基础信息】:

TiDB版本:4.0.2


2.1、监控情况

监控信息:可以从监控看出,SQL执行时间已经在1s-2s+ 了,但是没有突增

业务损失原因:业务抛弃的时间阈值是3s,即业务逻辑+SQL的整体时间超过3s ,此订单就抛弃了,导致了损失。

【TiDB监控】:


【系统监控】:


2.2、慢SQL量情况

DBA同样排查慢SQL情况,发现慢SQL量在出问题的时间,没有明显增长很多,只是增长了一点

注:中间的高峰为操作导致,忽略

【慢SQL趋势图】:


【慢SQL量详细】:


【超1.5s 慢SQL】:

超过1.5s的慢SQL信息如下,这些可能导致业务时间超3s,抛弃导致损失~


【超1.5s慢SQL量详细】:


2.3、慢SQL具体分析

    发现量最大的慢SQL是节前1月份已经通知开发的慢SQL,开发没跟进解决.....导致节后:业务流量增加的情况下,集群写入性能不佳。

总共2种慢SQL,分析可以添加一个联合索引解决。之前问题为:查询没有覆盖到所有字段导致性能差,进而影响了整个集群的性能。


2.3.1、慢查询SQL1

【问题SQL】:

SELECT COUNT(0) FROM xxx WHERE xx_date >= 'xxx' AND xx_date <= 'xxx' AND xxx_id = xxx AND xxx2_id = xxx AND xxx_type = 1 ;


【分析SQL量】:

select count(*),avg(Query_time),min(time),max(time),max(Query_time) from cluster_slow_query where time >='2021-03-04 00:00:00' and time<='2021-03-04 23:59:59' and  Digest='xxx';


【优化前执行计划】:

执行计划:发现扫描的行数比较多,且表的健康度不高,导致执行计划不正常,DBA尝试analyze表解决。


【处理】:
analyze table xxx;


【analyze后续执行计划】:

analyze表后,执行计划算是正常了,扫描条数下降了,但是索引不是最优,还需要索引优化


【索引优化】:

添加索引: alter table xxx add index idx_xx(xx_id,xx2_id,xx_type,xx_date);

【添加索引后的执行计划】


2.3.2、慢查询SQL2

SELECT  * FROM xxx WHERE xx_date >= 'xx' AND xx_date <= 'xx' AND xx_id = xx AND xx_id = xx AND xx_type = 0  ORDER BY  xx_date DESC  LIMIT 0,400;


【分析SQL量】

select count(*),avg(Query_time),min(time),max(time),max(Query_time) from cluster_slow_query where time >='2021-03-01 00:00:00' and time<='2021-03-01 23:59:59' and  Digest='xx'; 


【优化前执行计划】:


【同样添加索引后的执行计划】:


2.4、执行索引优化

因表比较大,数量:分表128张,且白天要控制速度添加,减少对业务的影响,晚上适当加速添加

共计:

开始:2021-03-03 13:55:49

结束:2021-03-13 19:48:09

总共历经:10天+


2.5、索引优化后的效果

【监控情况】:



3、扩容

   同时,出问题的当天,我们就对TiDB的资源进行了扩充,扩容TiDB Server 、TiKV Server。

但扩容是无法快速解决问题的,这个是TiDB后期可以考虑优化的事情,不像MySQL,我可以快速扩容从节点,来提升读性能这样;TiDB需要均衡好数据后,才能真正有性能提升。这点确实让人头疼~


【扩容详细】:

3.3号13点左右开始进行扩容

扩容tikv 机器:6台 

扩容tidb机器:4台+ 

目前均衡:

    leader均衡    03-04 08:40 完成

    region均衡:03-10 10:00 完成 


【监控情况】:

leader均衡很快,region均衡的时间比较长


4、参数调优

    问题当天,官方就高优支持我们进行故障的处理与调优,给了一些调优的参数。这里要重点表扬~官方服务实在太好!


4.1、参数调优及说明

【调优参数】:

server_configs:

    tikv:

 raftdb.defaultcf.force-consistency-checks: false
 raftstore.apply-max-batch-size: 256
 raftstore.apply-pool-size: 10

  raftstore.hibernate-regions: true
  raftstore.messages-per-tick: 1024
  raftstore.perf-level: 5
  raftstore.raft-max-inflight-msgs: 2048
  raftstore.store-max-batch-size: 256
  raftstore.store-pool-size: 8
  raftstore.sync-log: false
  readpool.coprocessor.use-unified-pool: true
  readpool.storage.use-unified-pool: true
  readpool.unified.max-thread-count: 12

rocksdb.defaultcf.force-consistency-checks: false
  rocksdb.lockcf.force-consistency-checks: false
  rocksdb.raftcf.force-consistency-checks: false
  rocksdb.writecf.force-consistency-checks: false
  server.grpc-concurrency: 8
  storage.block-cache.capacity: 148G
  storage.scheduler-worker-pool-size: 8

【参数详细说明】:


4.2、修改参数效果

    因为调整参数需要reload重启tikv实例,这样影响比较大,如果出现性能不升反降,再调整回去,影响太大,所以我们先在其他集群上进行测试,发现确实提升明显,多数SQL执行时间都下降至少50%+

于是我们在2021-03-16 20:53 开始调整参数,reload tikv,  21:06 完成,效果如下:

【TiDB监控】:


【SQL执行时间对比】:

【具体数据】:


5、数据清理

   后期我们与业务沟通,之前迁移至TiDB为整个集群迁移的,部分表不用,且占了很多的空间,于是我们也进行了数据清理,即不需要保留的数据及时清理掉,减轻集群的压力。

清理前:23.7T

清理后:14.2T

磁盘降低:9.5T,占比:40.08%


【清理数据后的SQL执行时间效果】:降低明显












6、资源回收

     优化后的集群性能很好,但是TiKV机器比较多了,出于资源的考虑,我们回收了3台tikv server,回收后的性能也能很好的满足业务。

【下线后的SQL执行时间】:



【磁盘信息】:

 总共     已用    占比

49.9T  14.6T    29.25%


7、总结

7.1、优化措施进度总结

    此次事故,业务损失了几十万,算是一个深刻的教训了,但是总结起来还是受益匪浅,希望给大家也看下。

反思:

  • 重要的业务要定期查看集群状态、性能

  • 已经反馈给开发的问题,要跟进优化落地,否则后面还是会发生问题

  • 要多角度优化,不仅DBA集群方面优化,业务也要在业务侧进行优化

  • 总结的参数,后续默认成为了新集群的默认参数,老集群调优也经常用到,多个集群SQL执行时间的优化效果都超级好,大家可以按需测试

  • DBA这边暂时还没做SQL执行时间的报警,后面会补充上

  • TiDB如何快速通过扩容的方式提升性能,这个希望TiDB能做出来

  • 表健康度影响SQL执行计划,过低的表要定期analyze


【最后SQL执行时间】








文章转载自雷雷DBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论