この記事では、マルチマスターレプリケーションで3つのノードを使用してMySQLデータベースクラスターを構成する方法を説明します。マルチマスターレプリケーションでは、各ノードにレコードを書き込むことができるため、ノードに障害が発生した場合でも、何も起こらなかったかのように他のノードで作業できます。
Perconaの公式ドキュメントは、公式Webサイトhttps://www.percona.com/
にあります。まず、2つだけでなく3つのノードを選択するのはなぜですか?どのクラスタでも、ノードの数は奇数である必要があるため、ノードが切断された場合は、サーバーの最上位グループに新しいデータがあると想定し、データの損失を防ぐためにダウンノードに複製する必要があります。これは、データレプリケーションの競合を解決するためだけに関連しており、切断されたノードにのみ書き込まれたデータが失われることはありません。
これは、スプリットブレインと呼ばれる状況を回避するために使用されます 、正しいデータを持つノードを自動的に選択することはできません。たとえば、両方のノードが互いに切断され、同じレコードが両方のノードに書き込まれる2ノードクラスターを考えてみます。オンラインに戻ったときに誰が勝ちますか?わからないので、スプリットブレインが発生し、どのレコードが正しいかを手動で判断する必要があります。
クラスタのどの部分に適切なデータがあるかを判断するために必要なノードの数はQUORUMと呼ばれ、この場合、クォーラムは2になります。したがって、2台のサーバーが常に相互に接続されている必要があります。 3つのノードすべてがダウンした場合、スプリットブレインがあり、どのサーバーを手動でブートストラップモードにするかを決定する必要があります。これは、スプリットブレインから再開するメインサーバーを決定する手順です。
Debian8でのPerconaXtraDBクラスターの構成
このチュートリアルでは、Debian8サーバーに3つのPerconaXtraDBクラスターノードをインストールして構成する方法について説明します。Perconaリポジトリのパッケージを使用します。
- サーバー1
- ホスト名:mysql1.local.vm
- IPアドレス: 192.168.152.100
- ノード2
- ホスト名:mysql2.local.vm
- IPアドレス: 192.168.152.110
- ノード3
- ホスト名:mysql3.local.vm
- IPアドレス: 192.168.152.120
各ホストで、ファイル/ etc / hostsを次のように変更して、DNSが正しく機能するようにします。
127.0.0.1 localhost
192.168.152.100 mysql1.local.vm mysql1
192.168.152.110 mysql2.local.vm mysql2
192.168.152.120 mysql3.local.vm mysql3
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
このチュートリアルで説明する手順には、次の最小限のサーバー設定が必要です。
- 3つのノードすべてにDebian8があり、このガイドに従うことをお勧めしますhttps://www.howtoforge.com/tutorial/debian-8-jessie-minimal-server/
すべてのノードで、rootとして次のコマンドを実行します。
wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
apt-get update
apt-get -y install percona-xtradb-cluster-57
明らかに、選択したいmysqlパスワードを入力してください。
パッケージがインストールされたら、 mysqld 自動的に起動します。 mysqldを停止します /etc/init.d/mysqlstopを使用して3つのノードすべてで 。
個々のノードは、クラスターをブートストラップできるように構成する必要があります。クラスタのブートストラップの詳細については、クラスタのブートストラップを参照してください。 。
-
これらの行を構成ファイル
/etc/mysql/my.cnfに必ず追加してください。 [mysqld]セクションの最後にある最初のノード(mysql1.local.vm)の場合: [mysqld]
... # Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This InnoDB autoincrement locking mode is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #1 address
wsrep_node_address=192.168.152.100
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=my_ubuntu_cluster
# Authentication for SST method
wsrep_sst_auth="sstuser:PASSW0RD"私の場合は「PASSW0RD」で設定したパスワードに注意してください。
-
次のコマンドで最初のノードを起動します:
[email protected]:~# /etc/init.d/mysql bootstrap-pxc
このコマンドは、最初のノードを起動してクラスターをブートストラップします。すべて問題がなければ、次のように表示されます。
[email protected]:~# /etc/init.d/mysql bootstrap-pxc
[ ok ] Bootstrapping Percona XtraDB Cluster database server: mysqld ..
[email protected]:~# -
最初のノードが開始されたら、従来のmysql -pコマンドを使用してmysqlに接続します。次に、次の例のように、「wsrep%」のようなクエリshowstatusを実行してクラスタステータスを確認できます。
-
mysql> show status like 'wsrep%'; +----------------------------+--------------------------------------+ | Variable_name | Value | +----------------------------+--------------------------------------+ | wsrep_local_state_uuid | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b | ... | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | ... | wsrep_cluster_size | 1 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | ... | wsrep_ready | ON | +----------------------------+--------------------------------------+ 59 rows in set (0.00 sec)
この出力は、クラスターが正常にブートストラップされたことを示しています。
状態スナップショット転送を実行するには ExtraBackupを使用する 、適切な権限を持つ新しいユーザーを設定します:
mysql> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'PASSW0RD'; mysql> GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost'; mysql> FLUSH PRIVILEGES;
注
MySQLルートアカウントを使用してSSTを実行することもできますが、これには別の(root以外の)ユーザーを使用する方が安全です。
-
次の行を構成ファイル
/etc/mysql/my.cnfに追加します。 2番目のノード(mysql2.local.vm)で、次のデータが含まれるようにします。 [mysqld]
... # Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This InnoDB autoincrement locking mode is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #2 address
wsrep_node_address=192.168.152.110
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=my_ubuntu_cluster
# Authentication for SST method
wsrep_sst_auth="sstuser:PASSW0RD" -
次のコマンドで2番目のノードを起動します(ご覧のとおり、今回はブーストラップモードではありません!!):
[email protected]:~# /etc/init.d/mysql start
-
サーバーが起動すると、サーバーは SSTを受信するはずです。 自動的。クラスタステータスを両方のノードで確認できるようになりました。次に、2番目のノード(mysql2.local.vm)からのステータスの例を示します。
-
mysql> show status like 'wsrep%'; +----------------------------+--------------------------------------+ | Variable_name | Value | +----------------------------+--------------------------------------+ | wsrep_local_state_uuid | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b | ... | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | ... | wsrep_cluster_size | 2 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | ... | wsrep_ready | ON | +----------------------------+--------------------------------------+ 40 rows in set (0.01 sec)
この出力は、新しいノードがクラスターに正常に追加されたことを示しています。変数wsrep_cluster_sizeは、最初に行ったクエリの1つではなく、2になっていることに注意してください。
-
次の行を構成ファイル
/etc/mysql/my.cnfに追加します。 2番目のノード(mysql3.local.vm)にあるため、次の構成が含まれています。 [mysqld]
... # Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This InnoDB autoincrement locking mode is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #2 address
wsrep_node_address=192.168.152.120
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=my_ubuntu_cluster
# Authentication for SST method
wsrep_sst_auth="sstuser:PASSW0RD" -
次のコマンドで3番目のノードを起動します:
[email protected]:~# /etc/init.d/mysql start
-
サーバーが起動すると、SSTを自動的に受信するはずです。クラスタステータスは、すべてのノードで確認できます。次に、3番目のノード(mysql3.local.vm)からのステータスの例を示します。
mysql> show status like 'wsrep%'; +----------------------------+--------------------------------------+ | Variable_name | Value | +----------------------------+--------------------------------------+ | wsrep_local_state_uuid | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b | ... | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | ... | wsrep_cluster_size | 3 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | ... | wsrep_ready | ON | +----------------------------+--------------------------------------+ 40 rows in set (0.01 sec)
この出力は、3番目のノードがクラスターに参加したことを確認します。もう一度wsrep_cluster_sizeを見てください。これは、2ではなく3になっています。
問題が発生した場合は、/ var / log / syslogを調べて、すべて問題がないかどうかを確認してください
Oct 4 12:16:13 mysql3 mysql[2767]: Starting MySQL (Percona XtraDB Cluster) database server: mysqld . . .State transfer in progress, setting sleep higher: mysqld . ..
Oct 4 12:16:13 mysql3 systemd[1]: Started LSB: Start and stop the mysql (Percona XtraDB Cluster) daemon.
Oct 4 12:17:01 mysql3 CRON[3731]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
この例では、すべてがうまくいき、状態転送を見ることができます。 進行中です。つまり、データはノードに転送されます。
レプリケーションをテストするには、2番目のノードで新しいデータベースを作成し、3番目のノードでそのデータベースのテーブルを作成し、最初のノードのテーブルにいくつかのレコードを追加します。
-
2番目のノードに新しいデータベースを作成します:
mysql@mysql2> CREATE DATABASE percona; Query OK, 1 row affected (0.01 sec)
-
3番目のノードにテーブルを作成します:
mysql@mysql3> USE percona; Database changed mysql@pxc3> CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30)); Query OK, 0 rows affected (0.05 sec)
-
最初のノードにレコードを挿入します:
mysql@mysql1> INSERT INTO percona.example VALUES (1, 'percona1'); Query OK, 1 row affected (0.02 sec)
-
2番目のノードのそのテーブルからすべての行を取得します:
mysql@mysql2> SELECT * FROM percona.example; +---------+-----------+ | node_id | node_name | +---------+-----------+ | 1 | percona1 | +---------+-----------+ 1 row in set (0.00 sec)
アプリケーションが常にクラスターに到達できるようにするために、3つのノードの前にロードバランサーを追加できます。