MySQL は、最も人気のあるオープンソースプロジェクトの1つであるリレーショナルデータベース管理システムです。安定性で知られていますが、ソースとレプリカのレプリケーションが構成されている場合、MySQLはさらに信頼性が高くなります。レプリケーションでは、通常、1台のMySQLサーバーがソースとして指定されます。 。ソースは、データベースの変更とデータの更新を1つ以上のレプリカに送信します。 データベースサーバー。 MySQLのデータ複製手順は柔軟であり、レプリカサーバーをソースに永続的に接続する必要はありません。このガイドでは、MySQLでソース-レプリカデータレプリケーションを構成する方法について説明します。
MySQLデータレプリケーションのしくみ
レプリケーションプロセスは、最初にソースデータベースにデータを保存してから、それを任意のレプリカにコピーします。命令を処理した後、ソースデータベースサーバーはバイナリログで変更を追跡します。ログは、データベースの構造と内容に対するすべての変更の順次レコードとして機能します。 SELECT
ステートメントはデータベースの内容を変更しないため、記録されません。
更新は非同期で行われるため、レプリカを継続的に接続する必要はありません。これは、信頼性の高いシステムの同期アーキテクチャとは対照的です。リアルタイム同期が必要な場合、MySQLはNDBクラスターを使用することをお勧めします 。
各レプリカは、ソースのバイナリログの内容を要求することにより、ソースからデータをプルします。次に、レプリカはステートメントを順番に適用し、ソースで発生したイベントを効果的に再生します。各レプリカは独立しており、ソースバイナリログで現在の位置を追跡します。さらに、各レプリカは、独自のスケジュールに従ってソースと同期できます。データは、レプリカを含む任意のサーバーから読み取ることができます。
MySQLでは、高度な粒度が可能です。特定のデータベースまたはデータベース内の特定のテーブルに複製することが可能です。デフォルトのレプリケーション形式はステートメントベースのレプリケーションです。 (SBR)、SQLステートメント全体が複製されます。ただし、行ベースのレプリケーション (RBR)もご利用いただけます。この形式は、変更された行を複製します。より複雑な多対多の構成を構成することも可能です。さまざまなレプリケーションオプションの詳細については、MySQLのドキュメントを参照してください。
注 MySQLは、以前はソースレプリカレプリケーションを「マスタースレーブレプリケーション」と呼んでいました。 MySQL組織は最近用語を変更し、用語の更新でその理由を説明しました。以前の用語「マスター」は「ソース」に変更されましたが、「スレーブ」は現在「レプリカ」と呼ばれています。 MySQLがコードベースを更新している間、古い用語が特定のコマンドと出力表示に引き続き表示される場合があります。このガイドでは、手順全体でMySQLの推奨用語を使用しています。
MySQLデータレプリケーションの利点
ソースとレプリカのレプリケーションを有効にすると、非冗長システムに比べて多くの重要な利点があります。以下のリストは、いくつかの利点の概要を示しています。
-
ライブバックアップコピーはいつでも簡単に作成できます。レプリケーションプロセスは非同期であるため、レプリケーションは任意のスケジュールに従って実行できます。確実に機能するために、レプリカをソースと同期させる必要はありません。
-
レプリカを追加すると、システム全体の稼働時間と信頼性を向上させることができます。メンテナンスが必要な場合、またはソースデータベースが利用できない場合は、プライマリコントロールをレプリカに切り替えることができます。
-
各レプリカは、データベースの別の読み取り可能なインスタンスを提供します。これにより、データマイニングまたは分析プログラムは、元のソースデータベースに追加の負荷をかけることなく、レプリカをクエリできます。
-
このアーキテクチャにより、スケーラビリティとパフォーマンスが向上します。データベースの読み取りと
SELECT
ステートメントはサーバー間でバランスを取ることができ、レイテンシーを削減します。 -
サードパーティは、レプリカを介してデータベースへの読み取り専用アクセスを取得でき、ソースへのアクセスを必要としなくなります。レプリカデータベースは、必要なときにオンデマンドで作成し、不要になったときに破棄することができます。この手法によりセキュリティが強化され、元のデータが改ざんされないようになります。
始める前に
-
まだ行っていない場合は、Linodeアカウントとコンピュートインスタンスを作成します。 Linode入門とコンピューティングインスタンスの作成ガイドをご覧ください。
-
コンピューティングインスタンスのセットアップと保護ガイドに従って、システムを更新してください。また、タイムゾーンを設定し、ホスト名を構成し、制限付きユーザーアカウントを作成し、SSHアクセスを強化することもできます。
-
MySQLソースレプリカレプリケーションを構成するには、少なくとも2つの個別のLinodeが必要です。 1つのLinodeがソースデータベースをホストし、別のノードがレプリカサーバーに必要です。
注 このガイドの手順は、root以外のユーザーを対象としています。昇格された特権を必要とするコマンドには、接頭辞として sudo
が付けられます 。sudo
に慣れていない場合 コマンドについては、Linuxユーザーおよびグループガイドを参照してください。
MySQLでソース-レプリカレプリケーションを構成する
ソースとレプリカのレプリケーションを構成するには、MySQLを相互に通信できる2つの別々のサーバーにインストールする必要があります。これらの手順はUbuntuディストリビューションを対象としていますが、一般的にすべてのLinuxディストリビューションに適用できます。このプロセスは、次の手順で構成されています。
- MySQLをインストールします。
- MySQLソースデータベースを構成します。
- レプリカの新しいMySQLユーザーを構成します。
- MySQLデータをレプリケーション用に準備します。
- MySQLレプリカデータベースを構成します。
- 複製されたMySQLデータをインポートし、複製をアクティブ化します。
MySQLのインストール
MySQLが両方のLinodeでまだ利用できない場合は、次の手順を使用してインストールします。
-
Linodeをアップグレードします。
sudo apt-get update && sudo apt-get upgrade
-
MySQLサーバーとクライアントアプリケーションをソースサーバーとレプリカサーバーの両方にインストールします。
sudo apt-get install mysql-server mysql-client -y
-
mysql_secure_installation
を使用して、ルートパスワードを含むセキュリティオプションを構成します コマンド。sudo mysql_secure_installation
-
ufw
などのファイアウォールを使用している場合 、MySQLトラフィックが通過できることを確認してください。次のルールを追加して、ポート3306
を開きます ファイアウォール上。ufw allow mysql
MySQLソースデータベースを構成する
MySQLレプリケーションを有効にするには、メインのMySQL構成ファイルでいくつかの変数を編集します。ソースデータベースの構成に次の変更を加えます。
-
ソースデータベースサーバーでメインのMySQL構成ファイルを見つけます。このファイルは通常、
/etc/mysql/mysql.conf.d/mysqld.cnf
にあります。 。ただし、以前のインストールでは、/etc/my.cnf
にある可能性があります または/etc/mysql/my.cnf
。includedir
を介してファイルの1つから参照することもできます。 ディレクティブ。 -
MySQL構成ファイルを開き、
bind-address
を変更します ソースサーバーのIPアドレスに送信します。- ファイル:/ etc / mysql / mysql.conf.d / mysqld.cnf
-
server-id
の行のコメントを外すか追加します およびlog-bin
。server-id
を設定します1
へ 、およびlog-bin
/var/log/mysql/mysql-bin.log
へ 。注 skip_networking
を確認してください 変数はどこにも宣言されていません。このファイル内に表示されている場合はコメントアウトしてください。単一のデータベースを複製するには、binlog_do_db = <database_name>
という行を追加します ファイルに。- ファイル:/ etc / mysql / mysql.conf.d / mysqld.cnf
-
MySQLサービスを再起動します。
sudo systemctl restart mysql
-
MySQLのステータスを確認し、
active
であることを確認します 。sudo systemctl status mysql
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2021-05-30 13:06:47 UTC; 1 day 1h ago
レプリカの新しいMySQLユーザーを構成する
レプリカを表すために、ソースサーバー上に新しいユーザーを作成する必要があります。新しいユーザーはMySQLシェル内に作成されます。
-
MySQLシェルに入ります。
sudo mysql -u root -p
-
MySQL
CREATE USER
を使用してレプリカアカウントのユーザーを追加します 構文。ユーザー名は、レプリカアカウントの名前、@
で構成されている必要があります シンボル、およびレプリカサーバーのIPアドレス。REPLICA_PASSWORD
の代わりに、アカウントのより安全なパスワードを選択してください 。CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';
注 レプリカが任意のアドレスから接続できるようにするには、ユーザーを 'replica_account_name'@'%'
として指定します。 。%
記号は、任意のアドレスまたはドメインを表します。これにより、セキュリティがいくらか犠牲になり、柔軟性が向上します。 -
リモートレプリカユーザーにレプリケーション権限を付与します。
GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
レプリケーション用にMySQLデータを準備する
この時点で、レプリケーション用のデータをステージングするために、ソースデータベースをフラッシュしてロックする必要があります。
-
MySQLシェル内にとどまり、データベースを再起動せずに付与テーブルを再ロードするための特権をフラッシュします。
FLUSH PRIVILEGES;
-
データベースをロックして、データのエクスポート元となる安定したポイントでデータベースをフリーズします。データベースをエクスポートするまで、MySQLクライアントを実行し続けます。書き込みコマンドを入力するか、MySQLシェルを終了すると、ロックが解除されます。
FLUSH TABLES WITH READ LOCK;
注意 このコマンドは、ソースデータベースへのすべてのコミットをブロックします。ソースがそれ以上のコミットを処理できるようにする前に、データをエクスポートします。そうしないと、レプリカデータベースが破損したり、ソースデータベースとの整合性が失われたりする可能性があります。このセクションの残りの2つの手順をできるだけ早く完了してください。 -
次のコマンドを使用して、データベースのステータスを確認します。このコマンドは、現在のログファイルとこのファイルの最後のレコードの位置を表示します。後でレプリカでレプリケーションを開始する必要があるため、この情報を記録してください。
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 1301 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
-
別のコンソールからLinuxシェルを使用し、
mysqldump
を使用してデータベースをエクスポートします 道具。宛先ファイルの覚えやすい名前を選択します。–master-data
を含めます ログファイルと現在のレコードの位置に関する情報をログに追加するオプション。sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sql
注 単一のデータベースをエクスポートするには、 --opt <database_name>
を含めます-–all-databases
ではなくオプション 。 -
元のMySQLシェルに戻り、ソースデータベースのロックを解除します。
UNLOCK TABLES;
-
MySQLシェルを終了します。
QUIT;
-
ftp
を使用して、エクスポートされたデータベースファイルをレプリカデータベースサーバーにコピーします 、scp
、またはファイルを転送する別の方法。scp databasecopy.sql [email protected]<replica_ip_address>
MySQLレプリカデータベースを構成する
レプリカデータベースの構成には、次の構成を適用する必要があります。 MySQLをレプリカサーバーにインストールするには、「MySQLのインストール」セクションを参照してください。
-
通常は
/etc/mysql/mysql.conf.d/mysqld.cnf
にあるメインのMySQLファイルを開きます。 、bind-address
を変更します レプリカサーバーのIPアドレスと一致させます。- ファイル:/ etc / mysql / mysql.conf.d / mysqld.cnf
-
server-id
の行のコメントを外すか追加します およびlog-bin
。server-id
2
に設定する必要があります レプリカでは、log-bin
変数は/var/log/mysql/mysql-bin.log
に設定する必要があります 。relay-log
の変数を追加します/var/log/mysql/mysql-relay-bin.log
に設定します 。注 skip_networking
を確認してください 変数はこのファイル内のどこにも設定されていません。単一のデータベースを複製するには、次のディレクティブをファイルbinlog_do_db = database_name
に追加します。 。複数のレプリカを構成するには、server-id
に番号を付けます 値は順番に増加します。たとえば、2番目のレプリカにはserver-id
があります3
の 。- ファイル:/ etc / mysql / mysql.conf.d / mysqld.cnf
-
MySQLサービスを再起動して、変更を組み込みます。
sudo systemctl restart mysql
-
MySQLのステータスを確認し、
active
であることを確認します 。sudo systemctl status mysql
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: active (running) since Mon 2021-05-31 16:29:48 UTC; 6s ago
-
(オプション )MySQLは、セキュリティを強化するためにSSLを使用してソースに接続することをお勧めします。 SSLの構成の詳細については、MySQLSSLドキュメントを参照してください。 RSAセットアップツール このプロセスを促進するために使用できます。
複製されたMySQLデータをインポートし、複製をアクティブ化する
次のステップは、データベースデータのコピーをインポートし、レプリケーションソースを設定して、レプリカデータベースサーバーを再起動することです。これで、レプリカが同期され、使用できるようになります。
-
Linuxシェルから次のコマンドを入力して、ソースデータベースをインポートします。以前にデータをエクスポートするために使用したデータベース名を指定します。
sudo mysql -u root -p < databasecopy.sql
-
MySQLシェルにログインします。
sudo mysql -u root -p
-
レプリカを停止します。
STOP REPLICA;
-
CHANGE REPLICATION SOURCE
を入力します コマンド、および次の詳細。source_ip_address
の代わりにソースデータベースサーバーのIPアドレスを使用してください 。SOURCE_USER
の場合 およびSOURCE_PASSWORD
、[レプリカの新しいMySQLユーザーの構成]セクションからレプリカのユーザー名とパスワードの詳細を入力します。SOURCE_LOG_FILE
の場合 およびSOURCE_LOG_POS
値には、SHOW MASTER STATUS;
から記録した情報を入力します コマンド。CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_ip_address',SOURCE_USER='replica_account_name', SOURCE_PASSWORD='REPLICA_PASSWORD', SOURCE_LOG_FILE='log_file_name', SOURCE_LOG_POS=log_position;
注 MySQLが推奨する接続にSSLを使用するには、属性 SOURCE_SSL=1
を追加します。 コマンドに。ソースレプリカレプリケーションコンテキストでのSSLの使用の詳細については、MySQLのドキュメントを参照してください。 -
レプリカを再起動します。
START REPLICA;
-
レプリカのステータスを確認します。レプリカはイベントを待機している必要があり、
Last_IO_Error
があってはなりません。 またはLast_Error
イベント。Slave_SQL_Running_State
エントリには、レプリカがリレーログを読み取ったことが示されている必要があります。SHOW REPLICA STATUS\G
Slave_IO_State: Waiting for master to send event Master_Host: 178.79.153.39 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 156 Relay_Log_File: mysql-relay-bin.000006 Relay_Log_Pos: 371 Relay_Master_Log_File: mysql-bin.000006 Slave_IO_Running: Yes Slave_SQL_Running: Yes .. Last_Errno: 0 Last_Error: .. 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_UUID: 5bed9d10-c140-11eb-bc63-f23c92a2a6ac Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
MySQLSource-Replicaレプリケーションをテストする
レプリカがインスタンス化される前にソースデータベースにすでにデータが入力されている場合は、追加のテストが必要です。この場合、データのインポート後に、ソースに存在するデータベースとテーブルがレプリカに存在することを確認してください。 SHOW REPLICA STATUS
で 表示、Slave_SQL_Running_State
エントリはSlave has read all relay log
と読む必要があります 。
レプリケーションが正しく行われていることを確認するには、ソースに新しいデータベースまたはテーブルを作成します。数秒後、新しいエントリがレプリカに表示されます。 SHOW DATABASES;
を使用して、データベースの存在を検証します 指図。テーブルの存在を確認するには、USE databasename;
を使用してデータベースに切り替えます。 、SHOW TABLES;
と入力します 。 SHOW REPLICA STATUS
を実行することもお勧めします コマンドを実行し、エラーがないか出力を精査します。 Last_Error
およびLast_IO_Error
フィールドは空で、レプリカは接続されたままである必要があります。
MySQLソース-レプリカレプリケーションの詳細
ソースとレプリカのレプリケーションに関する情報の最良のソースは、MySQLの公式ドキュメントです。レプリケーションに関するセクションには、アーキテクチャとインストールプロセスに関するより広範な情報が含まれています。 MySQLフォーラムも役立つかもしれません。
詳細情報
このトピックの詳細については、次のリソースを参照してください。これらは有用であることを期待して提供されていますが、外部でホストされている資料の正確性や適時性を保証することはできません。
- MySQLドキュメント