MySQL レプリケーションでは、プライマリ サーバーから「スレーブ」サーバーにデータを自動的にコピーすることで、同じデータベースの複数のコピーを同時に複数のサーバーに置くことができます。
このメカニズムのおかげで、マスター上で実行されたすべてのステートメントは、何らかの形でデータを変更し、複製されたデータベースに記録、送信、および実行できます。
このガイドは、MySQL をサーバーにインストールし、レプリカを適切に構成し、テスト データでその動作を検証するのに役立ちます。
まず、SSH 接続を介してサーバーに接続します。まだ行っていない場合は、ガイドに従って SSH プロトコルで安全に接続することをお勧めします。ローカル サーバーの場合は、次のステップに進み、サーバー ターミナルを開きます。
MySQL のインストール
両方のサーバーでマスター/スレーブ レプリケーションをセットアップするには、MySQL のバージョンをインストールし、次の章に進む前に両方のマシンで次のインストール手順を実行します。
配布リポジトリを更新して、最新バージョンの MySQL を確実にダウンロードしてください:
$ sudo apt update
以前にこのコマンドを起動したことがある場合は、次のステップに進んでください。
MySQL のインストールに進みます:
$ sudo apt install mysql-server
インストールが成功したことを確認するには、MySQL のバージョンを確認してください:
$ mysqld --version
手順が正常に実行されると、インストールされている MySQL のバージョンが画面に表示されます。
MySQL に含まれるスクリプトを実行して MySQL のセキュリティを確保します。これにより、セキュリティが強化され、データベースへのアクセスが制限されます:
$ sudo mysql_secure_installation
この時点で、ガイド付きの手順に従って、MySQL セキュリティ レベルの設定を行うことができます。
最初に、パスワード検証システムを有効にするかどうかを尋ねられます。有効にすると、ユーザーのパスワードを設定するときにパスワードが評価され、セキュリティ基準を満たさない場合はエラーで拒否されます。
後で、root パスワードを任意のパスワードに変更するかどうか尋ねられます (パスワード検証システムを有効にする場合は、セキュリティ基準を満たすパスワードを入力する必要があります)。
安全なパスワードを作成するためのいくつかのベスト プラクティスに従うことをお勧めします。これには以下が含まれます:
大文字と小文字の両方の使用
文字と数字の両方の使用
@ # $% ^ &! のような英数字以外の文字の使用
以前に使用されたことのないパスワードの使用。
最後に、匿名ユーザーを削除するかどうか、データベースをテストするかどうか、および root ユーザーによるリモート ログインを無効にするかどうかを選択します。適切なレベルのセキュリティのために、これらすべての変更を確認することをお勧めします。
この時点で、表示されたアクセス許可の表の更新を確認して、すべての新しいセキュリティ基準を適用します。
最後にサービスを再起動して変更を適用します:
$ sudo service mysql restart
マスター/スレーブ レプリケーションの構成
両方のサーバー (マスターとスレーブ) にインストールしたら、まずマスター サーバーの構成に進みます。
最初に、/etc/mysql/mysql.conf.d/mysqld.cnf の構成ファイルを次のように編集します。
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
スレーブ サーバーはマスター サーバーにリモートで接続する必要があるため、バインド アドレスを次のように変更して、MySQL サービスが外部接続を受け入れることができるようにする必要があります。
bind-address = 0.0.0.0
完了したら、サービスを再起動して変更を適用します:
$ sudo service mysql restart
デモンストレーションと評価の目的で、架空のデータを含む「numbers」という名前のテーブルを使用して、マスター サーバー (ここでは「チュートリアル」と呼びます) にテスト データベースを作成します。構成手順が完了したら、ここに入力したすべてのデータがスレーブ サーバーと同期されているかどうかを確認します。
$ sudo mysql -u root -p
mysql> CREATE DATABASE tutorial;
Query OK, 1 row affected (0.00 sec)
mysql> USE tutorial;
Database changed
mysql> CREATE TABLE numbers ( value REAL );
Query OK, 0 rows affected (0.09 sec)
mysql> INSERT INTO numbers VALUES ( 1 ), ( 2 ), ( 3 );
Query OK, 3 rows affected (0.04 sec)
Records: 3 Duplicates: 0 Warnings: 0
入力した値がテスト テーブルにあることを確認してください:
mysql> SELECT * FROM numbers;
+-------+
| value |
+-------+
| 1 |
| 2 |
| 3 |
+-------+
3 rows in set (0.00 sec)
数字の表には、上記のように 3 行の例が含まれている必要があります。
次に、スレーブ データベースで使用されるユーザーのアクセス データを作成します。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'usr_replica'@'%' IDENTIFIED BY 'SMDipmf#23$42';
mysql> FLUSH PRIVILEGES;
スレーブ サーバーの設定に進む前に、マスターの現在のステータスが画面に表示され、次の情報が保存されます:
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1238 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
スレーブ サーバーを構成するときに、これらのデータが必要になります。
MySQL シェルの終了に進みます:
mysql> exit
Bye
次に、完全なデータベース ダンプを保存して、後でスレーブ サーバーにロードします。
$ sudo mysqldump -u root -p --opt tutorial > slave-init.sql
Enter password:
新しく作成したファイルをスレーブ マシンに転送し、その構成を続行して、ファイル /etc/mysql/mysql.conf.d/mysqld.cnf を変更します:
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
サーバー ID が番号 2 を使用して変更されていることに注意してください。また、ここに示すようにバインド アドレスを変更することも忘れないでください:
bind-address = 0.0.0.0
スレーブを再起動して変更を適用します:
$ sudo service mysql restart
次に、マスター サーバーと同じ名前のデータベースを作成します:
$ sudo mysql -u root -p
mysql> create database tutorial;
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
ここで、新しく作成されたバックアップをインポートし、Master データベース (MASTER_LOG_FILE および MASTER_LOG_POS) によって以前に保存された情報を使用して Slave を開始します:
$ sudo mysql -u root tutorial < /root/slave.sql
$ sudo mysql -u root -p
mysql> CHANGE MASTER TO MASTER_HOST='195.231.4.201', MASTER_USER='usr_replica', MASTER_PASSWORD='SMDipmf#23$42', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 1238;
Query OK, 0 rows affected, 2 warnings (0.10 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
この時点から、データベースはリアルタイムで同期され、MySQL シェルを終了できます。
レプリケーションが正しく機能していることを確認する
レプリケーションの動作を確認するには、マスターにデータを挿入して、データがスレーブ データベースに正しく到着するかどうかを確認します。次のようにマスターに新しいデータを入力することから始めます。
$ sudo mysql -u root -p
mysql> use tutorial;
Reading table information for completion of table and column names
Turn off this feature to get a quicker startup with -A
Database changed
mysql> INSERT INTO numbers VALUES ( 4 ) , ( 5 );
Query OK, 2 rows affected (0.03 sec)
Records: 2
Duplicates: 0
Warnings: 0
次に、スレーブ データベースにクエリを実行します:
$ sudo mysql -u root -p
mysql> use tutorial;
Reading table information for completion of table and column names
Turn off this feature to get a quicker startup with -A
changed
mysql> SELECT * FROM numbers;
+-------+
| value |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+-------+
5 rows in set (0.00 sec)
ご覧のとおり、新しい値 (4 と 5) がスレーブ データベースに到着したため、同期は正しく機能しています。