MySQLレプリケーションは、ユーザーが1つ以上のMySQLデータベースの複数のコピーを管理できるようにする興味深い機能です。データは自動的にソースからレプリカデータベースにコピーされます。メインのデータベースに影響を与えることなくデータを操作したり、データのバックアップ、データベースアクセスのスケーリングなど、多くの状況で役立ちます。
このガイドでは、あるサーバー上のMySQLインスタンスをソースデータベースとしてセットアップし、別のサーバー上のMySQLインスタンスをそのレプリカとして機能するように構成する手順について説明します。.
前提条件
このガイドでは、MySQLレプリケーションの非常にシンプルな例を示します。これには1つのソースと1つのレプリカデータベースが含まれます。ソースデータベースがデータベースのプライマリコピーであり、レプリカデータベースはソースデータベースのレプリカになります。デモンストレーションでは、2台のサーバーが次のIPアドレスで構成されています:
- ソースサーバー: 31.171.240.179
- レプリカサーバー: 31.171.250.139
各サーバーは最新のUbuntu 20.04サーバー構成でセットアップされています。まず、Ubuntuサーバーのセットアップ方法を示すチュートリアルの手順に従ってください。なお、レプリカデータベースの数は増やすことも可能です。このガイドでは、すでにMySQLがインストールおよび構成されていることを前提としています。MySQLのインストールについてサポートが必要ですか?このガイドでは、MySQLのインストールと基本的な使用方法の手順を詳しく説明しています。.
簡単に言うと、必要なパッケージは次のとおりです:
|
1 |
$ sudo apt install mysql-server mysql-client |
両方のシステムのファイアウォールは、ポート3306で両方のシステムからのトラフィックを許可するように構成する必要があります。これはMySQLのデフォルトポートです。デモンストレーションを交えたUFWの基本に関する詳細については、ブログ記事をご覧ください。
ソースデータベースの構成
-
MySQL構成の微調整
MySQLは、my.cnfをプライマリ構成ファイルとして使用します。サーバーをmy.cnfとして指定するために、ソースを更新します。まず、テキストエディタで構成ファイルを開きます:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
次に、mysqldセクションの下に次の行を追加します:
|
1 2 3 4 |
bind-address = 31.171.240.179 server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = newdatabase |
これらの行はどういう意味ですか?
bind-address: これは、サービスとIPアドレスの間の関連付けを定義するエントリです。デフォルトでは、値は127.0.0.1(localhost) になっている場合があります。新しい値はサーバーのIPアドレスになります。server-id: MySQLレプリケーションでは、各サーバーに一意のサーバーIDが必要です。任意の数値を指定できます。わかりやすくするために、ここでは1.log_bin: レプリケーションの実際の詳細を保存します。レプリカデータベースは、ログに登録されたすべてをコピーします。binlog_do_db: このエントリは、レプリカサーバーでのレプリケーション対象となるデータベースを指定します。複数のデータベースを指定することもできます。ここでは、サンプルデータベースはnewdatabase.
変更を加えた後、構成ファイルを保存します。MySQLは、変更をmy.cnf:
|
1 |
$ sudo service mysql restart |
-
レプリカユーザーへの権限の付与
次のステップは、レプリカユーザーを作成し、適切な権限を付与することです。これはMySQLシェルから行う必要があります。まず、MySQLシェルを起動します:
|
1 |
$ sudo mysql -u root -p |
次に、レプリカデータベース用の専用ユーザーを作成します。ユーザー名とパスワードは適宜変更してください:
|
1 |
$ CREATE USER 'cloudsigma_s'@'31.171.240.179' IDENTIFIED BY 'password_123'; |
次に、ユーザーに適切な権限を付与します:
|
1 |
$ GRANT REPLICATION SLAVE ON *.* TO 'cloudsigma_s'@'31.171.240.179'; |
You can learn more about the MySQLのユーザーと権限に関する詳細については、ブログ記事をご覧ください。次に、変更を有効にするためにグラントテーブルをリロードします:
|
1 |
$ FLUSH PRIVILEGES; |
-
データベースの微調整
レプリカ上にソースデータベースのコピーが必要です。手動で構造を構築することも可能ですが、ほとんどの場合、それは非常に不便です。そのため、データベースを直接エクスポートするのが最も最適な解決策です。この例では、ソースデータベースは newdatabase です。現在のデータベースを変更します:
|
1 |
$ USE newdatabase; |
次のコマンドはデータベースをロックし、新しい変更を防ぎます:
|
1 |
$ FLUSH TABLES WITH READ LOCK; |
次に、データベースのステータスを確認します:
|
1 |
$ SHOW MASTER STATUS; |
この位置から、レプリカデータベースはソースからのレプリケーションを開始します。これらの数値は後で役立つため、記録しておいてください。同じウィンドウから変更が行われた場合、MySQLは自動的にデータベースのロックを解除します。そのため、以下の手順は別のターミナルのタブまたはウィンドウで実行することをお勧めします。データベースはまだロックされています。ポータブルなSQLファイルにエクスポートします:
|
1 |
$ mysqldump -u root -p --opt newdatabase > newdatabase.sql |
タスクが完了しました。次に、データベースのロックを解除します:
|
1 |
$ UNLOCK TABLES; |
最後に、シェルを終了します:
|
1 |
$ QUIT; |
レプリカの設定
それでは、レプリカデータベースを設定します。
-
ソースデータベースのインポート
レプリカサーバー上にソースデータベースのコピーが必要です。そのために、先ほどエクスポートしたSQLファイルを使用します。MySQLシェルを起動します:
|
1 |
$ sudo mysql -u root -p |
その後、同じデータベース名を使用して空のデータベースを作成します:
|
1 |
$ CREATE DATABASE newdatabase; |
次に、シェルを終了します:
|
1 |
$ EXIT; |
次に、SQLファイルをデータベースにインポートします:
|
1 |
$ sudo mysql -u root -p newdatabase < newdatabase.sql |
-
MySQL設定の微調整
MySQL設定ファイルで宣言する必要がある項目がいくつかあります。テキストエディタで設定ファイルを開きます:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
以下のエントリは、mysqld セクションの下に配置します。そうしないと機能しません。最初はサーバーIDです。前述のように、ソース・レプリカのレプリケーション構成内のすべてのサーバーで一意である必要があります。デモンストレーション用として、以下のように設定されています:2:
|
1 |
$ server-id = 2 |
次に、以下の行を追加します:
|
1 2 3 |
$ relay-log = /var/log/mysql/mysql-relay-bin.log $ log_bin = /var/log/mysql/mysql-bin.log $ binlog_do_db = newdatabase |
ここでは、relay-log のみが新しいエントリです。これは、レプリケーション中にレプリカサーバーが作成するログです。ログの形式はバイナリログと同じです。設定ファイルを保存し、MySQLを再起動します:
|
1 |
$ sudo service mysql restart |
-
レプリケーションの有効化
最後に、MySQL内からレプリケーションを有効にする準備が整いました。MySQLシェルを起動します:
|
1 |
$ sudo mysql -u root -p |
次のコマンドを実行します。まず、IPアドレス、ユーザー名、パスワードを適宜変更してください:
|
1 |
$ CHANGE MASTER TO MASTER_HOST='31.171.240.179',MASTER_USER='cloudsigma_master', MASTER_PASSWORD='password_123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107; |
このコマンドは以下を実行します:
- 現在のサーバーがソースサーバーのレプリカとしてマークされます。
- レプリカサーバーに適切なログイン資格情報が設定されます。
- レプリカサーバーは、どこからレプリケーションを開始すればよいかを認識します。ソースサーバーで確認したデータベースのステータスを覚えていますか?ソースのログファイルとログポジションはそこから取得されます。
最後に、レプリカサーバーをアクティブにします:
|
1 |
$ START REPLICA; |
-
その他
レプリカの現在の状態の詳細を確認する必要がありますか?MySQLシェルで次のコマンドを実行します。末尾の \G は、テキストを読みやすく再配置するためのものです:
|
1 |
$ SHOW REPLICA STATUS\G |
接続に問題がある場合は、レプリカサーバーを起動してスキップしてみてください:
|
1 |
$ SET GLOBAL SQL_REPLICA_SKIP_COUNTER = 1; REPLICA START; |
まとめ
MySQLレプリケーションには多くの考慮事項があります。これは基本的な構成の簡単なデモンストレーションに過ぎません。しかし、複数のソース・レプリカ構成に簡単に拡張することができます。同じ手順は、より高度で複雑な構成にも適用されます。設定後は、常にテストを行うことをお勧めします。いくつかの insert, delete または update コマンドをソースデータベースで実行してみてください。設定が正しく機能していれば、レプリカデータベースにすべてが適切に反映されるはずです。
さらに、MySQLでできることについて、当ブログの他のリソースもご覧ください。
- SQLite vs MySQL vs. PostgreSQL: リレーショナルデータベース管理システムの比較
- MariaDBまたはMySQLのrootパスワードをリセットする方法
- Ubuntu 20.04にLEMPスタック(Linux、Nginx、MySQL、PHP)をインストールする方法
ハッピーコンピューティング!







コメント
コメントはまだありません。最初のコメントを投稿しましょう。