この記事では、例を使用して、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 起動パラメータ コマンドを表示する方法 (推奨)
この記事の例では、vue検証コードコンポーネントで使用される具体的な実装コードを参考までに共有してい...
目次序文zxライブラリ$`コマンド` CD()フェッチ()質問()寝る()スローしない()チョークフ...
Node-red をデータベース (mysql) に接続するには、まずコンピューターに MySQL ...
1. COUNT(*) と COUNT(COL) COUNT(*)は通常、主キーに対してインデックス...
1. はじめにデータベース内のデータ量が一定レベルに達すると、システムパフォーマンスのボトルネックを...
初心者が div+css を開発する場合、.ggg、#ccc などの形式の CSS 疑似クラス名を付...
jQuery の登場により、DOM の操作効率が大幅に向上し、開発がより高いレベルに引き上げられまし...
まず、図をダウンロードしてください 1. まず、centos7に付属しているmariadbをアンイン...
Linux 構成/ビルド システムがどのように機能するかを深く理解します。 Linux カーネル構成...
JSXとは何かJSX は Javascript の構文拡張であり、JSX = Javascript ...
序文:自動化を記述した後、毎日サーバー上で実行する必要があります。このような問題に遭遇しました。Je...
JS でよく使用されるイベントは次の通りです。ページイベント: load;フォーカス イベント: フ...
エラーメッセージ:エラー 1862 (HY000): パスワードの有効期限が切れています。ログインす...
シンプルなアプリケーションの展開1. ディレクトリ構造: └── Pythonpro #ディレクトリ...
フロントエンドテクノロジー層 (写真は少し極端ですが、参考までに) Javascript と DOM...