我的团队当前安排工作的方式是通过SQL Server作业代理。其中许多作业依赖于其他内部服务器,而这些内部服务器又需要运行自己的SQL Server作业才能使其数据保持最新。
这已经在每个SQL Server作业的开始时间和长度中创建了依赖项。工作A可能取决于工作B的完成,因此我们将工作B安排在工作A的预定时间之前。所有这一过程都 非常主观 且不可扩展,如我们添加了更多创建更多依赖关系的作业和服务器。
我希望摆脱主观安排这些工作的业务,并希望多米诺骨牌的顺序正确。我想知道调度SQL Server作业的公认做法是什么。人们使用SSIS将工作连在一起吗?是否已在SQL Server作业代理中内置工具来处理此问题?
处理多个具有相互依赖关系的SQL Server作业的调度的可接受方法是什么?
答案 0 :(得分:2)
我之前使用过Control-M来安排不同环境中的多个相互依赖的作业。 Control-M通常使用批处理文件(我记得)来执行SSIS包。
我们有一个复杂的环境并排托管2个数据仓库(1个国际和1个美国本地)。有些工作依赖于其他工作和其他工作等等,但通过使用Control-M,我们可以轻松决定依赖(它有一个非常好的直观的GUI)。我想到的其他工具是Tidal Scheduler。
没有为作业安排设定标准,但我认为可以安全地说,作业时间表完全取决于组织的需求。例如,财务工作可能依赖于库存销售和销售等。但重点是,如果您需要依赖工作,使用Control-M等第三方软件是一个安全的选择。它可以控制不同环境下的工作,让您真正了解公司范围内的工作控制。
答案 1 :(得分:2)
我们也需要管理多个代理作业之间的依赖关系 - 在查看各种第三方工具并因各种原因(主要是与使用第三方软件相关的内部限制)对其进行折扣后,我们决定创建我们的自己的解决方案。
该解决方案以配置数据库为中心,该数据库包含有关需要运行的进程(作业)以及它们如何分组(批处理)的详细信息,以及进程之间的依赖关系。
使用的配置表摘要:
批处理 - 一组相关进程的高级定义,包括元数据,如最大并发进程和当前批处理实例等。 进程 - 与进程(作业)相关的元数据,例如名称,最长等待时间,最早运行时间,状态(启用/禁用),批处理(进程所属的批处理),处理作业名称等。 批处理实例 - 给定批处理的活动实例 流程实例 - 给定批次的活动的活动实例 流程依赖 - 依赖矩阵 批处理实例状态 - 查找批处理实例状态 流程实例状态 - 流程实例状态的循环
每个批次都有2个控制作业 - START BATCH和UPDATE BATCH。第一个处理启动属于它的所有进程,第二个处理是在任何给定批处理中运行的最后一个进程,并处理更新结果状态。
每个进程都有一个与之关联的代理作业,由START BATCH作业执行 - 进程具有上限并发(在批处理配置中定义),因此进程一次最多启动x,然后启动BATCH在开始下一个过程之前等待空闲插槽可用。
流程代理作业步骤调用模板化的SSIS包,该包处理实际的ETL工作,并决定流程是否需要运行并且必须等待依赖性等。
我们目前正在寻求转向Service Broker解决方案,以实现更大的灵活性和控制力。
无论如何,这里的细节可能太多而且还不够,所以可以根据要求提供VS2010项目。
答案 2 :(得分:0)
我不确定这会有多大帮助,但我们最终创建了一个用于安排的电子邮件解决方案。
我们建立了一个访问交换邮箱的电子邮件阅读器。当工作完成后,他们会向邮件阅读器发送电子邮件以开始另一项工作。另一个不错的部分是,大多数应用程序都内置了电子邮件通知,因此自定义编程的方式确实不多。
我们实际上只是首先构建它来处理来自许多其他合作伙伴的数据文件。给他们一个电子邮件地址要容易得多,而不是用ftp网站设置等等。
邮件阅读器应用程序现在已经发展到包括基本过滤,时间安排,使用信号量以防止并发作业等。它真的很棒。