ステータス:非推奨

このチュートリアルは廃止され、保守されなくなりました。

理由:このチュートリアルでは、マルチマスタートポロジを構築するための古い方法について説明します。 この記事が最初に公開された時点では、グループレプリケーションはまだMySQLに実装されていませんでした。

代わりに参照してください:新しい Ubuntu 16.04でMySQLグループレプリケーションを構成する方法チュートリアルを読んで、マルチプライマリレプリケーショングループを設定できます。

イントロ

「Webアプリケーションのスケーリング」のこの2回目の記事では、2つのVPSでmysqlデプロイメントをスケーリングするために必要な手順をリストします。

このシリーズの最初の記事では、2つのVPSでnginxの負荷を分散するために必要な手順を説明しました。最初に、その記事を読むことをお勧めします。

MySQLレプリケーションは、MySQLデータベースに格納されている単一のデータセットを2番目のサーバーにライブコピーするプロセスです。 「マスタースレーブ」レプリケーションと呼ばれるこの構成は、一般的なセットアップです。 マスターマスターレプリケーションでは、どちらかのサーバーからもう一方のサーバーにデータをコピーできるため、セットアップはそれよりも優れています。 この微妙ですが重要な違いにより、どちらのサーバーからもmysqlの読み取りまたは書き込みを実行できます。 この構成により、冗長性が追加され、データへのアクセスを処理する際の効率が向上します。

この記事の例は、サーバーCとサーバーDという名前の2つのVPSに基づいています。

サーバーC:3.3.3.3

サーバーD:4.4.4.4

ステップ1-サーバーCにMySQLをインストールして構成する

最初に行う必要があるのは、サーバーにmysql-serverパッケージとmysql-clientパッケージをインストールすることです。 次のように入力することで、これを行うことができます。

sudo apt-get install mysql-server mysql-client

デフォルトでは、mysqlプロセスはローカルホスト(127.0.0.1)での接続のみを受け入れます。 このデフォルトの動作を変更し、レプリケーションが正しく機能するために必要な他のいくつかの設定を変更するには、サーバーCで/etc/mysql/my.cnfを編集する必要があります。 変更する必要のある4つの行があり、現在は次のように設定されています。

#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
#binlog_do_db           = include_database_name
bind-address            = 127.0.0.1

これらの最初の行は、レプリケーション構成で特定のサーバーを一意に識別することです。 その前の「#」を削除して、その行のコメントを解除する必要があります。 2行目は、mysqlデータベースまたはテーブルへの変更がログに記録されるファイルを示しています。

3行目は、サーバー間で複製するデータベースを示しています。 この行には、必要な数のデータベースを追加できます。 この記事では、簡単にするために「example」という名前の単一のデータベースを使用します。 そして最後の行は、インターネットからの接続を受け入れるようにサーバーに指示しています(127.0.0.1でリッスンしないことによって)。

server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
binlog_do_db            = example
# bind-address            = 127.0.0.1

次に、mysqlを再起動する必要があります。

sudo service mysql restart

次に、mysqlインスタンス内のいくつかのコマンドライン設定を変更する必要があります。 シェルに戻ると、次のように入力してrootmysqlユーザーにアクセスできます。

mysql -u root -p 

このコマンドで要求されるパスワードは、ドロップレットのrootユーザーではなく、rootmysqlユーザーのパスワードであることに注意してください。 mysqlシェルにログインしていることを確認するには、プロンプトは次のようになります。

mysql> 

ログインしたら、いくつかのコマンドを実行する必要があります。

2つのVPS間でデータを複製するために使用される疑似ユーザーを作成する必要があります。 この記事の例では、このユーザーに「レプリケーター」という名前を付けることを前提としています。 「password」を、レプリケーションに使用するパスワードに置き換えます。

create user 'replicator'@'%' identified by 'password'; 

次に、このユーザーにmysqlデータを複製するためのアクセス許可を与える必要があります。

grant replication slave on *.* to 'replicator'@'%'; 

残念ながら、レプリケーションのアクセス許可をデータベースごとに付与することはできません。 ユーザーは、構成ファイルで指示したデータベースのみを複製します。

サーバーCの初期構成の最後のステップとして、後でサーバーDに提供する現在のMySQLインスタンスに関する情報を取得する必要があります。

次のコマンドは、いくつかの重要な情報を出力します。これらの情報に注意する必要があります。

show master status; 

出力は次のようになり、2つの重要な情報が含まれます。

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 | example      |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

次のステップで使用するファイルと位置をメモする必要があります。

ステップ2-サーバーDにMySQLをインストールして構成する

サーバーCで実行したのと同じ手順を繰り返す必要があります。 まず、インストールする必要があります。これは、次のコマンドで実行できます。

sudo apt-get install mysql-server mysql-client

2つのパッケージが正しくインストールされたら、サーバーCを構成したのとほぼ同じ方法で構成する必要があります。 /etc/mysql/my.cnfファイルを編集することから始めます。

sudo nano /etc/mysql/my.cnf

以前に変更したのと同じ構成ファイルの4行を変更する必要があります。

デフォルトを以下に示し、その後に必要な変更を加えます。

#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
#binlog_do_db           = include_database_name
bind-address            = 127.0.0.1

これらの4行を、以下の行と一致するように変更する必要があります。 サーバーCとは異なり、サーバーDのserver-idを1に設定できないことに注意してください。

server-id              = 2
log_bin                = /var/log/mysql/mysql-bin.log
binlog_do_db           = example
# bind-address            = 127.0.0.1

そのファイルを保存して終了したら、mysqlを再起動する必要があります。

sudo service mysql restart

mysqlシェルに入り、さらにいくつかの構成オプションを設定する時が来ました。

mysql -u root -p 

まず、サーバーCと同様に、レプリケーションを担当する疑似ユーザーを作成します。 「password」を使用したいパスワードに置き換えます。

create user 'replicator'@'%' identified by 'password'; 

次に、VPS全体に複製するデータベースを作成する必要があります。

create database example; 

そして、新しく作成した「レプリケーション」ユーザー権限を付与して、それをレプリケートする必要があります。

grant replication slave on *.* to 'replicator'@'%'; 

次のステップでは、前にメモした情報を取得して、それをmysqlインスタンスに適用します。 これにより、レプリケーションを開始できます。 mysqlシェルで次のように入力する必要があります。

slave stop; 
CHANGE MASTER TO MASTER_HOST = '3.3.3.3', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 107; 
slave start; 

‘password’を、レプリケーション用に選択したパスワードに置き換える必要があります。 MASTER_LOG_FILEおよびMASTER_LOG_POSの値は、上記の値と異なる場合があります。 「SHOWMASTERSTATUS」がサーバーCに返す値をコピーする必要があります。

mysql master-masterレプリケーションを完了する前に最後に行う必要があるのは、マスターログファイルと、他の方向(サーバーDからサーバーC)にレプリケートするために使用する位置をメモすることです。

次のように入力することで、これを行うことができます。

SHOW MASTER STATUS; 

出力は次のようになります。

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      107 | example      |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

双方向レプリケーションを完了するには、サーバーCにファイルと位置を入力する必要があるため、ファイルと位置をメモします。

次のステップでは、その方法を説明します。

ステップ3-サーバーCでのレプリケーションの完了

サーバーCに戻り、コマンドラインでレプリケーションの構成を完了する必要があります。 このコマンドを実行すると、サーバーDからすべてのデータが複製されます。

slave stop; 
CHANGE MASTER TO MASTER_HOST = '4.4.4.4', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000004', MASTER_LOG_POS = 107; 
slave start; 

上記の値とは異なる場合があることに注意してください。 また、MASTER_PASSWORDの値を、レプリケーションユーザーの設定時に作成したパスワードに置き換えてください。

出力は次のようになります。

Query OK, 0 rows affected (0.01 sec)

最後に行うことは、レプリケーションが両方のVPSで機能していることをテストすることです。 最後のステップでは、この構成をテストする簡単な方法を説明します。

ステップ4-マスター-マスターレプリケーションのテスト

すべての構成がセットアップされたので、次にテストします。 これを行うには、サーバーCのサンプルデータベースにテーブルを作成し、サーバーDをチェックして表示されるかどうかを確認します。 次に、サーバーDから削除し、サーバーCに表示されないことを確認します。

次に、サーバー間で複製されるデータベースを作成する必要があります。 これを行うには、mysqlシェルで次のように入力します。

create database example; 

それが終わったら、サーバーCにダミーテーブルを作成しましょう。

create table example.dummy (`id` varchar(10)); 

次に、サーバーDをチェックして、テーブルが存在するかどうかを確認します。

show tables in example; 

次のような出力が表示されるはずです。

+-------------------+
| Tables_in_example |
+-------------------+
| dummy             |
+-------------------+
1 row in set (0.00 sec)

最後に行うテストは、サーバーDからダミーテーブルを削除することです。 サーバーCからも削除する必要があります。

これを行うには、サーバーDで次のように入力します。

DROP TABLE dummy; 

これを確認するために、サーバーCで「showtables」コマンドを実行すると、テーブルは表示されません。

Empty set (0.00 sec)

そして、あなたはそれを持っています! 動作中のmysqlマスター-マスターレプリケーション。 いつものように、どんなフィードバックも大歓迎です。