データベースを複製すると、データの損失を防ぎ、アプリケーションのパフォーマンスを最適化できる冗長性が生まれます。このチュートリアルでは、既存のMariaDB10.0マスターデータベースを1つ以上のスレーブに複製する基本について説明します。次の例では、ホストオペレーティングシステムはDebian8です。
これらの手順は他のオペレーティングシステムにも適用できますが、いくつかのコマンドとデフォルトのファイルの場所が異なることに注意してください。具体的には、 /etc/mysql/my.cnfのパス名に置き換える必要があります 、 / var / lib / mysql 、バイナリログファイルのデフォルトの名前とパス、およびシステムの詳細に従ってmysqldを開始、停止、および再起動するためのコマンド。
1。接続を確認する
続行する前に、マスターとスレーブがネットワーク上で相互に到達できること、およびそれぞれの / etc / hostsに相互のエントリがあることを確認してください。 ファイル。各ホストはpingできる必要があります もう1つは、 sshができるはずです。 通常のユーザーとしてお互いに。
2。マスターでmysqldバイナリログを有効にする
マスターホストで、バイナリログが有効になっていることを確認します。 mysqldを呼び出す スイッチを使って-verbose--help MariaDBデーモンの動作値を表示します。ルートとして:
mysqld --verbose --help | grep log-bin
...
log-bin (No default value)
...
エントリの値log-bin バイナリログファイルの命名規則を定義します。 Debianでは、これらのファイルは / var / libにあります 。 log-binの値の場合 は(デフォルト値なし) 、構成ファイル my.cnf を変更して、ログを有効にする必要があります。 。 Debianでは、 my.cnf ディレクトリ/etc / mysqlにあります 。
/etc/mysql/my.cnfを開きます テキストエディタで[mysqld]を見つけます グループ。存在しない場合は作成し、 log-binという単純な行を入力します。 。
[mysqld]
log-bin
このエントリを含めると、mysqldの再起動時にバイナリログが有効になります。
log-binの値を設定することもできます 、例: log-bin=ファイル名 、バイナリログファイルのカスタム名を定義します。このチュートリアルでは、値を設定せず、デフォルトのログファイル名を使用します。
mysqldを再起動します:
service mysql restart
変更が有効になったことを確認します:
mysqld --verbose --help | grep log-bin
...
log-bin mysqld-bin
...
ここに示すように、Debianのデフォルトのバイナリログファイル名は mysqld-binで始まります 、例: mysqld-bin。nnnnnn 。
3。レプリケーションユーザーに権限を付与する
すべてのレプリケーションタスクを専用のレプリケーションユーザーが実行することをお勧めします。これらの例では、ユーザーに repluserという名前を付けます。 このユーザーのパスワードを文字列replpassに設定します 。
このユーザーにグローバル権限SUPERを付与します 、リロード 、およびレプリケーションスレーブ 。これらにより、レプリケーションユーザーはスーパーユーザーコマンドを実行し、データベースキャッシュをフラッシュし、マスターサーバーから更新をフェッチできます。
データベースルートとしてMariaDBクライアントを入力します:
mysql -u root -p
MariaDBプロンプトで、次のコマンドを入力します:
GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';
ここでは、ホスト名のワイルドカード'% 'レプリケーションユーザーが任意のホストから接続できるようにします。
権利が付与されていることを確認します:
SHOW GRANTS FOR 'repluser'\G;
4。データベースキャッシュをフラッシュし、テーブルを読み取り専用に設定します
データベースのスナップショットを作成する準備として、すべてのテーブルをフラッシュし、それらを READ LOCKに設定します 。これは、オフピーク時またはシステムメンテナンス期間中に迅速に実行する必要があります。
マスターについて:
FLUSH TABLES WITH READ LOCK;
テーブルがロックされたので、マスターのステータスを確認します。
マスターステータスを表示;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000005 | 995 | | |
+-------------------+----------+--------------+------------------+
情報は異なりますが、ファイルの値を書き留めてください および位置 。この情報は手順7で使用します。
MariaDBクライアントを終了します:
\q
5。スレーブホストのスナップショットデータベース
複製するマスター上に存在する1つまたは複数のデータベースのアーカイブを作成します。これらの各データベースには、 / var / lib / mysqlに独自のディレクトリがあります。 。この例では、タールを使用します パス/var / lib / mysql / dbnameにある単一のデータベースを作成します 。
このコマンドは、単一のデータベースをアーカイブします。追加のデータベースをアーカイブする場合は、それらのフルパス名をコマンドに追加します。 / var / lib / mysql / dbname1 / var / lib / mysql / dbname2 ...
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
さて、通常のユーザーとしてユーザー名 、このファイルをスレーブホストの通常のユーザーアカウントに転送します:
rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.
または、scpを使用:
scp mysql-master.tar.bz2 [username]@slavehost:~/.
次に、スレーブホストにSSHで接続します:
ssh [username]@slavehost
ルートとして、スレーブでmysqldを停止します:
service mysql stop
...そしてアーカイブを抽出します:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
6。マスターとスレーブのサーバーIDを構成する
/etc/mysql/my.cnfを変更します マスターで、エントリ server-id = nを追加します [mysqld]で グループ、ここで n サーバーを識別する一意の整数です。通常、 n マスターサーバーの場合は=1ですが、 n [ 1の範囲内の任意の一意の整数にすることができます 、 2 ^ 32-1 ]。マスターをserver-id=1に設定します 、および server-id =100のスレーブ 。
( my.cnfの場合 スレーブに存在しない場合は、作成してください。存在する場合は、既存の server-idを検索します エントリし、その行のコメントを解除/編集します。
/etc/mysql/my.cnf内 マスターホスト上:
[mysqld]
server-id=1
/etc/mysql/my.cnf内 スレーブホスト上:
[mysqld]
server-id=100
7。テーブルのロックを解除し、マスターとスレーブでmysqldを開始/再起動します
マスターサーバーで、データベースルートとしてのMariaDBクライアントで、テーブルのロックを解除します。
mysql -u root -p
UNLOCK TABLES;
\q
マスターでmysqldを再起動します:
service mysql restart
そして、スレーブで開始します:
service mysql start
新しいserver-idを確認できます 値は各ホストで有効になっています。ルートとして:
mysqld --verbose --help | grep server-id
8。スレーブでマスターのIDを構成する
スレーブで、マスターサーバーのIDを構成します。 MariaDBクライアントを入力してください:
mysql -u root -p
MASTER_LOG_FILE の値を置き換えて、次のコマンドを実行します およびMASTER_LOG_POS バイナリログのファイル および位置 手順4で記録したものと、 MASTER_HOSTの値 、 MASTER_USER 、および MASTER_PASSWORD あなた自身の価値観で。
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;に変更
9。スレーブをアクティブ化
スレーブでは、データベースルートとしてのMariaDBクライアントで:
START SLAVE;
これで、スレーブのステータスを確認できます:
SHOW SLAVE STATUS \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: masterhost
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000009
Read_Master_Log_Pos: 1330
Relay_Log_File: mysqld-relay-bin.000008
Relay_Log_Pos: 1618
Relay_Master_Log_File: mysqld-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1330
Relay_Log_Space: 2204
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
レプリケーションプロセスにエラーがある場合は、ここに一覧表示されます。
10。マスターで変更を加え、スレーブでレプリケーションを確認します
マスター上に新しいデータベースを作成し、スレーブ上で変更を確認することで、レプリケーションが行われていることを確認できます。
mysql -u root -p
新しいデータベースを作成します:
CREATE DATABASE repltest;
USE repltest
テーブルを作成して値を挿入します:
CREATE TABLE test (hello VARCHAR(10));
INSERT INTO test VALUES ('world');
\q
次に、スレーブでMariaDBクライアントに入ります:
mysql -u root -p
USE repltest
SELECT * FROM test;
+-------+
| hello |
+-------+
| world |
+-------+
1 row in set (0.00 sec)
11。追加のスレーブに対してプロセスを繰り返します
追加のスレーブごとにこのプロセスを繰り返すことができます。具体的には、次の手順を実行します。
11 ( a )。 マスターで、データベースルートとしてのMariaDBクライアントで、テーブルをフラッシュしてロックします。
FLUSH TABLES WITH READ LOCK;
ロックした後、マスターステータスを表示します:
SHOW MASTER STATUS;
ファイルを書き留めます および位置 値。
11 ( b )。 マスターで、ルートとして:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
11 ( c )。 マスターでは、通常のユーザーとして:
rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.
11 ( d )。 スレーブでは、ルートとして:
service mysql stop
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
11 ( e )。 /etc/mysql/my.cnf内 スレーブホストで、 server-id =を追加または編集します [mysqld]の行 グループ。server-idの値 新しくてユニークです:
[mysqld]
server-id=200
11 ( f )。 マスターで、データベースルートとしてのMariaDBクライアントで、テーブルのロックを解除します。
UNLOCK TABLES;
11 ( g )。 マスターで、rootとしてmysqldを再起動します:
service mysql restart
11 ( h )。 スレーブで、rootとしてmysqldを起動します:
service mysql start
11 (私 )。 スレーブで、データベースルートとしてのMariaDBクライアントで、マスターID、および手順10(a)のバイナリログのファイル名と位置を構成します。
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;
11 ( j )。 スレーブで、データベースルートとしてのMariaDBクライアントで、レプリケーションをアクティブ化します。
START SLAVE;
12。トラブルシューティング:スレーブがマスターに接続できない
/var/mysql/my.cnfを確認してください バインドアドレスのマスター エントリ。 バインドアドレスの場合 127.0.0.1に設定されています 、サーバーはローカルホストからの接続のみを受け入れます。この行をコメント化するか、値を *に設定します すべてのIPv4およびIPv6アドレスからの接続を許可します。 my.cnfを変更した場合 、mysqldを再起動することを忘れないでください。
それでも接続が機能しない場合は、サーバーがポート 3306での接続を許可していることを確認してください 。マスターで、カーネルファイアウォールテーブルを一覧表示します。
iptables -L
eth0 の代わりにネットワークインターフェイスデバイス名を使用して、次のコマンドを使用して、ポート3306での接続の割り当てを作成できます。 必要に応じて:
iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT