Статьи

Автоматическая загрузка кластера с полным циклом с помощью Percona XtraDB Cluster

Первоначально Написано Джеем Янссеном

Одной из новых функций в кластере Percona XtraDB (PXC) в последних выпусках стало включение возможности для существующего кластера автоматически загружаться после события, когда все узлы отключены. Предположим, вы теряете мощность на всех узлах одновременно или что-то еще происходит с вашим кластером. Традиционно это означало перезапуск кластера вручную, но не больше.

Как это работает

Учитывая вышеописанную ситуацию, когда все узлы могут перезапускаться и видеть друг друга так, что они все согласны с тем, что было в состоянии, и что все узлы вернулись, тогда узлы примут решение, что для них безопасно восстановить ПЕРВИЧНОЕ состояние в целом.

Это требует:

  • Все узлы вышли из строя — то есть; kill -9, паника ядра, сбой питания сервера или подобное событие
  • Все узлы из последнего компонента PRIMARY перезапускаются и могут снова видеть друг друга.

демонстрация

Предположим, у меня есть кластер из 3 узлов в стабильном состоянии. Затем я убиваю все узлы одновременно (имитируя сбой питания или подобное событие):

[root@node1 ~]# killall -9 mysqld
[root@node2 ~]# killall -9 mysqld
[root@node3 ~]# killall -9 mysqld

Я вижу, что каждый узел поддерживает файл состояния в своем каталоге данных с именем ‘gvwstate.dat’. Это содержит последний известный вид кластера:

[root@node1 ~]# cat /var/lib/mysql/gvwstate.dat
my_uuid: 78caedfe-75a5-11e4-ac69-fb694ee06530
#vwbeg
view_id: 3 78caedfe-75a5-11e4-ac69-fb694ee06530 9
bootstrap: 0
member: 78caedfe-75a5-11e4-ac69-fb694ee06530 0
member: 87da2387-75a5-11e4-900f-ba49ecdce584 0
member: 8a25acd8-75a5-11e4-9e22-97412a1263ac 0
#vwend

Этот файл не будет существовать на узле, если он был корректно завершен, только если mysqld был нечисто прерван. Этот файл должен существовать и быть одинаковым на всех узлах для автоматического восстановления для работы.

Теперь я могу перезапустить все 3 узла более или менее одновременно. Обратите внимание, что ни один из этих узлов не является начальной загрузкой, и для всех узлов в wsrep_cluster_address задан правильный список узлов в кластере:

[root@node1 ~]# service mysql start
[root@node2 ~]# service mysql start
[root@node3 ~]# service mysql start

Я действительно вижу, что все они успешно запускаются и переходят в исходное состояние:

[root@node1 ~]# mysql -e "show global status like 'wsrep_cluster%'"
+--------------------------+--------------------------------------+
| Variable_name            | Value                                |
+--------------------------+--------------------------------------+
| wsrep_cluster_conf_id    | 0                                    |
| wsrep_cluster_size       | 3                                    |
| wsrep_cluster_state_uuid | 1ba6f69a-759b-11e4-89ba-62a713a26cd1 |
| wsrep_cluster_status     | Primary                              |
+--------------------------+--------------------------------------+
[root@node2 ~]# mysql -e "show global status like 'wsrep_cluster%'"
+--------------------------+--------------------------------------+
| Variable_name            | Value                                |
+--------------------------+--------------------------------------+
| wsrep_cluster_conf_id    | 0                                    |
| wsrep_cluster_size       | 3                                    |
| wsrep_cluster_state_uuid | 1ba6f69a-759b-11e4-89ba-62a713a26cd1 |
| wsrep_cluster_status     | Primary                              |
+--------------------------+--------------------------------------+
[root@node3 ~]# mysql -e "show global status like 'wsrep_cluster%'"
+--------------------------+--------------------------------------+
| Variable_name            | Value                                |
+--------------------------+--------------------------------------+
| wsrep_cluster_conf_id    | 0                                    |
| wsrep_cluster_size       | 3                                    |
| wsrep_cluster_state_uuid | 1ba6f69a-759b-11e4-89ba-62a713a26cd1 |
| wsrep_cluster_status     | Primary                              |
+--------------------------+--------------------------------------+

Проверяя логи, я вижу, что эта функция работает:

2014-11-26 19:59:36 1809 [Note] WSREP: promote to primary component
2014-11-26 19:59:36 1809 [Note] WSREP: view(view_id(PRIM,78caedfe,13) memb {
78caedfe,0
87da2387,0
8a25acd8,0
} joined {
} left {
} partitioned {
})
2014-11-26 19:59:36 1809 [Note] WSREP: save pc into disk
2014-11-26 19:59:36 1809 [Note] WSREP: clear restored view

Изменение этого поведения

Эта функция включена по умолчанию, но вы можете отключить ее с помощью параметра pc.recovery в wsrep_provider_options

Эта функция помогает охватить крайний случай, когда ручная начальная загрузка была необходима в прошлом для правильного восстановления. Эта функция была добавлена ​​в Percona XtraDB Cluster версии 5.6.19 , но была нарушена из-за этой ошибки . Это было исправлено в PXC 5.6.21