Resources proposal

Формат описания ресурса на диске

  • name - имя ресурса в utf8, не может начинаться с символа /. Если начинается с /, то ресурс является файлом для клонирования и name интерпретируется, как путь к файлу.
  • filemode - режим доступа к файл-ресурсу, для не файл-ресурса игнорируется;
  • fileowner - владелец файл-ресурса в формате user:group или uid:gid, для не файл-ресурса игнорируется;
  • timestamp - время редактирования файла, для не файл-ресурса игнорируется;
  • script - путь к исполняемому файлу в utf8 для запуска (остановки, получения свойств) ресурса на узле. Если ресурс является файлом, игнорируется;
  • checksum - контрольная сумма файла. Если ресурс не является файлом, игнорируется.
  • params - параметры для передачи в script, например, имя базы openldap. Для файл-ресурса игнорируется.
  • deps(mode) - набор зависимостей, состоит как минимум из неявной зависимости от script. Если ещё не задан ресурс с name, равным script данного ресурса, он добавляется автоматически при добавлении ресурса name (с флагом auto_remove). То есть ресурс зависит от скрипта, который обеспечивает управление ресурсом.
  • mode - режим (состояние) ресурса, может быть normal|master. Если не указан, то normal. В основном нужно для добавления зависимости ресурсу в состоянии master, например, запускать master только на хосте, которому смогли передать плавающий ip.
  • count_max - максимальное количество клонов ресурса в кластере
  • count_max_host - максимальное количество клонов ресурса на хосте
  • count_max_node - максимальное количество клонов ресурса на узле кластера (лучше не использовать)
  • count_max(mode) - максимальное количество клонов в состоянии mode
  • auto_remove - флаг, определяющий удаление ресурса, если его никто не использует

Формат запущенного ресурса

Дополняет формат статичного ресурса полями:

  • name(number) - изменение name, если ресурс состоит из клонов. number - номер клона
  • mode - режим, в котором запущен ресурс (master|normal)

Типы зависимостей

  • requires condition [condition ...]
  • recommends condition [condition ...]
  • conflicts condition [condition ...]
  • provides condition [condition ...]

Условия (conditions)

Условия задаются списком, разделённым пробелом. Пробелы внутри описания условий должны быть экранированы (кавычки или \).

  • resource_name - ресурс с именем name (может быть файлом), запущенный на этом же хосте
  • resource_name(mode) - ресурс с именем name, запущенный на этом же хосте в режиме mode
  • resource_name(count) - ресурс с именем name, запущенный в кластере в количестве count. Срабатывает на клона с именем name(number).
  • resource_name(mode)(count) - ресурс с именем name, запущенный на этом же хосте в режиме mode и доступный в кластере в количестве count
  • command /path/to/command args - команда, запущенная на этом же хосте, вернувшая exit status 0

Обработка ресурсов

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

  • resA conflicts resB - уже 2 группы.
  • resB conflicts resA - это не новый конфликт.
  • resA requires resC - resC добавляется в ту же группу, что и resA.

Деление и слияние групп

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

Правила слияния и деления групп задаются через conflicts, requires, recommends и provides.