gpt4 book ai didi

cluster-computing - 在集群中的服务器之间协调单个周期性任务的执行

转载 作者:行者123 更新时间:2023-12-04 08:58:02 33 4
gpt4 key购买 nike

(我会尽量保持这个问题的简短,同时清楚地描述情况。如果有任何遗漏,请发表评论。)

情况

  • 我在同一个数据中心运行一个包含三台服务器的集群
  • 为了简化部署,每台服务器运行完全相同的应用程序代码

  • 目标
  • 由单个服务器每分钟运行一个任务(称为任务 X)。

  • 在这些条件下
  • 集群保持分布式和高可用性
  • 每个服务器都保持运行相同的应用程序代码。换句话说,不存在“将代码 A 部署到主服务器并将代码 B 部署到所有辅助服务器。
  • ”这样的事情。

    我不想区分服务器类型的原因是为了保持高可用性(避免在所谓的主服务器宕机时出现问题)、冗余(分配负载),并避免创建一个复杂的部署过程,我需要在其中部署不同的应用到不同类型的服务器。

    为什么这如此困难?如果我添加每 5 分钟执行一次此任务的代码,那么每个服务器都会执行它,因为每个服务器运行相同的应用程序代码。因此,他们需要能够协调哪个服务器将在每个滴答期间运行相同。

    我能够使用分布式消息传递机制,例如 Apache KafkaRedis .如果使用这样的机制来协调这样的任务,这样的“算法”将如何工作?

    我向别人提出了这个问题,他的回答是使用任务队列。然而,这似乎并没有解决问题,因为问题仍然存在:哪个服务器将任务添加到任务队列?如果所有服务器都将任务添加到队列中,则会导致重复条目。此外,哪个服务器将执行队列中的下一个任务?所有这些都需要通过集群内部的协调来决定,而不需要区分不同类型的服务器。

    最佳答案

    听起来您正在寻找分布式锁。 Redis 通过 setnx 出色地做到了这一点.如果您将其与 expire 结合使用然后您可以创建每 N 秒释放一次的全局锁。
    setnx如果键不存在,只会写入值并返回 true。 Redis 操作是原子的,所以只有第一个服务器调用 setnx key 过期后将继续运行任务。

    这是 ruby​​ 中的一个示例:

    # Attempt to get the lock for 'Task X' by setting the current server's hostname
    if redis.setnx("lock:task:x", `hostname`.chomp)
    # Got the lock, now I set it to expire after 5 minutes
    redis.expire("lock:task:x", 60 * 5)
    # This server has the go ahead to execute the task
    execute_task_x
    else
    # Failed to get the lock. Another server is doing the work this time around
    end

    有了这个,您仍然依赖于调用一台服务器 Redis Master除非你利用 redis-sentinel .看看 the redis-sentinel docs有关如何配置自动失败转移的信息。

    关于cluster-computing - 在集群中的服务器之间协调单个周期性任务的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13151912/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com