1. О Cook

Cook - это сервис построения отказоустойчивого кластера на основе Ред Базы Данных. В основе cook лежит кроссплатформенный движок написанный на Python. Узел cook берет на себя всю работу о настройке СУБД для репликации: создание конфигурационных файлов Ред Базы Данных, настройка репликации, остановка и запуск сервера, создание базы данных, перемещение архивов репликации, инициализация новых реплик и так далее.

Конфигурация кластера хранится в распределенной Key-Value базе данных Consul. Также Consul используется в качестве менеджера распределенных блокировок, для принятия решений, требующих согласия нескольких узлов, например инициализация кластера, выбор нового master, управление TTL.

При запуске cook читает локальную конфигурацию, подключается к Consul и проверяет существующую конфигурацию кластера. Если ее нет, переходит в режим инициализации и создает новый кластер и базу данных. Создав или загрузив конфигурацию, cook проверяет возможность перевода репликации в режим master, для свежесозданного кластера - это происходит автоматически, а при подключении к существующему кластеру, возможность перехода в master оценивается на основе текущей позиция данных в локальной БД, сохраненной позиции в конфигурации кластера и позиции данных БД остальных узлов кластера.

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

При невозможности перехода в режим master, наличие другого master-узла в кластере, дает возможность остальным узлам начать работу, как slave-узлы в режиме асинхронной репликации. При этом оценивается позиция данных в локальной БД, если это возможно - скачиваются и применяются недостающие архивы репликации, и узел переходит в режим slave, постоянно получая актуальные архивы с текущего master. master-узлы также используются для инициализации новых slave-узлов.

Если slave-узел замечает, что в кластере больше нет master-узла, то выполняется попытка перевода в режим master, описанная ранее.

Consul выступает не только, как хранилище состояния кластера, но и как инструмент обнаружения сервисов. Узлы анонсируют свое состояние в Consul, и другие сервисы могут узнать, как к ним подключаться, например проксируя пишущие запросы к master-узлу или распределяя читающие запросы к slave-узлам.