Слабое звено
_glav_ — 17.11.2010
Столкнулись давеча с забавным случаем, когда при наличии
равномерной нагрузки на узлы системы, неисправность одного узла
полностью убивает функционирование системы, а не только 1/N части
её.Пусть есть список работ, которые образуют очередь: сперва первая вработа из списка идёт на выполнение, потом вторая, и так далее. Также имеется набор из N узлов, которые могут такие работы выполнять. В реальности узлами были nodes на компьютеоном кластере, а работы - соответственно счётные задачи. Назначение большого количества узлов - чтобы несколько работ выполнялось одновременно, сокращая тем самым общее время работы. При наличии ожидающщей очереди, каждая следующая работа случайным образом назначается одниму из свободных узлов, так до тех пор, пока все узлы не будет заняты работой. В этом случае очередь ждёт, пока какой-то узел не освободится, и, как только это произойдёт, назначает первую ожидающую работу этому освободившемуся узлу. И так далее.
Теперь представим себе, что у нас есть один неисправный узел, который сигнализирует о том, что он свободен, но работу выполнить не может: как только ему назначается работа, он возвращает сообщение об ошибке. Кроме этого предположим, что все остальные узлы у нас в данный момент заняты работой, и имеется ненулевая очередь ожидающих работ.
Что происходит в этом случае? Система видит один свободный узел, и назначает первую работу ему. Узел принимает работу, через пару секунд возвращает сообщение об ошибке, освобождается и снова сигнализирует о готовности. Система опять видит свободный узел, назначает ему следующую работу и всё повторяется. Все остальные узлы в это время продолжают заниматься своими работатми, которые занимают ненулевое время. В итоге, благодаря тому, что система постоянно видит свободный узел, она направляет все работы из очереди на него, и они успешно не выполняются. Если узлов 100, а ожидающих работ 1000, то неисправность одного узла убивает всю тысячу работ.
Как бороться с этим? Можно в содержание работы добавить команду "если произошло сообщение об ошибке, поставить меня обратно в очередь". Это нехорошо, потому что сообщение об ошибке может быть содержательным, и сигнализировать о том, что что-то не так в самой работе. Кроме того, если даже эту ошибку можно идентифицировать как конкретную ошибку узла (а не работы), постановка этой работы обратно в очередь создаст постоянно движущуюся вхолостую очередь с шагом в несколько секунд, что также не есть хорошо. Можно, наоборот, осуществлять проверку на уровне узлов. Так, система может, перед тем как назначить новую работу свободному узлу, проверять работоспособность этого узла. Направляя на него тестовую работу, система может удостовериться, действительно ли он свободен, не обманывает ли. Имхо, это самое правильное решение, но оно требует переделки системы управления, что, возможно, не так просто, и уж точно не решаемо "здесь и сейчас".
Так что правильное проектирование рулит.
А в нашем случае проблема решалась простым выключением компьютера, так что он переставал быть виден системе :)
Куда лучше обратиться, чтобы взять деньги в кредит: сравниваем варианты
Сын подарил отцу "Жигули-копейку" 1978 года выпуска...
Похороны Принцессы Ирины Греческой и Датской. ОБНОВЛЯЕТСЯ
Загадка 4067
Переговоры в Абу-Даби. Мы разве уже где-то проиграли?
О лунной серости
Середина недели
Королева Елизавета поддержала Эндрю, несмотря на фото с Эпштейном.
Завтрак от Танечки

