数据同步中的动态调度
这是学习笔记的第 1817篇文章
在完成了前面三个系列的优化之后,一个明确的问题摆在我面前,如果实现动态调度。
动态调度的需求是怎样的呢?比如现在10:00,我需要10:30同步一次数据,那么10:30的时候同步时,我需要考虑现在的主从延迟,如果延迟较大,我需要把延迟的时间减掉,所以10:30开始同步的时间可能是10:28,可能是10:29,但是很可能不是10:30,另外一点就是假设是从10:29:00开始,那再下次调度的时候,起始时间怎么算,应该是10:29:01开始,下一次的调度程序怎么知道这个信息呢。
此外,如果现在的调度时间是30分钟,如果要调整为20分钟,怎么灵活支持。
这些问题摆在我面前,我发现暂时没有太好的解决方式。所以先做了手工调度,在这个过程中一点一点的琢磨怎么做到自动化的方式。
手工操作的一个好处就是通过大量的手工操作,你知道要改进什么,同时通过这些手工的不便捷性,告诉你什么才是正确的处理方式。
手工同步一共做了13次,每次都需要认真记录下时间点,如果一个时间点记录错误,所有的数据都就乱了。
第1次手工同步
sh a.sh '2018-11-29 10:40:01' '2018-11-29 11:30:00'|tee check2.log
第2次手工同步
sh a.sh '2018-11-29 11:30:01' '2018-11-29 11:40:00'|tee check3.log
第3次手工同步
sh a.sh '2018-11-29 11:40:01' '2018-11-29 13:35:00'|tee check4.log
第4次手工同步
sh a.sh '2018-11-29 13:35:01' '2018-11-29 13:50:00'|tee check4.log
第5次手工同步
sh b.sh
sh a.sh '2018-11-29 13:50:01' '2018-11-29 14:15:00'|tee check4.log
第6次手工同步
sh b.sh
sh a.sh '2018-11-29 14:15:01' '2018-11-29 14:25:00'|tee check4.log
第7次手工同步
sh b.sh
sh a.sh '2018-11-29 14:25:01' '2018-11-29 14:40:00'|tee check4.log
第8次手工同步
sh b.sh
sh a.sh '2018-11-29 14:55:01' '2018-11-29 15:15:00'|tee check4.log
第9次手工同步
sh b.sh
sh a.sh '2018-11-29 15:15:01' '2018-11-29 15:35:00'|tee check4.log
第10次手工同步
sh b.sh
sh a.sh '2018-11-29 15:35:01' '2018-11-29 16:00:00'|tee check4.log
第11次手工同步
sh b.sh
sh a.sh '2018-11-29 16:00:01' '2018-11-29 16:40:00'|tee check4.log
第12次手工同步
sh b.sh
sh a.sh '2018-11-29 16:40:01' '2018-11-29 17:25:00'|tee check4.log
第13次手工同步
sh b.sh
sh a.sh '2018-11-29 17:25:01' '2018-11-29 17:50:00'|tee check4.log
对我来说,最有压力的事情就是,如果这个事情今天搞不定,我就需要熬夜手工跑任务了。所以这种压力也是无形的动力。
最后写了一个版本的脚本,通过反复测试,达到了预期的效果。
部分代码如下所示:
slave_delay=`/usr/local/mysql/bin/mysql -udba_admin -pxxxx -h127.0.0.1 -P4306
-e "show slave statusG"|grep "Seconds_Behind_Master"|awk '{print $2}'`
echo "MySQL Slave delay: "$slave_delay
start_time_str=`cat /tmp/end_time`
start_time_int=`date -d "$start_time_str" +%s`
start_time_new_int=`expr ${start_time_int} + 1`
echo $start_time_new_int
start_time_new_str=`date -d @${start_time_new_int} +"%Y-%m-%d %H:%M:%S"`
echo $start_time_new_str
buffer_seconds=60
diff_seconds=`expr ${slave_delay} + ${buffer_seconds}`
end_time=`date -d "-${diff_seconds} seconds" +'%Y-%m-%d %H:%M:%S' `
echo $end_time
sh /root/a.sh "$start_time_new_str" "${end_time}" >> /root/log/data_sync_to_infobright.log
echo "end of process....." `date` >> /root/log/data_sync_to_infobright.log
脚本的思路是,数据同步需要两个参数,起始时间和截止时间,起始时间是通过上一次脚本执行生成的一个时间戳文件来得到的,即/tmp/end_time
截止时间是通过获得当前时间,然后计算延迟时间,两者相减,在这个基础上,设置一个缓冲时间(现在是设置了一分钟,预防其他异常情况),这样一来 当前时间 - 延迟时间 -缓冲时间,就得到了截止时间。
在这个基础上去抽取数据,如果计算得到的截止时间比起始时间早,整个抽取的逻辑就类似于 where 1>2,是抽不出数据的。
白天的时候,业务使用频率较高,可以把刷新频率设置的快一些,比如10分钟,而晚上的时候可以设置的慢一些,比如半个小时或者1个小时。
总之,满足了需求就是好的方案。
- 通常Java开发人员如何进行数据排序?
- 消息服务框架使用案例之--大文件上传(断点续传)功能
- Java中三种Set类型用法、性能大比拼
- Android基础总结(5)——数据存储,持久化技术
- 如何突破Windows环境限制打开“命令提示符”
- 【Spark研究】Spark之工作原理
- Java中泛型使用的必要性
- “一切都是消息”--MSF(消息服务框架)之【发布-订阅】模式
- Android基础总结(4)——广播接收器
- “一切都是消息”--MSF(消息服务框架)之【请求-响应】模式(点对点)
- “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春
- 解决服务器SID引起虚拟机不能加入AD域用户,无法远程登录的问题
- 【Python环境】如何使用 Docker 快速配置数据科学开发环境?
- Java中UUID的2种创建方法——有代码实例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 同时打乱数据集和标签的几种方式
- Hive中的数据类型以及案例实操
- pytorch和tensorflow的爱恨情仇之定义可训练的参数
- Hive中库和表的常见操作
- 宝石与石头
- 给你的MyBatis-Plus装上批量插入的翅膀
- pytorch和tensorflow的爱恨情仇之参数初始化
- scp命令
- osgEarth使用笔记4——加载矢量数据
- Pots(POJ - 3414)【BFS 寻找最短路+路径输出】
- Vue路由Hash模式分析
- Flutter基础widgets教程-CupertinoButton篇
- 利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料)
- 组合模式
- Js中数组空位问题