この記事では、例を使用して、MySQL マスター/スレーブ レプリケーションの原理と実践について説明します。ご参考までに、詳細は以下の通りです。 導入MySQL マスター スレーブ レプリケーションは、レプリケーションや AB レプリケーションとも呼ばれます。少なくとも 2 つの MySQL サーバーが必要です (同じマシン上にあっても、異なるマシン上にあってもかまいません)。 効果
原理1. マスター サーバーの MySQL サービスは、すべての書き込み操作を binlog ログに記録し、ログ ダンプ スレッドを生成し、binlog ログをスレーブ サーバーの MySQL サービスの I/O スレッドに渡します。 注記: - マスタースレーブレプリケーションは非同期かつ論理的な SQL ステートメントレベルのレプリケーションです。 - レプリケーション中、マスターには 1 つの I/O スレッドがあり、スレーブには I/O スレッドと SQL スレッドの 2 つのスレッドがあります。 - マスタースレーブレプリケーションを実装するための必要条件は、マスターデータベースで binlog 機能を有効にすることです。 - レプリケーションとして使用されるすべての MySQL ノードのサーバー ID は同じにすることはできません。 - binlog ファイルには、データの内容を変更する SQL ステートメントのみが記録され、クエリ ステートメントは記録されません。 形状一人の主人と一人の奴隷マスター-マスターレプリケーション一人の主人に多くの奴隷複数のマスターと 1 つのスレーブ (5.7 以降でサポート)カスケードレプリケーション練習する必要マスタースレーブレプリケーションモードを実装し、同じホスト上に2つのMySQLインスタンスを配置する 環境マック: 10.15.1 Docker: 2.0.0.3 // Docker を使用して MySQL をインストールする主な目的は、管理とメンテナンスの容易さ、独立した IP、数秒での起動です。MySQL-master: 5.7.29 // メイン サーバー MySQL-master IP: 172.17.0.3 MySQL-slave: 5.7.29 // サーバーからの MySQL-slave IP: 172.17.0.4 ステップステップ1: 2つのMySQLサーバーを準備するmysql-master (マスターサーバー): 1. ディレクトリ構造を作成します。 マスター/conf、マスター/データ、マスター/ログ 2. 実行中のインスタンス コンテナを起動します。 docker run --name mysql-master > -p 3310:3306 > -v ~/docker/master/conf:/etc/mysql/conf.d > -v ~/docker/master/data:/var/lib/mysql > -v ~/docker/master/logs:/var/log/mysql > -e MYSQL_ROOT_PASSWORD=123456 > -d mysql:5.7 3. コンテナに入る docker exec -it mysql-master bash 4. MySQLにログインする mysql -uroot -p mysql-slave (スレーブサーバー): 1. ディレクトリ構造を作成します。 スレーブ/conf、スレーブ/データ、スレーブ/ログ 2. 実行中のインスタンス コンテナを起動します。 docker run --name mysql-slave > -p 3310:3306 > -v ~/docker/slave/conf:/etc/mysql/conf.d > -v ~/docker/slave/data:/var/lib/mysql > -v ~/docker/slave/logs:/var/log/mysql > -e MYSQL_ROOT_PASSWORD=123456 > -d mysql:5.7 3. コンテナに入る docker exec -it mysql-slave bash 4. MySQLにログインする mysql -uroot -p ステップ2: 設定ファイル(my.cnf)を変更するプライマリサーバー: [mysqld] ポート = 3306 サーバーID = 1 #同期するデータベース binlog-do-db = school #バイナリログファイルを生成するには、マスターサーバーでlog-bin = mysql-binを有効にする必要があります MySQLを再起動します: docker restart mysql-master サーバーから: [mysqld] ポート = 3306 サーバーID = 2 #同期するデータベース binlog-do-db = school #バイナリログファイルを生成するには(サーバーからのオプション) ログ bin = mysql bin MySQLを再起動します: docker restart mysql-slave ステップ3: マスターサーバーのレプリケーションユーザーと関連する権限を作成するcreate user 'slave'@'%' identified by '123456'; //ユーザーを作成 grant replication slave,replication client on *.* to 'slave'@'%'; //ユーザー権限を設定 flush privileges; //権限を更新 show grants for 'slave'@'%'; //ユーザー権限を表示 ステップ4: データのバックアップと同期1. マスターにログインし、テーブルロック操作mysql -uroot -pを実行します。 読み取りロック付きでテーブルをフラッシュします。 2. マスターで同期する必要があるDBのデータをダンプします。mysqldump -uroot -p school > school.dump 3. スレーブにデータをインポートする mysql -uroot -h172.17.0.4 -p 学校 < 学校.dump 4. マスターのロックを解除する テーブルのロックを解除します。 ステップ5: マスターサーバーのレプリケーションステータス1. 新しいデータテーブルを作成し、データを追加します。create table user( id int(10) auto_increment, name varchar(30), primary key (id) )charset=utf8mb4; ユーザー(名前)値(222)に挿入します。 2. マスター サーバーの binlog レコードのステータス mysql> show master status; +------------------+----------+--------------+------------------+------------------+ | ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------+ | mysql-bin.000001 | 769 | 学校 | | | +------------------+----------+--------------+------------------+------------------+ ステップ6: サーバーからコピーを開始する1. マスターサーバーに接続し、レプリケーションの開始ノードを設定します。mysql> マスターをmaster_host='172.17.0.3'に変更します。 -> マスターポート=3306、 -> マスターユーザー='スレーブ'、 -> マスターパスワード='123456', -> マスターログファイル='mysql-bin.000001', -> マスターログ位置 = 769; 2. レプリケーションを開始します。スレーブを起動します。 3. レプリケーションステータスを確認する mysql> show slave status \G ************************** 1. 行 **************************** Slave_IO_State: マスターがイベントを送信するのを待機中 マスターホスト: 172.17.0.3 マスターユーザー: スレーブ マスターポート: 3306 接続再試行: 60 マスターログファイル:mysql-bin.000001 読み取りマスターログ位置: 961 リレー ログ ファイル: 87dc5224655d-relay-bin.000003 リレーログ位置: 320 リレーマスターログファイル: mysql-bin.000001 Slave_IO_Running: Yes //I/O スレッドが正常に読み取りを行ったことを示します Slave_SQL_Running: Yes //SQL スレッドが正常に実行されたことを示します Replicate_Do_DB: レプリケート_無視_DB: テーブルの複製: 無視テーブルを複製: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: 最終エラー番号: 0 最終エラー: スキップカウンタ: 0 実行マスターログポジション: 961 リレーログスペース: 892 Until_Condition: なし ログファイルまで: ログ位置まで: 0 マスターSSL許可: いいえ マスターSSLCAファイル: マスターSSLCAパス: マスターSSL証明書: マスターSSL暗号: マスターSSLキー: マスターより遅れている秒数: 0 Master_SSL_Verify_Server_Cert: いいえ 最終IOエラー番号: 0 最後のIOエラー: 最終SQLエラー番号: 0 最後のSQLエラー: Replicate_Ignore_Server_Ids: マスターサーバーID: 1 マスター_UUID: 45540733-4e0c-11ea-b0ac-0242ac110003 マスター情報ファイル: /var/lib/mysql/master.info SQL_遅延: 0 SQL_残り遅延: NULL Slave_SQL_Running_State: スレーブはすべてのリレーログを読み取りました。さらに更新を待機しています。 マスター再試行回数: 86400 マスターバインド: 最終IOエラータイムスタンプ: 最終SQLエラータイムスタンプ: マスターSSL証明書: マスターSSLCrlパス: 取得済み_Gtid_Set: 実行されたGtidセット: 自動位置: 0 Replicate_Rewrite_DB: チャンネル名: マスター TLS バージョン: 4. データテーブルを表示する datamysql> show create table user\G ************************** 1. 行 **************************** テーブル: ユーザー テーブルの作成: CREATE TABLE `user` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(30) デフォルト NULL, 主キー (`id`) ) エンジン=InnoDB AUTO_INCREMENT=2 デフォルト文字セット=utf8mb4 mysql> ユーザーから * を選択します。 +----+------+ | ID | 名前 | +----+------+ | 1 | 222 | +----+------+ コピー制御関連のコマンド: stop salve //スレーブ接続を停止 reset slave //スレーブ接続をリセット start slave //スレーブ接続を開く stop master //マスター接続を停止 reset master //マスター接続をリセット start master //マスター接続を開く ステップ7: マスターサーバーとスレーブサーバーのプロセスを確認するmysqlマスター: mysqlスレーブ: MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキル」、および「MySQL データベース ロック関連スキルの概要」 この記事が皆様のMySQLデータベース設計に役立つことを願っています。 以下もご興味があるかもしれません:
|
<<: vue3.0+echarts は 3 次元の縦棒グラフを実現します
>>: docker run 起動パラメータ コマンドを表示する方法 (推奨)
目次DockerバージョンCentOS に Docker エンジンをインストールするシステム要件古い...
この記事では、MySQL 8.0.15のインストールと設定方法を参考までに紹介します。具体的な内容は...
<br />関連記事: ハイパーリンクを表示して開く方法症状<br />ユー...
目次主キー制約一意の主キー非 Null 制約デフォルトの制約外部キー制約1NF 2NF 3NFデータ...
1つ。 IE8 互換表示の概要<br />新しいバージョンのブラウザが古い Web サイ...
目次ステップ1: CentOS 8でパッケージを更新するステップ2: CentOS 8にNginx ...
最近、プロジェクトでは kubernetes (以下、k8s と表記、k と s の間には 8 つの...
MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明以下は私が作成した M...
目次1. オブジェクトの変更検出2. オブジェクトに関する質問配列変更検出3.1 背景3.2 実装I...
現在、プロジェクトの要件により、フォームの送信を制御し、送信前にデータを検証および処理するために j...
目次1. マージインターフェース1.1 非関数メンバー1.2 関数メンバー序文:今日お話ししたいのは...
Zabbix カスタム スクリプトを使用して監視データを収集する場合、通常、次の問題が発生します。サ...
0. はじめに2016 年 8 月 18 日 今日、iPhone をスライドさせてロックを解除すると...
冒頭に書いた以前、Renren で JS ベースのスクリーンショット ソリューションについて説明した...
この記事では、explain を使用して SQL ステートメントを分析する方法を紹介します。実際、イ...