RDS最近将会支持数据库的job功能,包括mysql的events和mssql的job. RDS在开放一个服务给用户使用的时候,需要考虑非常的多因素,比如:
- 该服务所占用的资源(内存,cpu等);
- 存在的bug(bug的存在可直接导致用户在使用该服务上出现不当或者错误);
- 潜在的安全风险(服务的开放往往需要开通某些端口,这样增加了RDS被攻击的可能性);
- 与RDS现有架构的融合,比如:rds的架构采用的双机热备(主库和备库同时存在,主库down机后能够迅速切换到备库,所以必须考虑到开放job功能后,对RDS HA的影响,保证在HA切换后job仍能够正常的执行).
所以我们会不断的问自己一些问题,然后自己再去解答它:
(1).主库上建立一个job,备库上会不会也会创建一个job?
答:
- mysql上在主库创建一个events,会传送binglog日志到备库,所以备库上仍会创建一个events;
- mssql的job是创建在mssql系统数据库中的,而RDS的备库采用mssql的mirror架构,也就是说msssql数据库不会被复制到备库,那么在mssql数据库中创建的job也不会创建到备库中;针对mssql中job不会同步到备库的情况,RDS需要有一个同步程序,定时将主库的job信息同步到备库,以保证主备切换后job能够正常执行;
(2)主库上执行的job,备库上会不会在重新执行一遍?
答:
- mysql在主库创建events时候有一个参数为DISABLE ON SALVE,这个参数可用于控制在备库上events是否执行,默认是不执行的,所以用户在备库上的job是不会执行的;更保险一点的做法就是任何备库都关闭掉events的功能;
- mssql由于我们的同步程序会将主库的job同步到备库,所以备库上也会存在job,那么这个job会不会执行喃?答案是不执行,因为mssql的备库处于mount状态(只负责接收运用主库传送过的日志,不提供读写功能),测试发现备库的job会一直执行,但是由于主库不可访问,在job一开始执行就报错.
(3)开启job功能占用的资源消耗有多少?
答:
- mysql上启用events功能开启后,通过show processlist可以看到mysql会启动一个叫event_scheduler进程;
- mssql的开启有些麻烦,首先需要开启windows的sqlagent服务,同时要授予帐号相应的权限:Sqlagentopertorrole,通过windows的任务管理器可以看到启动了一个进程:sqlagent.exe,大约占用了6M的内存;
(4)RDS主备切换后,新主库(原备库)中job如何处理?
答:
- mysql实例在主备切换后,由于原来的备库job是disable掉的,所以需要切换程序需要将备库上的所有job都设置为enable,同时由于之前events的功能被disable掉,现在需要将events功能打开,并且将原主库(新备库)的events功能关闭;
- mssql原来的备库是不可访问,现在切换为主库后,主库可以访问,job能够正常执行;原来的主库变为了备库,不可访问,job会执行失败;
(5)job的备份怎么处理?
答:
- mysql的逻辑备份采用mysqldump,而events默认是不备份的,所以备份程序需要加上events的备份(添加参数-E,Dump events);
- mssql备份需要加上mssql数据库的备份;
(6)可能的bug:
答:
- mysql events在低版本中创建,如果创建超过2038年,执行时间会改为1970-01-01 00:00:00, 在高版本中创建:超过2038年的会报错; Events中执行 ddl的递归操作是不允许的,低版本中会导致mysql crash:
- mssql 暂时没有遇到bug;
通过上面的评估后,RDS数据库将会支持作业功能,预计会在下一个发布版本中与客户相见(预计在8月末发布).