Первоначально Написано Джеем Янссеном
Одной из новых функций в кластере 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