2016-08-22 2 views
0

У меня есть прецедент, где я должен ssh на 3 разных узла параллельно с использованием функции executorService. У меня есть M хостов и N заданий для каждого хоста, я хочу иметь возможность входа в M хостов параллельно и выполнять N заданий последовательно (для каждого хоста). Я пробовал SSHJ, но похоже, что он не поддерживает параллельный SSH.Параллельный SSH с executorService

В последнее время я пытаюсь с Parallec, похоже, что он собирает все задачи и выполняет параллельно на основе значения параллелизма в config.

Любые жизнеспособные подходы/библиотеки?

+0

Вы пробовали АОН (http://www.jcraft.com/jsch/)? –

ответ

0

Это, по-видимому, типичная проблема с рабочим потоком/оркестровкой, обычно встречающаяся при управлении кластером хостов.

С помощью Parallec вы можете сохранять ответы/состояния задач на карте хэша во время обработчика onCompleted() и вести опрос хэш-карты. Всякий раз, когда вы собираете как минимум N заданий, завершаете текущий этап, вы можете запустить еще одну параллельную задачу для их запуска в следующем раунде.

Скажем, у вас 1000 хостов H1 ... H1000 для запуска 5 сценариев оболочки S1 ... S5 последовательно в 5 этапов.

Вы можете создать параллельную карту хэша для хранения текущего состояния для каждого хоста. Каждый сценарий/этап будет иметь [NOT_RUN | RUNNING | COMPLETED_SUCCESS (COMPLETED_ERROR)]. Вы также можете сохранить для каждого хоста в настоящее время, какая параллельная задача отвечает за его запуск.

Вы запускаете все 1000 хостов для запуска сценариев 1 в качестве первой параллельной задачи. Перед выполнением вы устанавливаете каждый элемент в хэш-карте, как в < #, RUNNING> state. Необходимо выполнить задачу asynchronously, чтобы она не блокировала текущий поток. В обработчике ответов onCompleted() вы проанализируете результаты и обновляете соответствующую запись в состоянии COMPLETED_X на карте.

Вы можете проводить опрос этой карты с интервалом, когда вы обнаружите, что на завершенном этапе заданы не менее K задач (или последняя группа задач), вы запускаете еще одну параллельную задачу с хостами K, которые завершили чтобы перейти к следующему этапу.

Обратите внимание, что в параллельной задаче каждый хост может работать на разных этапах. Некоторые из них со сценарием 1, а некоторые - со сценарием 4; Это поддерживается различными запросами с разными хостами: http://www.parallec.io/docs/submit-task/#apis-on-variable-replacement-for-heterogeneous-requests

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