Распределение нагрузки по экземплярам сценария Perl, запущенного на каждом узле кластера. - PullRequest
1 голос
/ 02 апреля 2012

У меня есть Perl-скрипт (назовем его работником), установленный на каждом узле / машине (всего 4) кластера (на каждом запущен RHEL). Сам сценарий настроен как RedHat Cluster (это означает, что диспетчер кластера RH будет гарантировать, что один и ровно один экземпляр этого сценария работает, пока работает хотя бы один узел в кластере).

У меня есть X объем работы, выполняемой каждый день, один раз в день, что делает этот скрипт. До сих пор X был достаточно мал, и для этого было достаточно только одного экземпляра этого скрипта. Но теперь нагрузка будет увеличиваться, и наряду с высокой доступностью (то есть уже реализованной с использованием RHCS ) мне также необходимо распределение нагрузки.

Вопрос в том, как мне это сделать?

Конечно, у меня есть способ разделить работу на n частей размером X / n каждая. Варианты, которые я имел в виду:

Создайте новый распределитель нагрузки, который распределяет работу по заданиям X / N. И одно из следующего:

  1. Создайте именованный канал в сетевой файловой системе (которая смонтирована и видима на всех узлах), отправьте все задания в канал. Сделайте каждый рабочий скрипт на каждом узле прочитанным (атомарным) из канала и сделайте всю работу. OR
  2. Заставьте каждый рабочий сценарий на каждом узле прослушивать сокет TCP, а распределитель нагрузки отправляет задания каждому этому сокету циклически (или каким-либо другим алгоритмом).

Теоретическая проблема с # 1 заключается в том, что мы наблюдали некоторые неприятные задержки с NFS. И я даже не уверен, будет ли NFS поддерживать IPC через именованные каналы на разных машинах.

Теоретическая проблема с # 2 состоит в том, что мне нужно реализовать несколько мониторов, чтобы гарантировать, что каждый работник работает и слушает, что является новичком для Perl, я не уверен, достаточно ли просто.

Я лично предпочитаю распределитель нагрузки, создающий пул и рабочих вытягивающий из него, а не распределитель нагрузки, отслеживающий каждого работника и нажимающий работу для каждого. Есть еще варианты?

Я также открыт для новых идей. :)

Спасибо!

- редактировать -

с использованием Perl 5.8.8, если быть точным: это perl, v5.8.8, собранный для x86_64-linux-thread-multi

1 Ответ

2 голосов
/ 02 апреля 2012

Если вы хотите сохранить простоту, используйте базу данных для хранения заданий, а затем попросите каждого работника заблокировать таблицу и получить необходимые задания, затем разблокировать и позволить следующему работнику сделать свое дело. Это не самое масштабируемое решение, так как у вас будет конфликт блокировки, но с 4 узлами все будет в порядке.

Но если вы начнете идти по этому пути, возможно, имеет смысл взглянуть на выделенную систему очередей заданий, такую ​​как Gearman .

...