[ English | Deutsch | Indonesia | русский | English (United Kingdom) ]

Техническое обслуживание кластера Galera

Плановое обслуживание включает в себя корректное добавление или удаление узлов из кластера без нарушения его работы, а также запуск кластера после корректного отключения всех узлов.

Инстансы MySQL перезапускаются при создании кластера, при добавлении узла, когда служба не запущена или при внесении изменений в файл конфигурации /etc/mysql/my.cnf.

Проверить статус кластера

Сравните вывод следующей команды со следующим выводом. Он должен предоставить вам информацию о состоянии вашего кластера.

# ansible galera_container -m shell -a "mariadb \
-e 'show status like \"%wsrep_cluster_%\";'"
node3_galera_container-3ea2cbd3 | FAILED | rc=1 >>
ERROR 2002 (HY000): Can't connect to local MySQL server
through socket '/var/run/mysqld/mysqld.sock' (2)

node2_galera_container-49a47d25 | FAILED | rc=1 >>
ERROR 2002 (HY000): Can't connect to local MySQL server
through socket '/var/run/mysqld/mysqld.sock' (2)

node4_galera_container-76275635 | success | rc=0 >>
Variable_name             Value
wsrep_cluster_conf_id     7
wsrep_cluster_size        1
wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
wsrep_cluster_status      Primary

В этом примере ответил только один узел.

Грамотное завершение работы службы MariaDB на всех узлах, кроме одного, позволяет оставшемуся рабочему узлу продолжить обработку SQL-запросов. При грамотном завершении работы нескольких узлов выполняйте действия последовательно, чтобы сохранить работу.

Запуск кластера

Gracefully shutting down all nodes destroys the cluster. Starting or restarting a cluster from zero nodes requires creating a new cluster on one of the nodes.

  1. Запустите новый кластер на самом продвинутом узле. Перейдите в каталог playbooks и проверьте значение seqno в файле grastate.dat на всех узлах:

    # ansible galera_container -m shell -a "cat /var/lib/mysql/grastate.dat"
    node2_galera_container-49a47d25 | success | rc=0 >>
    # GALERA saved state version: 2.1
    uuid:    338b06b0-2948-11e4-9d06-bef42f6c52f1
    seqno:   31
    cert_index:
    
    node3_galera_container-3ea2cbd3 | success | rc=0 >>
    # GALERA saved state version: 2.1
    uuid:    338b06b0-2948-11e4-9d06-bef42f6c52f1
    seqno:   31
    cert_index:
    
    node4_galera_container-76275635 | success | rc=0 >>
    # GALERA saved state version: 2.1
    uuid:    338b06b0-2948-11e4-9d06-bef42f6c52f1
    seqno:   31
    cert_index:
    

    В этом примере все узлы в кластере содержат одинаковые положительные значения seqno, поскольку они были синхронизированы непосредственно перед корректным завершением работы. Если все значения seqno равны, любой узел может запустить новый кластер.

    ## for init
    # /etc/init.d/mariadb start --wsrep-new-cluster
    ## for systemd
    # systemctl set-environment _WSREP_NEW_CLUSTER='--wsrep-new-cluster'
    # systemctl start mariadb
    # systemctl set-environment _WSREP_NEW_CLUSTER=''
    

    Please also have a look at Starting the Cluster.

    Это также можно сделать с помощью Ansible, используя модуль shell:

    # ansible galera_container -m shell -a "/etc/init.d/mariadb start --wsrep-new-cluster" --limit galera_container[0]
    

    Эта команда создает кластер, содержащий один узел. Значение wsrep_cluster_size показывает количество узлов в кластере.

    node2_galera_container-49a47d25 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server
    through socket '/var/run/mysqld/mysqld.sock' (111)
    
    node3_galera_container-3ea2cbd3 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server
    through socket '/var/run/mysqld/mysqld.sock' (2)
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     1
    wsrep_cluster_size        1
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
  2. Перезапустите MariaDB на других узлах (замените [0] из предыдущей команды Ansible на [1:]) и убедитесь, что они снова присоединились к кластеру.

    node2_galera_container-49a47d25 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     3
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node3_galera_container-3ea2cbd3 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     3
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     3
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    

Восстановление кластера Galera

Запустите сценарий openstack.osa.galera_server, используя переменную galera_force_bootstrap, чтобы автоматически восстановить узел или все окружение.

  1. Выполните следующую команду Ansible, чтобы отобразить неисправные узлы:

    # openstack-ansible openstack.osa.galera_server -e galera_force_bootstrap=True --tags galera_server-config
    

Вы можете дополнительно определить другой узел bootstrap через переменную galera_server_bootstrap_node, в случае, если текущий узел bootstrap находится в рассинхронизированном/сломанном состоянии. Вы можете проверить, какой узел в данный момент выбран для bootstrap, используя этот ad-hoc:

root@aio1:/opt/openstack-ansible# ansible -m debug -a var="groups['galera_all'][0]" localhost

The cluster comes back online after completion of this command. If this fails, please review restarting the cluster and recovering the primary component in the Galera documentation as they’re invaluable for a full cluster recovery.

Восстановление после отказа одного узла

В случае отказа одного узла остальные узлы сохраняют кворум и продолжают обрабатывать SQL-запросы.

  1. Перейдите в каталог playbooks и выполните следующую команду Ansible, чтобы определить неисправный узел:

    # ansible galera_container -m shell -a "mariadb \
    -e 'show status like \"%wsrep_cluster_%\";'"
    node3_galera_container-3ea2cbd3 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server through
    socket '/var/run/mysqld/mysqld.sock' (111)
    
    node2_galera_container-49a47d25 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     17
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     17
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    

    В этом примере узел 3 вышел из строя.

  2. Перезапустите MariaDB на неисправном узле и убедитесь, что он снова присоединяется к кластеру.

  3. Если MariaDB не запускается, запустите команду mariadbd и выполните дальнейший анализ выходных данных. В крайнем случае, перестройте контейнер для узла.

Восстановление после многоузлового сбоя

Когда все узлы, кроме одного, выходят из строя, оставшийся узел не может достичь кворума и прекращает обработку SQL-запросов. В этой ситуации отказавшие узлы, которые восстанавливаются, не могут присоединиться к кластеру, поскольку он больше не существует.

  1. Выполните следующую команду Ansible, чтобы отобразить неисправные узлы:

    # ansible galera_container -m shell -a "mariadb \
    -e 'show status like \"%wsrep_cluster_%\";'"
    node2_galera_container-49a47d25 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server
    through socket '/var/run/mysqld/mysqld.sock' (111)
    
    node3_galera_container-3ea2cbd3 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server
    through socket '/var/run/mysqld/mysqld.sock' (111)
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     18446744073709551615
    wsrep_cluster_size        1
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      non-Primary
    

    В этом примере отказали узлы 2 и 3. Оставшийся рабочий сервер имеет статус non-Primary, поскольку он не может достичь кворума.

  2. Run the following command to rebootstrap the operational node into the cluster:

    # mariadb -e "SET GLOBAL wsrep_provider_options='pc.bootstrap=yes';"
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     15
    wsrep_cluster_size        1
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node3_galera_container-3ea2cbd3 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server
    through socket '/var/run/mysqld/mysqld.sock' (111)
    
    node2_galera_container-49a47d25 | FAILED | rc=1 >>
    ERROR 2002 (HY000): Can't connect to local MySQL server
    through socket '/var/run/mysqld/mysqld.sock' (111)
    

    Оставшийся рабочий узел становится основным узлом и начинает обработку SQL-запросов.

  3. Перезапустите MariaDB на отказавших узлах и убедитесь, что они снова присоединились к кластеру:

    # ansible galera_container -m shell -a "mariadb \
    -e 'show status like \"%wsrep_cluster_%\";'"
    node3_galera_container-3ea2cbd3 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     17
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node2_galera_container-49a47d25 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     17
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     17
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
  4. Если MariaDB не запускается на каком-либо из отказавших узлов, запустите команду mariadbd и выполните дальнейший анализ выходных данных. В крайнем случае пересоздайте контейнер для узла.

Восстановление после полного сбоя окружения

Восстановите из резервной копии, если все узлы в кластере Galera вышли из строя (не выключайте их). Перейдите в каталог playbook и выполните следующую команду, чтобы определить, вышли ли из строя все узлы в кластере:

# ansible galera_container -m shell -a "cat /var/lib/mysql/grastate.dat"
node3_galera_container-3ea2cbd3 | success | rc=0 >>
# GALERA saved state
version: 2.1
uuid:    338b06b0-2948-11e4-9d06-bef42f6c52f1
seqno:   -1
cert_index:

node2_galera_container-49a47d25 | success | rc=0 >>
# GALERA saved state
version: 2.1
uuid:    338b06b0-2948-11e4-9d06-bef42f6c52f1
seqno:   -1
cert_index:

node4_galera_container-76275635 | success | rc=0 >>
# GALERA saved state
version: 2.1
uuid:    338b06b0-2948-11e4-9d06-bef42f6c52f1
seqno:   -1
cert_index:

Все узлы вышли из строя, если mariadbd не запущен ни на одном из узлов и все узлы содержат значение seqno, равное -1.

Если какой-либо один узел имеет положительное значение seqno, то этот узел можно использовать для перезапуска кластера. Однако, поскольку нет гарантии, что каждый узел имеет идентичную копию данных, мы не рекомендуем перезапускать кластер с помощью команды --wsrep-new-cluster на одном узле.

Пересоздать контейнер

Для восстановления после некоторых сбоев требуется пересоздание одного или нескольких контейнеров.

  1. Отключите неисправный узел на балансировщике нагрузки.

    Примечание

    Не полагайтесь на проверки работоспособности балансировщика нагрузки для отключения узла. Если узел не отключен, балансировщик нагрузки отправляет ему SQL-запросы до того, как он снова присоединится к кластеру, и вызывает несогласованность данных.

  2. Удалите контейнер и удалите данные MariaDB, хранящиеся за пределами контейнера:

    # openstack-ansible openstack.osa.containers_lxc_destroy \
    -l node3_galera_container-3ea2cbd3
    

    В этом примере узел 3 вышел из строя.

  3. Запустите сценарий настройки хоста, чтобы перестроить контейнер на узле 3:

    # openstack-ansible oopenstack.osa.containers_lxc_create -l node3 \
    -l node3_galera_container-3ea2cbd3
    

    Плейбук перезапускает все остальные контейнеры на узле.

  4. Запустите инфраструктурный сценарий для настройки контейнера специально на узле 3:

    # openstack-ansible openstack.osa.setup_infrastructure \
    --limit node3_galera_container-3ea2cbd3
    

    Предупреждение

    Новый контейнер запускает кластер Galera с одним узлом, что является опасным состоянием, поскольку среда содержит более одной активной базы данных с потенциально разными данными.

    # ansible galera_container -m shell -a "mariadb \
    -e 'show status like \"%wsrep_cluster_%\";'"
    node3_galera_container-3ea2cbd3 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     1
    wsrep_cluster_size        1
    wsrep_cluster_state_uuid  da078d01-29e5-11e4-a051-03d896dbdb2d
    wsrep_cluster_status      Primary
    
    node2_galera_container-49a47d25 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     4
    wsrep_cluster_size        2
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     4
    wsrep_cluster_size        2
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
  5. Перезапустите MariaDB в новом контейнере и убедитесь, что он снова присоединился к кластеру.

    Примечание

    В более крупных развертываниях запуск демона MariaDB в новом контейнере может занять некоторое время. В это время он будет синхронизировать данные с других серверов MariaDB. Вы можете отслеживать состояние в ходе этого процесса, отслеживая файл журнала journalctl -f -u mariadb.

    В процессе синхронизации появятся строки, начинающиеся с WSREP_SST, а если синхронизация прошла успешно, вы должны увидеть строку WSREP: SST complete, seqno: <NUMBER>.

    # ansible galera_container -m shell -a "mariadb \
    -e 'show status like \"%wsrep_cluster_%\";'"
    node2_galera_container-49a47d25 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     5
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node3_galera_container-3ea2cbd3 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     5
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
    node4_galera_container-76275635 | success | rc=0 >>
    Variable_name             Value
    wsrep_cluster_conf_id     5
    wsrep_cluster_size        3
    wsrep_cluster_state_uuid  338b06b0-2948-11e4-9d06-bef42f6c52f1
    wsrep_cluster_status      Primary
    
  6. Включите ранее отказавший узел на балансировщике нагрузки.