将负载分配到在集群的每个节点上运行的 perl 脚本实例

Posted

技术标签:

【中文标题】将负载分配到在集群的每个节点上运行的 perl 脚本实例【英文标题】:Load distribution to instances of a perl script running on each node of a cluster 【发布时间】:2012-04-01 23:07:54 【问题描述】:

我在集群(每个运行 RHEL)的每个节点/机器(总共 4 个)上安装了一个 perl 脚本(称为 worker)。脚本本身被配置为RedHat Cluster 服务(这意味着只要集群中至少有一个节点启动,RH 集群管理器就会确保该脚本的一个且恰好一个实例正在运行)。

我每天有 X 量的工作要做,每天一次,这个脚本就是这样做的。到目前为止,X 已经足够小,并且只有这个脚本的一个实例就足够了。但是现在负载会增加,并且随着高可用性(即已经使用RHCS 实现),我还需要负载分配。

问题是我该怎么做?

当然,我有办法将工作分成 n 个大小为 X/n 的部分。我想到的选项:

创建一个新的负载分配器,它将工作拆分为 X/n 的作业。以及以下之一:

    在network file system 上创建一个命名管道(已安装并在所有节点上可见),将所有作业发布到管道。让每个节点上的每个工作脚本从管道中读取(原子)并完成工作。或 让每个节点上的每个工作脚本侦听 TCP 套接字,负载分配器以循环(或其他某种算法)方式将作业发送到每个此套接字。

#1 的理论问题是我们观察到 NFS 存在一些令人讨厌的延迟问题。我是跨机器的not even sure if NFS would support IPC via named pipes。

#2 的理论问题是我必须实现一些监视器以确保每个工作人员都在运行和侦听,这对于 Perl 来说是个菜鸟,我不确定是否足够简单。

我个人更喜欢负载分配器创建一个池并从中工作人员,而不是跟踪每个工作人员并推送工作的负载分配器。还有其他选择吗?

我也乐于接受新想法。 :)

谢谢!

-- 编辑--

使用 Perl 5.8.8,确切地说:这是为 x86_64-linux-thread-multi 构建的 perl v5.8.8

【问题讨论】:

【参考方案1】:

如果您想保持简单,请使用数据库来存储作业,然后让每个工作人员锁定表并获取他们需要的工作,然后解锁并让下一个工作人员完成。这不是最具可扩展性的解决方案,因为您会发生锁争用,但只有 4 个节点应该没问题。

但是,如果您开始走这条路,那么看看像 Gearman 这样的专用作业队列系统可能会有意义。

【讨论】:

我希望避免这种情况(DB)..但现在你这么说了,实际上听起来更好..! :) 谢谢。

以上是关于将负载分配到在集群的每个节点上运行的 perl 脚本实例的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch 7.8.1集群搭建

将Worker节点返回到群集后重新分配负载

如何将命令发送到在 perl 的非标准端口上运行的 telnet

在Hadoop集群中,任务分配到每个节点上的传统方法是啥,怎么实现随机分配,均衡分配........

分布式负载均衡算法

分布式负载均衡算法