Назад | Перейти на главную страницу

Puppet: ресурс DRBD не продвигается в Corosync / Pacemaker

Я пытаюсь воссоздать полную настройку кластера с нуля с помощью марионетки. Все до этого момента работает, но теперь кластер не продвигает ресурс DRBD ни на одном из узлов.

Это рабочая конфигурация кластера, которую я пытаюсь воссоздать:

primitive drbd_mysql ocf:linbit:drbd \
    params drbd_resource="r0" \
    op monitor interval="60s" role="Master" \
    op monitor interval="61s" role="Slave"
primitive fs_mysql ocf:heartbeat:Filesystem \
    params device="/dev/drbd/by-res/r0" directory="/var/lib/mysql/" fstype="ext4"
primitive ip_mysql ocf:heartbeat:IPaddr2 \
    params ip="10.0.7.20" cidr_netmask="24" nic="eth0" \
    op monitor interval="120s" timeout="60s"
primitive mysqld ocf:heartbeat:mysql \
    params binary="/usr/bin/mysqld_safe" \
    op start interval="0" timeout="120" \
    op stop interval="0" timeout="120" \
    op monitor interval="10" timeout="30" depth="0"
group mysql fs_mysql ip_mysql mysqld
ms ms_drbd_mysql drbd_mysql \
    meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" target-role="Master"
colocation mysql_on_drbd inf: mysql ms_drbd_mysql:Master
order mysql_after_drbd inf: ms_drbd_mysql:promote mysql:start

Это результат марионеточного рецепта:

primitive drbd_mysql ocf:linbit:drbd \
    op monitor interval=60s role=Master \
    params drbd_resource=r0
primitive fs_mysql Filesystem \
    params device="/dev/drbd/by-res/r0" directory="/var/lib/mysql/" fstype=ext4
primitive ip_mysql IPaddr2 \
    op monitor interval=120s timeout=60s \
    params ip=10.0.7.20 cidr_netmask=24 nic=eth0
primitive mysqld mysql \
    op monitor interval=30 timeout=30 \
    op start interval=0 timout=120 \
    op stop interval=0 timout=120 \
    params binary="/usr/bin/mysqld_safe"
group mysql fs_mysql ip_mysql mysqld
ms ms_drbd_mysql drbd_mysql \
    meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true target-role=Master
order mysql_after_drbd inf: ms_drbd_mysql:promote mysql:start symmetrical=true
colocation mysql_on_drbd inf: ms_drbd_mysql:Master mysql

Единственные отличия, которые я могу заметить, это то, что

Насколько я понимаю, colo не имеет значения, поскольку он просто указывает, что оба ресурса ДОЛЖНЫ работать на одном узле, но не означает, что они должны работать в каком-либо определенном порядке. Вот для чего нужен ресурс заказа.

«Симметричный = истина» просто означает, что mysql должен быть остановлен, прежде чем другой узел сможет быть продвинут в ресурсе ms. Это тоже не должно иметь значения.

Это оставляет нам отсутствующую операцию монитора. Это конфигурация марионетки, которая приводит к такому результату:

cs_primitive { 'drbd_mysql':
    primitive_class => 'ocf',
    provided_by    => 'linbit',
    primitive_type  => 'drbd',
    parameters      => { 'drbd_resource' => 'r0'  },
    promotable      =>  true,
    operations      => {  'monitor' =>  { 'interval'  =>  '60s', 'role' =>  'Master'},
#                         'monitor' =>  { 'interval'  =>  '61s', 'role' =>  'Slave' },
                        }, # end operations
    ms_metadata     =>  { 'master-max'      =>  '1',
                          'master-node-max' =>  '1',
                          'clone-max'       =>  '2',
                          'clone-node-max'  =>  '1',
                          'notify'          =>  'true',
                          'target-role'     =>  'Master',
                        },  # end MS_metadata
  }

Да, в этом конфиге есть является вторая операция монитора, и она закомментирована. Если я не комментирую это, ведомый монитор работает с интервалом 61 с. заменяет мастер op.

(Примечание: Corosync / Pacemaker отклоняет конфигурацию, если оба имеют одинаковое значение для интервала.)

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

Что-то еще не так с конфигурацией, что вы можете заметить?

Оказалось, что ответ был довольно прост, как только я его нашел. Вам нужно предоставить рассматриваемой операции массив значений:

operations      => {  'monitor' =>  
                        [ { 'interval'  =>  '60s', 'role' =>  'Master'},
                          { 'interval'  =>  '61s', 'role' =>  'Slave' },
                        ] 
                   },