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.
