2つのCentOS 6.6サーバーに2つのMariadb Galeraノード(mariadb-galera-10.0.27-linux-x86_64.tar.gz)をインストールしました。
インストール後、パラメーター--wsrep-new-cluster
でnode1を起動し、このパラメーターなしで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'
2ノードクラスター
two-nodeクラスターでは、single-node failureにより、他の作業を停止します。
状況
2つのノードのみで構成されるクラスターがあります。ノードの1つがクラスターを異常な状態のままにします。つまり、initまたはsystemdを使用してシャットダウンする代わりに、クラッシュしたり、ネットワーク接続が失われたりします。残っているノードは操作不能になります。人間のオペレーターや別のノードなどのサードパーティから追加情報が提供されるまで、この状態が続きます。
他のノードがクラスタを不当に離れた後もノードが動作し続けた場合、2つのノードのそれぞれが自分自身をプライマリコンポーネントと見なすリスクがあります。これを防ぐために、ノードは動作しなくなります。
ソリューション
2つの解決策があります:
SET GLOBAL wsrep_provider_options = 'pc.bootstrap = YES';
これにより、残っているノードが新しいプライマリコンポーネントとしてブートストラップされます。他のノードがオンラインに戻るか、このノードとのネットワーク接続を回復すると、状態転送を開始し、このノードに追いつきます。
SET GLOBAL wsrep_provider_options = 'pc.ignore_sb = TRUE';
ノードは更新の処理を再開し、スプリットブレインの状況が疑われる場合でも、更新を継続します。
注意警告:pc.ignore_sbを有効にすることは、前述のスプリットブレイン状況のリスクがあるため、マルチマスター設定では危険です。ただし、マスタースレーブクラスターの場合は特に簡素化されます(特に2つのノードのみを使用する場合)。
上記のソリューションに加えて、Galera Arbitratorを使用して、状況を完全に回避できます。 Galeraアービトレーターは、クォーラム計算の奇数ノードとして機能します。つまり、2ノードクラスターの1つのノードでGalera Arbitratorを有効にすると、他のノードに障害が発生したりネットワーク接続が失われたりしても、そのノードはプライマリコンポーネントのままです。
http://galeracluster.com/documentation-webpages/twonode.html
考えられる理由は、node1が異常にダウンしたか、少なくともnode2がダウンしたと考えたことです。この場合、2ノードクラスターはスプリットブレイン状態になり、クラスターの残りの部分は、プライマリコンポーネントであるかどうかを判断できません。そのため、2ノードクラスターは推奨されません。
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/