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

DolphinScheduler 调度变慢?试试这些数据库性能优化策略

海豚调度 2025-06-24
56

点击蓝字,关注我们


1

问题背景


查询任务实例列表等接口时,有时会出现响应慢的情况,超过20秒才返回结果。


2

问题诊断

(1)mysql开启慢日志

/etc/mysql.cnf添加如下配置参数

slow_query_log = ON 
slow_query_log_file = data/log/mysql/mysql-slow.log 
long_query_time = 2

(2)慢日志分析

日志中以下几类sql超时频率较高:

select * from t_ds_process_instance 
where 1=1 and state in ( 0 , 1 , 2 , 4 ) and process_definition_id=71 
and (schedule_time >= '2022-07-20 00:00:00' and schedule_time <= '2022-07-20 23:59:59.999' 
or start_time >= '2022-07-20 00:00:00' and start_time <= '2022-07-20 23:59:59.999') 
order by start_time desc limit 1;

select instance.*,process.name as process_instance_name from t_ds_task_instance instance 
left join t_ds_process_definition define on instance.process_definition_id = define.id 
left join t_ds_process_instance process on process.id=instance.process_instance_id 
where define.project_id = 6 order by instance.start_time desc LIMIT 0,10;

主要涉及t_ds_process_instance
t_ds_task_instance
两张表。

通过explain analyze
命令分析,可以发现第一类sql使用start_time_index
这个索引查询的过程中耗时较多,start_time_index
区分度较差,需要有更好区分度的索引来提升查询速度;

-> Limit: 1 row(s) (cost=0.20 rows=0) (actual time=103.391..103.391 rows=1 loops=1) 
    -> Filter: ((t_ds_process_instance.process_definition_id = 18) and (((t_ds_process_instance.schedule_time >= TIMESTAMP'2022-07-18 00:00:00') and (t_ds_process_instance.schedule_time <= TIMESTAMP'2022-07-18 23:59:59.999')) or ((t_ds_process_instance.start_time >= TIMESTAMP'2022-07-18 00:00:00') and (t_ds_process_instance.start_time <= TIMESTAMP'2022-07-18 23:59:59.999')))) (cost=0.20 rows=0) (actual time=103.391..103.391 rows=1 loops=1) 
        -> Index scan on t_ds_process_instance using start_time_index (reverse) (cost=0.20 rows=2) (actual time=0.030..103.165 rows=1239 loops=1)

第二类sql主要耗时在left join阶段,需要更新索引字段

-> Limit: 10 row(s) (actual time=3601.141..3601.147 rows=10 loops=1) 
    -> Sort row IDs: `instance`.start_time DESC, limit input to 10 row(s) per chunk (actual time=3601.140..3601.145 rows=10 loops=1) 
        -> Table scan on <temporary> (cost=0.01..3774.21 rows=301738) (actual time=0.002..190.179 rows=722743 loops=1) 
            -> Temporary table (cost=469419.96..473194.16 rows=301738) (actual time=3332.896..3551.716 rows=722743 loops=1) 
                -> Nested loop left join (cost=439246.15 rows=301738) (actual time=0.051..1431.254 rows=722743 loops=1) 
                    -> Nested loop inner join (cost=107334.40 rows=301738) (actual time=0.045..1239.699 rows=722743 loops=1) 
                        -> Filter: (define.id is not null) (cost=12.40 rows=121) (actual time=0.025..0.162 rows=121 loops=1) 
                            -> Index lookup on define using process_definition_index (project_id=6) (cost=12.40 rows=121) (actual time=0.025..0.110 rows=121 loops=1) 
                        -> Index lookup on instance using task_instance_index (process_definition_id=define.id) (cost=639.65 rows=2494) (actual time=0.006..9.972 rows=5973 loops=121) 
                    -> Single-row index lookup on process using PRIMARY (id=`instance`.process_instance_id) (cost=1.00 rows=1) (actual time=0.000..0.000 rows=1 loops=722743)


3

问题定位


  • mysql配置未优化
    当前使用的mysql配置均为默认配置,对查询影响较大的配置项如:

innodb_buffer_pool_size
(InnoDB使用一个缓冲池来保存索引和原始数据)。

innodb_thread_concurrency
(设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量)

innodb_write_io_threads & innodb_read_io_threads
(innodb使用后台线程处理数据页上的读写 I/O请求)
需要调整以上参数,提高mysql性能。

  • DolphinScheduler索引未优化
    当前慢查询报出的SQL的索引需要优化。

  • DolphinScheduler单表数据较大
    当前慢查询涉及的SQL表(t_ds_task_instance)较大,数据大小超过4G,数据条数超过200w,需要切分归档。


4

优化内容

(1)大表归档

  • 创建备份表

根据t_ds_process_instance DDL
建表语句复制表t_ds_process_instance_bak

根据t_ds_task_instance DDL
建表语句复制表 t_ds_task_instance_bak

注:外键行删除

CONSTRAINT foreign_key_instance_id
 FOREIGN KEY (process_instance_id
) REFERENCES t_ds_process_instance
 (id
) ON DELETE CASCADE ON UPDATE RESTRICT

  • 将归档日期以前的数据从两张表中挪至备份表,如2022-01-01 00:00:00
INSERT into t_ds_process_instance_copy select * from t_ds_process_instance WHERE start_time < '2022-01-01 00:00:00';

INSERT into t_ds_task_instance_copy select * from t_ds_task_instance WHERE start_time < '2022-01-01 00:00:00';

  • 比对是否备份成功
select count(*) from t_ds_process_instance_copy;

select count(*) from t_ds_process_instance where start_time < '2022-01-01 00:00:00';

select count(*) from t_ds_task_instance_copy;

select count(*) from t_ds_task_instance where start_time < '2022-01-01 00:00:00';

  • 删除历史数据
DELETE FROM t_ds_process_instance WHERE start_time < '2022-01-01 00:00:00';

DELETE FROM t_ds_task_instance WHERE start_time < '2022-01-01 00:00:00';

(2)参数优化

/etc/my.cnf mysql
配置文件中调整如下参数并重启mysql

innodb_log_buffer_size= 64M

innodb_buffer_pool_size= 20G (根据服务器内存适当调整)如果数据库独占一台机器则设置物理内存的70%

innodb_log_file_size= 1G

innodb_thread_concurrency = 0

join_buffer_size = 64M

sort_buffer_size = 64M

innodb_read_io_threads = 16 (根据服务器CPU适当调整)

innodb_write_io_threads = 16 (根据服务器CPU适当调整)

(3)索引优化

create index state_index on t_ds_process_instance(state, process_definition_id);

create index start_time_process_definition_index on t_ds_task_instance(start_time, process_definition_id);

alter table t_ds_task_instance drop index task_instance_index;

转载自daozi126

原文链接:https://blog.csdn.net/u012938208/article/details/147899920





用户案例



网易邮箱 每日互动 惠生工程  作业帮 
博世智驾 蔚来汽车 长城汽车集度长安汽车
思科网讯食行生鲜联通医疗联想
新网银行唯品富邦消费金融 
自如有赞伊利当贝大数据
珍岛集团传智教育Bigo
YY直播  三合一太美医疗
Cisco Webex兴业证券




迁移实战



Azkaban   Ooize(当贝迁移案例)
Airflow (有赞迁移案例)
Air2phin(迁移工具)
Airflow迁移实践



发版消息




Apache DolphinScheduler 3.2.2版本正式发布!
Apache DolphinScheduler 3.2.1 版本发布:增强功能与安全性的全面升级
Apache DolphinScheduler 3.3.0 Alpha发布,功能增强与性能优化大升级!




加入社区



关注社区的方式有很多:

  • GitHub: https://github.com/apache/dolphinscheduler
  • 官网:https://dolphinscheduler.apache.org/en-us
  • 订阅开发者邮件:dev@dolphinscheduler@apache.org
  • X.com:@DolphinSchedule
  • YouTube:https://www.youtube.com/@apachedolphinscheduler
  • Slack:https://join.slack.com/t/asf-dolphinscheduler/shared_invite/zt-1cmrxsio1-nJHxRJa44jfkrNL_Nsy9Qg

同样地,参与Apache DolphinScheduler 有非常多的参与贡献的方式,主要分为代码方式和非代码方式两种。

📂非代码方式包括:

完善文档、翻译文档;翻译技术性、实践性文章;投稿实践性、原理性文章;成为布道师;社区管理、答疑;会议分享;测试反馈;用户反馈等。

👩‍💻代码方式包括:

查找Bug;编写修复代码;开发新功能;提交代码贡献;参与代码审查等。

贡献第一个PR(文档、代码) 我们也希望是简单的,第一个PR用于熟悉提交的流程和社区协作以及感受社区的友好度。

社区汇总了以下适合新手的问题列表https://github.com/apache/dolphinscheduler/pulls?q=is%3Apr+is%3Aopen+label%3A%22first+time+contributor%22

优先级问题列表https://github.com/apache/dolphinscheduler/pulls?q=is%3Apr+is%3Aopen+label%3Apriority%3Ahigh

如何参与贡献链接https://dolphinscheduler.apache.org/zh-cn/docs/3.2.2/%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97_menu/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E_menu

如果你❤️小海豚,就来为我点亮Star吧!

https://github.com/apache/dolphinscheduler


你的好友秀秀子拍了拍你

并请你帮她点一下“分享”

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

评论