Шаг 4. Изменение конфигурации

Нужно провести изменения в конфигурации, например добавить сервер, перераспределить роли, или изменить их параметры. Казалось бы, чего же проще – разложить новый файл конфигурации по всем серверам и перезапустить систему. Далее ServerShell все сделает, как на этапе загрузки (шага 3). Можно даже не перезапускать, рассчитывая на то, что ServerShell регулярно отслеживает изменения файловой системы. Однако в таком подходе есть три существенных недостатка:

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

  2. Если какие-то серверы недоступны, то придется откладывать операцию, поскольку иначе возникнет риск существенного и вредного рассогласования отдельных кластеров системы.

  3. Если в файле конфигурации ошибка, то такую конфигурацию применять нельзя. Речь идет как о статических ошибках, так и динамических – не всякое изменение можно применить сразу.

Поэтому существует API по работе с файлами конфигураций. Это API не уровня доменов, это API уровня системы, поэтому возможность его использования имеют только администраторы мастер-домена.

Кейс: администратор в мастер-домене загружает и применяет новый файл конфигурации с изменениями настроек, и по результатам его применения система обретает новое целостное состояние.

Решению этого кейса служит набор ролей, совместно отвечающих за конфигурацию: MIC (Master Infrastructure Configurator) и IC (Site Infrastructure Configurator).

seq cfg uploadДля начала, по аналогии с шагом 1, загружаемый администратором файл конфигурации попадает через WS на MIC. Там он сохраняется и ожидает дальнейших активностей администратора. Администратор проверяет корректность загруженного файла, валидацию проводит та же роль MIC. Затем, если все успешно, администратор применяет файл API-запросом /api/admin/v1/cfg/apply. MIC инициирует сложный процесс синхронизации файла конфигурации на всех сайтах, серверах и нодах. Этот процесс доходит до каждой работающей роли, чтобы та имела возможность применить новые настройки по-горячему.

Применение конфигурации – древовидно разветвляемый процесс.

  1. MIC отправляет команду на синхронизацию файла конфигурации всем сайтам – ролям IC.

  2. IC отправляет команду на синхронизацию конфигурации всем серверам – служебному процессу ServerShell в корневой ноде.

  3. ServerShell вычисляет разницу и применяет изменения, выгружая ненужные и запуская нужные ноды. В том числе возможно изменились названия нод – они формируются автоматически на основании исполняемых в них ролей. Остальным нодам своего сервера он отправляет команду на применение конфигурации, а именно служебному процессу BasedRole в каждой ноде.

  4. BasedRole вычисляет разницу и применяет изменения. Название нод зависит от состава ролей, поэтому измениться состав не мог, следовательно BasedRole отправляет команду на применение новых параметров во все роли, запущенные на текущей рабочей ноде.

  5. Каждая роль самостоятельно анализирует изменения и применяет свои новые параметры запуска – по горячему, либо путем перезагрузки.

Каждый из узлов рассмотренного процесса синхронизации конфигурации отправляет команду всем своим подписчикам, а сам соответственно подписывается на родительский узел. Таким образом ответственность дочернего узла – обнаружить посредством конфигурации родительский узел и осуществить подписку (см.рис.).

config_subscription_scheme_uml

MIC и IC такие же роли, как и остальные, а значит их базовое поведение подчинено своим локальным ServerShell и BasedRole. А целевая функциональность держит их на вершине иерархии процесса управления конфигурацией. (см.рис.выше). Это две точки зрения на связь конфигурационных сервисов, два уровня связи: С точки зрения процесса подписки и обновления конфигурации главный MIC, и далее MIC → IC → ServerShell → BasedRole, а с точки зрения запуска системы главный ServerShell, и далее ServerShell → BasedRole → Role, в том числе MIC и IC. Адекватно нарисовать плоскую компактную диаграмму, отражающую одновременно обе точки зрения, нетривиально, но абстрактно представить эту модель более чем реально:

ServerShell запускает BasedRole, BasedRole запускает среди прочих ролей MIC, тот начинает работать и обеспечивать функционал управления конфигурацией. Аналогично IC на своем сервере. Если вдруг конфигурация меняется, MIC оповещает все доступные IC, IC оповещает все доступные ServerShell на сайте (в том числе и свой собственный), ServerShell управляет рабочими нодами и оповещает BasedRole (в том числе на ноде MIC). После этого роль MIC может изменить свое расположение и поведение. Пока IC не запущен как роль, все ServerShell осуществляют неудачные попытки подключиться к нему исходя из текущей конфигурации. Эти попытки асинхронны и не мешают осуществить целевой процесс запуска рабочих нод и ролей в них.

mic_ic_servershell_sample

MIC – особенная роль, она должна присутствовать ровно на одном сайте. Сайт, на котором располагается MIC, называется мастер-сайтом. И с другой стороны, если сайт является мастер-сайтом, то на нём должен присутствовать MIC. Другие сайты называются рабочими сайтами. При этом если сайт (неважно рабочий или мастер) обладает всем составом необходимых ролей, то он называется коммуникационным. Таким образом коммуникационный сайт – это признак продуктовой полнофункциональности сайта. Любой рабочий сайт обязан быть коммуникационным.

На диаграмме приведена иерархия подписки на изменения конфигурации на примере двоично-разветвляемого дерева (два сайта, по два сервера, по две роли):

cfg_roles

В нижнем слое компонентов диаграммы располагаются BasedRole, но мы помним, что те в свою очередь управляют рабочими нодами с функциональными ролями. Так, один из приведенных на диаграмме BasedRole управляет запуском ноды с ролью MIC, а еще два управляют запуском нод с ролями IC. Следует тщательно обдумать эту модель, прежде чем переходить дальше.

Отключенные серверы и сайты

Если какой либо узел системы в момент применения конфигурации окажется недоступным, то это не помешает применить конфигурацию. Все доступные узлы переключатся на новую конфигурацию, а недоступные в момент подключения к кластеру подключатся на основе предыдущего файла конфигурации к родительскому узлу (в частности, подключенный сайт – к MIC из предыдущей конфигурации, подключенный сервер – к IC из предыдущей конфигурации). Родительский узел сразу же отдаст новую конфигурацию и вновь подключенный узел получит новые настройки себя самого и остальной инфраструктуры. То же самое произойдет, если к системе подключить новый сайт или сервер.

Первая конфигурация

А какая же конфигурация изначально? Ведь дерево подписки на изменение конфигурации должно существовать и быть активным.

Инсталлируя программу на каждый новый сервер, в параметрах указывается не что иное как адрес сервера, на котором роль MIC (в виде имени ноды). Таким образом, первым запускается сервер с ролью MIC, чтобы дальнейшие подключать к нему. На нем автоматически возникает базовая конфигурация из трех ролей: MIC, DC, WS. Каждый новый инсталлированный сервер выступает аналогом IC в том смысле, что является прямым подписчиком MIC на изменения конфигурации. И только в момент, когда обнаружит в конфигурации себя, он запустится полноценно и переориентируется на IC текущего сайта.

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

О сложностях при изменении конфигурации

Существуют некоторые незначительные сложности с переконфигурированием, отчего не любую конфигурацию можно применить к текущей. Например,

  • Невозможно в один ход переместить MIC на другой сервер. Однако это можно сделать в два хода в пределах мастер-сайта.

  • Существуют сложности с перемещением MIC на другой сайт.

  • Существуют сложности со сменой IP-адресов серверов.

  • Существует ряд ролей, которые по аналогии с MIC можно перемещать на другие серверы только в два хода, чтобы не потерять данные.

  • Существуют сложности со сменой имен сайтов.

  • Существуют сложности со сменой идентификаторов ролей.

  • Существуют сложности с перемещением ролей, к которым явно привязываются сущности доменов.

  • Невозможно изменить название мастер-домена.

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

Чтобы не сталкиваться с этими сложностями следует продумать перед началом внедрения будущее состояние системы. Рекомендуется оформить паспорт проекта, где утвердить мастер-домен, мастер-сайт, имена всех сайтов, зафиксировать диапазон IP-адресов для серверов будущей системы и смоделировать распределение ролей по серверам. Расширять систему можно легко, сужать сложнее, перемещать и изменять некоторые параметры конфигурации не просто сложно, а порой невозможно без полного переподсоединения по одному серверу. Однако даже в этом случае сущности в доменах сохранятся и смогут быть подгружены из DomainDB.

Table 1. Используемые термины
Термин Определение

MIC

!

IC

!

Мастер-сайт

!

Рабочий сайт

!

Коммуникационный сайт

!

Вопросы для повторения
  1. Что не позволяет производить изменение конфигурации непосредственно на серверах?

  2. В каких доменах возможно управление конфигурацией?

  3. Какая роль, ответственна за управление конфигурациями?

  4. Какие роли участвуют в применении конфигурации?

  5. Какие сервисы/роли присутствуют и в дереве управления конфигурацией и в дереве запуска системы?

  6. При каком условии отключенные сервера смогут подключиться к системе с новой конфигурацией?

  7. В какой момент возникает первая (базовая) конфигурация?