Концепция Простого Балансировщика Нагрузки/Отказоустойчивого Ip-Сервиса.

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

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

Если где-то это уже реализовано, прошу не судить строго: навскидку я не нашел, да и времени на долгие поиски сейчас нет. Итак, вкратце: 1. В nsswitch.conf для хостов прописываем нашу библиотеку ПЕРЕД файлами и днс.

Чтобы система просматривала /etc/hosts и DNS только в том случае, если наша библиотека возвращает NSS_STATUS_UNAVAIL. 2. Делаем свою библиотеку всего с одной функцией int gethostbyname_r(.

) (подробнее как ее реализовать смотрите здесь: www.gnu.org/s/hello/manual/libc/Name-Service-Switch.html#Name-Service-Switch ).

Функция проверяет, находится ли запрошенное имя в общей памяти; если да, то он возвращает оттуда IP-адрес и увеличивает счетчик использования этого имени в общей памяти на 1. Если такого имени в общей памяти нет, он возвращает NSS_STATUS_UNAVAIL. 3. Если библиотека вернула NSS_STATUS_UNAVAIL, система продолжает разрешать имя в IP дальше обычным способом (/etc/hosts, DNS).

4. На любом языке, который может открывать многоадресный сокет и работать с общей памятью и именованным сокетом, напишите небольшой сервис, который: 4.1 считывает свой конфиг (начальную конфигурацию) с информацией об услугах, передает его в мультикаст-группу с пометкой «начальная» и помещает в общую память.

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

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

4.3 Слушает определенные команды через именованный сокет, в результате добавляя/удаляя/переставляя что-то из общей памяти и дублируя это в мультикаст-группе.

4.4 Необязательно: когда счетчики в общей памяти достигают определенных значений, хост удаляет ее оттуда и дублирует команду в мультикаст-группу.

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

Так как мы по сути перехватываем стандартную системную функцию gethostbyname(), и по идее ее использует все, что работает по протоколу IP и согласно использовать имя хоста (а не только IP напрямую) - без каких-либо дополнительных изменений в этой схеме.

клиентские приложения будут работать.

Некоторые проблемы могут возникнуть с клиентами, кэширующими разрешенный IP (например, веб-браузерами), однако иногда это даже плюс — сессия не будет разорвана.

Таким образом, мы получаем некий скелет, который можно подстроить под что угодно и легко управлять нагрузкой и доступностью сервисов (и/или распределять нагрузку между ними), просто отправляя команды в именованный сокет. Это можно сделать умными скриптами/системой мониторинга/веб-интерфейсом, тупо 'кошкой' определенного файла с командами в именованный сокет через cron и т.п.

Кроме того, поскольку сама библиотека nss будет очень примитивной, маленькой и глупой, то работать она будет очень быстро и надежно (допустить серьезные ошибки в таком примитивном куске кода довольно сложно).

На самом деле ничто не мешает вам испортить службу управления или то, что имеет к ней доступ.

Что вы думаете? Теги: #Системное администрирование #балансировка нагрузки #отработка отказа #идея

Вместе с данным постом часто просматривают: