mariadb galera — Ошибка при отключении узла ОШИБКА 1047 WSREP еще не подготовил узел для использования приложением

Я установил 2 узла Mariadb Galera (mariadb-galera-10.0.27-linux-x86_64.tar.gz) на 2 сервера CentOs 6.6.

После установки я запускаю node1 с параметром --wsrep-new-cluster, затем запускаю node2 без этого параметра. Работают нормально, данные успешно синхронизируются между 2 узлами.

Но когда я закрываю node1. Node2 все еще работает, но когда я пытаюсь получить доступ к базе данных. Он показывает эту ошибку:

use testdb;
ERROR 1047 (08S01): WSREP has not yet prepared node for application use 

Что происходит в этом случае? Вот моя конфигурация на 2 УЗЛАХ (просто другой IP-адрес)

[galera] 
wsrep_on=ON
wsrep_cluster_name='mysql-cluster'
wsrep_provider='/home/mariadb/mariadb-galera/lib/galera/libgalera_smm.so'
wsrep_provider_options="gcache.size=1G"
wsrep_cluster_address="gcomm://10.211.26.116:4567?

pc.wait_prim=no"
wsrep_sst_method=rsync
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_node_address=10.211.26.117:4567
wsrep_node_name='db2'

person namdt55555    schedule 17.11.2016    source источник


Ответы (2)


КЛАСТЕРЫ С ДВУМЯ УЗЛАМИ

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

Ситуация

У вас есть кластер, состоящий только из двух узлов. Один из узлов некрасиво покидает кластер. То есть вместо завершения работы через init или systemd происходит сбой или потеря сетевого подключения. Оставшийся узел становится нерабочим. Это остается таковым до тех пор, пока какая-либо дополнительная информация не будет предоставлена ​​третьей стороной, например оператором-человеком или другим узлом.

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

Решения

Вам доступны два решения:

  • Вы можете загрузить уцелевший узел, чтобы сформировать новый основной компонент, используя опцию pc.boostrap wsrep Provider. Для этого войдите в клиент базы данных и выполните следующую команду:

SET GLOBAL wsrep_provider_options='pc.bootstrap=YES';

Это загружает уцелевший узел как новый основной компонент. Когда другой узел возвращается в оперативный режим или восстанавливает сетевое соединение с этим узлом, он инициирует передачу состояния и догоняет этот узел.

  • Если вы хотите, чтобы узел продолжал работать, вы можете использовать опцию pc.ignore_sb wsrep Provider. Для этого войдите в клиент базы данных и выполните следующую команду:

SET GLOBAL wsrep_provider_options='pc.ignore_sb=TRUE';

Узел возобновляет обработку обновлений и будет продолжать это делать даже в том случае, если он подозревает ситуацию с разделенным мозгом.

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

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

http://galeracluster.com/documentation-webpages/twonode.html

person scarface_90    schedule 21.06.2017
comment
Я использую SET GLOBAL wsrep_provider_options='pc.bootstrap=YES';, появляется:ERROR 1210 (HY000): Incorrect arguments to SET - person aircraft; 05.07.2017

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

Проверьте журналы node1, чтобы увидеть, нормально ли он завершил работу, и если да, то журналы node2, чтобы увидеть, как он воспринял ситуацию. Если бы он увидел нормальное отключение node1, он бы сказал что-то вроде

[Note] WSREP: forgetting xxxxxxx (tcp://X.X.X.X:XXXX)

и т.д.; но если бы он думал, что другой узел был потерян, это было бы больше похоже на

[Note] WSREP: (70f85e74, 'tcp://x.x.x.x:xxxx') turning message relay requesting on, nonlive peers: tcp://X.X.X.X:XXXX

и т. д.

См. http://nirbhay.in/blog/2015/02/split-brain/ для получения более подробной информации и примеров регистрации ситуации с разделенным мозгом.

Самый дешевый способ избежать этого — использовать арбитра Galera: http://nirbhay.in/blog/2013/11/what-is-galera-arbitrator/

person elenst    schedule 17.11.2016
comment
Спасибо! Эта ошибка появляется из-за того, что я внезапно перезагружаю Node1. Но у меня всего 2 сервера. Могу ли я установить 2 Galera Arbitrator на 2 сервера, чтобы решить эту проблему? @elenst - person namdt55555; 17.11.2016
comment
Технически можно, но это не поможет. Если вы стремитесь перезагрузить всю машину, то арбитр, который там работает, тоже выйдет из строя, и у вас будет тот же split-brain, только вместо 1/1 (1 узел остался, 1 потерян) будет 2/ 2. Если один из ваших хостов подвержен высокому риску перезагрузки, а другой более стабилен, вы можете рассмотреть возможность установки более высокого веса для стабильного хоста. - person elenst; 17.11.2016
comment
запустив SET GLOBAL wsrep_provider_options="pc.weight=3" или что-то в этом роде. В этом случае, когда слабый узел выходит из строя, более сильный будет знать, что он все еще первичен. Если так получилось, что сильный вышел из строя, можно оживить оставшийся, запустив SET GLOBAL wsrep_provider_options='pc.bootstrap=true'. Будьте осторожны, чтобы не настроить оба узла на начальную загрузку, иначе у вас получится два отдельных кластера. - person elenst; 17.11.2016
comment
так что на самом деле решение, я тоже столкнулся с этой проблемой - person Ciasto piekarz; 28.11.2020