简介
出于某些业务上的原因,每隔半年就要从我们的相当多数量的MySQL服务器上导出数据。虽然有salt等批量工具,但是每次导出都比较烦,写脚本、发送到各个机器、执行导出、检查导出结果、查漏补缺等等。因此写了个通用的导出脚本,将需要导出的表名和需要导出的时间段分离出来,作为参数传入。然后用beego搭建了一个简单的任务发布系统。
流程
由于我们执行的任务实时性要求不高,因此客户端直接设置定时任务每隔10分钟执行即可。逻辑也非常简单:
发布任务时:
- 使用者在页面上操作提交;
- 服务端获取相关参数;
- 服务端存入redis。
执行任务时:
- 客户端请求获取任务,服务端从redis中读取并返回任务信息;
- 客户端判断任务是否过期,或者是否正在执行任务;
- 符合条件的才执行任务;
- 推送执行结果给服务端;
- 服务端将结果保存在redis,以便之后查询。
UI界面
作为一个业余的菜鸟前端,简单地使用bootstrap写了两个页面,利用到的jquery组件包括bootstrap-datetimepicker和bootstrap-select,dataTables等。
发布任务界面
左边为一堆checkbox,用于选择要导出的表名,右边的textarea输入数据库名,上面的datetimepicker和select分别是选择时间段和任务完成后的RTX弹窗接受者。
任务结果查询页面
就是使用了可以排序的dataTables来展示页面,稍微美化了下状态,如果未完成的任务用个红色的label来显示状态,这样可以容易地发现没有完成或者执行失败的任务。
客户端脚本
用了python,没什么好说的,获取信息,按照之前说的逻辑执行,导出脚本(shell)是用了at
命令放后台执行,执行结果是在导出脚本里面提交给服务端的。然而偷懒用了requests,之后才发现好多机器都没有装这个模块,早知用urllib2了。
一些备注
- 使用了redigo来写redis相关操作;
- 接口只使用了简单的token验证,时间戳+salt,然后暴露的uri使用了超长的随机名;
- 偷懒,没有写登录认证等功能,而是使用了beego的
ctx.Request.RemoteAddr
获取客户端ip,不是某个ip就直接重定向到404页面。
一些废话
- 这个小项目只用了4小时,从服务端、Web页面到客户端的两个小脚本,也算是敏捷开发了,呵呵;
- 然而起码50%花在了调Web页面上,囧,果然全栈工程师不是这么好当的;
- 过年期间打算分享下如何用beego+echars搭建基于bosun的dashboard;
- 大爱beego了,谢大在微博上说16年年底希望star过万,可惜没有实现,大家可以贡献下star。