В процессе решения одной технической задачи родилась идея универсального способа распределения нагрузки на множество машин с теоретически любыми сервисами, доступ к которым возможен по 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 будет очень примитивной, маленькой и глупой, то работать она будет очень быстро и надежно (допустить серьезные ошибки в таком примитивном куске кода довольно сложно).
На самом деле ничто не мешает вам испортить службу управления или то, что имеет к ней доступ.
Что вы думаете? Теги: #Системное администрирование #балансировка нагрузки #отработка отказа #идея
-
Настройте Меню «Отправить»
19 Oct, 24 -
Слово Снова Уязвимо
19 Oct, 24 -
Яндекс Шрифт — Яндекс Санс
19 Oct, 24 -
A-Mobile -> A-Mobile 2010 - Что Это За Х?
19 Oct, 24 -
Язык Программирования Петух
19 Oct, 24 -
Классы Числовых Типов В Rust
19 Oct, 24