【发布时间】:2012-10-31 05:46:17
【问题描述】:
(我会尽量让这个问题尽可能简短,同时清楚地描述情况。如果有任何遗漏,请评论。)
情况
- 我在同一个数据中心运行一个包含三台服务器的集群
- 为简化部署,每台服务器运行完全相同的应用程序代码
目标
- 由单个服务器每分钟运行一个任务(称为 Task X)。
在这些条件下
- 集群保持分布式且高度可用
- 每台服务器都在运行相同的应用程序代码。换句话说,不存在“将代码 A 部署到 主服务器 并将代码 B 部署到所有 辅助服务器。
我不想区分服务器类型的原因是为了保持高可用性(避免所谓的主服务器宕机时出现问题)、冗余(分配负载)以及避免在我需要的地方创建复杂的部署过程将不同的应用程序部署到不同类型的服务器。
为什么这么难?如果我要添加每 5 分钟执行一次此任务的代码,那么每个服务器都会执行它,因为每个服务器运行相同的应用程序代码。因此,他们需要能够协调在每个滴答期间哪个服务器将运行相同。
我能够使用分布式消息传递机制,例如 Apache Kafka 或 Redis。如果使用这样的机制来协调这样的任务,那么这样的“算法”将如何工作?
我向其他人提出了这个问题,他的回答是使用任务队列。然而,这似乎并没有解决问题,因为问题仍然存在:哪个服务器将任务添加到任务队列?如果所有服务器都将任务添加到队列中,则会导致重复条目。此外,哪个服务器将执行队列中的下一个任务?这一切都需要通过集群内的协调来决定,而不需要区分不同类型的服务器。
【问题讨论】:
-
@Charles,这不是协调问题吗?
-
协调作为一般的事情是非常非常模糊的,并且会成为一个坏标签。现有标签可以很好地分类您的问题。
-
感谢您添加此内容,它很好地描述了我要写的问题:)
-
@Steven,太好了。你用什么语言工作?
-
@Tom,Python/Django 环境,但问题几乎相同。我有几台机器,我希望其中一台执行任务 x,但不是全部,但我不想要主机。我希望一台机器能够退出存在而不会产生任何不良影响(节省负载/冗余等)
标签: cluster-computing distribution high-availability task-queue