Failover заданий в Gearman

Jun 13, 2016 12:42 · 313 words · 2 minute read gearman

Менеджер очередей Gearman по умолчанию хранит список заданий в оперативной памяти — при перезагрузке или сбое питания сервера они будут утеряны. Давайте разберемся как избежать этого!

Для предотвращения потерь заданий при сбоях Gearman может использовать постоянное хранилище, например базу данных MySQL (PostgreSQL или SQLite). Схема работы с постоянным хранилищем довольно проста:

  • при создании задания Gearman сохранит его с уникальным идентификатором в хранилище;
  • после того, как задание будет выполнено worker’ом, Gearman удалит его из хранилища (используя идентификатор);
  • после загрузки сервера Gearman загружает в очередь задания из хранилища, если таковые имеются.

Для использования базы данных MySQL в качестве постоянного хранилища для заданий Gearman необходимо создать отдельную базу данных (или использовать существующую — по вашему желанию) и таблицу следующей структуры:

CREATE TABLE `queue` (
  `unique_key` varchar(64) DEFAULT NULL,
  `function_name` varchar(255) DEFAULT NULL,
  `priority` int(11) DEFAULT NULL,
  `data` longblob,
  `when_to_run` bigint(20) DEFAULT NULL,
  UNIQUE KEY `unique_key` (`unique_key`,`function_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

За правильное определение «уникальности» задания в таблице queue отвечают unique_key (уникальный идентификатор задания) и function_name (название очереди заданий). После создания таблицы необходимо перезапустить сервер Gearman, добавив такие параметры:

gearmand --queue-type=MySQL --mysql-host=localhost --mysql-port=3306 \
         --mysql-user=gearman --mysql-password=<сложный_пароль> \
         --mysql-db=gearman --mysql-table=queue

Записи в таблице queue смотрим следующим запросом:

SELECT * FROM queue LIMIT 5;

И будут выглядеть примерно так:

+--------------------------------------+---------------------+----------+----------+-------------+
| unique_key                           | function_name       | priority | data     | when_to_run |
+--------------------------------------+---------------------+----------+----------+-------------+
| 94b1iobe-1a04-12e4-a3d8-040198067d11 | create_message      |        1 | ["test"] |           0 |
| u2uke04c-1a04-12e4-a3d8-040198067d11 | create_message      |        1 | ["test"] |           0 |
| a6j4ofzq-1a04-12e4-a3d8-040198067d11 | create_message      |        1 | ["test"] |           0 |
| apobi7h5-1a04-12e4-a3d8-040198067d11 | create_message      |        1 | ["test"] |           0 |
| 0hq6yocr-1a04-12e4-a3d8-040198067d11 | create_message      |        1 | ["test"] |           0 |
+--------------------------------------+---------------+----------+----------------+-------------+
5 rows in set (0.00 sec)

При правильной настройке менеджера очередей Gearman количество записей в таблице должно стремиться к нулю — worker’ы должны максимально быстро обрабатывать задания из очереди.

Вот таким простым способом можно организовать failover заданий в сервере очередей Gearman.

tweet Share