В настоящее время я работаю с настроенным кластером приложением, которое хранит все данные локально для каждого дочернего узла. У нас возникают проблемы с правильным масштабированием, и мы изучаем традиционные конфигурации SAN и кластеров на основе сообщений.
Меня интересует, как правильно настроить доступ к данным для дочерних / рабочих узлов и одного SAN. Будет ли мой управляющий узел ограничивать доступ к данным только для одного дочернего узла за раз, или все дочерние узлы смогут одновременно читать и писать на один и тот же том в SAN с высокой производительностью? Казалось бы, лучший вариант - ограничить доступ к одной машине за раз через управляющий узел, но это ограничивает одновременный доступ к данным от одного дочернего элемента; который сложно масштабировать.
Идея состоит в том, чтобы иметь возможность запускать задание, которое узел-менеджер будет предупреждать о запуске всех дочерних узлов. Каждый узел будет получать часть данных для обработки из SAN.
Я новичок в этой области и буду очень признателен за любые отзывы / ответы.
Спасибо.
[Примечание: это установка сервера на базе Windows. Мы думаем о том, чтобы опробовать Windows Server 2008 HPC специально, но в настоящее время не используем его.]
Наличие рабочих узлов с прямым доступом к SAN и какой-либо кластерной файловой системой в конечном итоге не масштабируется. Вы можете получить до дюжины или пары дюжин узлов, в зависимости от рассматриваемой файловой системы, но в конечном итоге вы достигнете предела и застрянете.
В более типичном сценарии у узлов будет какое-то локальное хранилище, в которое они будут помещать данные, над которыми им нужно работать. Тогда у вас будет f узлов хранения, которые обмениваются данными с рабочими с помощью какой-либо сетевой файловой системы (NFS, CIFS или чего-то более экзотического). Затем рабочие копируют подмножество данных, с которыми им нужно работать, в свое локальное хранилище либо в начале задания, либо по мере необходимости, и записывают свои выходные данные обратно либо в конце задания, либо в процессе его создания.
Вы заметите, что мой ответ очень общий, потому что, ну, такого рода вещи чрезвычайно конкретное приложение. У вас может быть распределенное приложение, которое выполняет очень мало операций ввода-вывода, записывая немного данных в общую файловую систему каждые несколько минут. В этом случае вы можете писать прямо в общую файловую систему со всех ваших узлов и не беспокоиться о производительности. С другой стороны, если узлы производят 10 мегабайт в секунду вывода, вы определенно не захотите (или сможете), чтобы все они одновременно записывали в общую файловую систему.
Настройка кластера HPC чрезвычайно зависит от предметной области, поэтому здесь, безусловно, нет универсального ответа.
Я полагаю, что ответ на этот вопрос зависит от того, как приложение обрабатывает несколько рабочих, пишущих в одно и то же место в одно и то же время. Вы бы не хотели, чтобы 2 воркера одновременно писали в один и тот же файл, и не хотели бы, чтобы один воркер перезаписывал файлы, созданные другим воркером (по крайней мере, я не думаю, что вы бы это сделали).
Я не могу ответить конкретно для вашего приложения, но в мире баз данных мы обычно разрешаем несколько одновременных чтений и один доступ к потоку / доступу / рабочему процессу записи (будь то блокировка на уровне таблицы, на уровне строки или на уровне страницы. )