0

我是 Zookeeper 的新手,Apache 馆长,需要你的帮助来设计一个程序:

我需要创建一个 java 程序,它将每小时运行一个脚本(基于最终用户提供的 cron 表达式)。
考虑到我有 3 台服务器,我需要确保脚本每小时运行一次而不会出现故障,即使在服务器关闭的情况下(在这种情况下脚本必须在其他服务器上运行)。每小时脚本将仅在一台服务器上运行。
我必须创建一个接口来提供这个 java 程序的输入。
输入将是 (i) 要运行的脚本和 (ii) 计划脚本的 Cron 表达式。

1)请提出一个想法,我该如何设计我的程序来实现这一目标。zookeeper 和 Apache curator 怎么能一样用。
2) 有没有办法在最终用户提供运行的这 3 台服务器上缓存脚本?

可以使用 Apache curator 的 NodeCache 来缓存这 3 台服务器上的脚本吗?您的回复将不胜感激。

4

2 回答 2

0

对于三台服务器,其中一台无论如何都要运行,您需要一种分布式方法。问题是,如果发生故障,您可能无法解决是否运行脚本的难题。

首先,您可以让一台计算机连接到其他计算机并告诉他们不要运行。这称为“压制”方法;但是,当您无法连接到其他计算机时,它会出现很多问题。问题是大多数初级程序员未能真正理解网络环境对他们设计程序的需要所做的改变。请花一点时间阅读分布式计算的典型谬误。

Chron 通过不关心其他计算机上发生的事情来解决这个问题,因此 chron 的设计目标是错误的。

使用三台计算机,您还将拥有三个不同的时钟,具有各自的速度和时间。一个好的分布式解决方案会有一些不直接依赖于每台机器时钟的时间概念。

分布式解决方案(如果它们要容忍故障或故障)必须能够在没有与其他机器可靠通信的情况下运行。有时该组被分成两半,其中一组机器无法与另一组通信。在许多情况下,两个小组都会执行“关键”动作,因为担心另一组没有这样做。在其他情况下,假设另一组执行了“关键”操作,两组可能都不会执行。一个好的解决方案将确保“关键操作”执行一次,即使计算机无法通信。通常这是由“多数”完成的,如果您无法访问至少大多数相关机器,您的组(法定人数)将无法执行关键操作。

查看 Paxos 算法以了解问题;并且,一旦您对问题有了更多的了解,请回顾您选择的技术,以确定考虑到“分布式计算的谬误”,他们正在尝试解决问题的哪些部分。还要意识到一个完美的、100% 正确的解决方案可能是不可能的;因为,运行脚本的预选机器可能会遇到网络故障,然后依次出现电源故障,这样启动的机器只是假设只有网络中断。

于 2014-12-04T14:01:40.063 回答
0

这是一道面试题吧?如果是,请注意,这个答案只会让您中途受益。

最简单的解决方案是让所有三个服务器都运行,并尝试获取锁来执行处理。见http://zookeeper.apache.org/doc/trunk/recipes.html#sc_recipes_Locks

为确保只有一台服务器运行作业,您需要记录最后执行时间。这只是“使用已知键存储值”,您可以在其中一个介绍教程中找到它。

当然,如果这是面试题,面试官会追问诸如“如果脚本中途失败会怎样?”之类的问题。或者“如果计算机没有相同的时间怎么办?” 你不会(轻易地)用 ZooKeeper 解决这些问题。

于 2014-12-04T14:51:56.430 回答