MySQL レプリケーションの詳細な説明と簡単な例

MySQL レプリケーションの詳細な説明と簡単な例

MySQL レプリケーションの詳細な説明と簡単な例

マスタースレーブレプリケーション技術は、MySQL で広く使用されており、主に 1 つのサーバー上のデータを複数のスレーブサーバーに同期するために使用されています。負荷分散、高可用性、フェイルオーバーの実現、バックアップの提供などに使用できます。 MySQL は、一方向、半同期、非同期レプリケーションなどのさまざまなレプリケーション テクノロジや、データベース レベル、テーブル レベル、データベース間同期などのさまざまなレベルのレプリケーションをサポートしています。この記事では、基本的なマスター スレーブ レプリケーションについて簡単に説明し、例を示します。

1. 複製の基本原理(手順)

a. マスターデータベースに記録されたデータ変更のバイナリログ
b. スレーブ データベースの I/O スレッドがマスター データベースに接続し、バイナリ ログ ファイルを送信するように要求します (マスター データベースの binlog dump スレッドがバイナリ ログの内容をスレーブ データベースに送信します)。
c. スレーブのI/Oスレッドは、マスターサービスから送信されたバイナリコンテンツを読み取り、リレーログにコピーします。
d. スレーブ上のSQLスレッドはリレーログを読み取り、ログに含まれる更新を実行します。

2. 設定ファイルにコピー項目を追加する

# この記事のデモンストレーションは、同じサーバー上のマルチインスタンス環境に基づいており、ポート 3406 がマスター ライブラリとして使用され、ポート 3506 がスレーブ ライブラリとして使用されます。 
# マルチインスタンス展開の詳細については、以下を参照してください。 
# MySQL マルチインスタンス構成 (I) http://blog.csdn.net/leshami/article/details/40339167 
# MySQL マルチインスタンス構成 (パート 2) http://blog.csdn.net/leshami/article/details/40339295 
# 3406 と 3506 は両方とも新しくインストールされ、デフォルトのライブラリが含まれているため、この記事では、プライマリ ライブラリからスタンバイ ライブラリにデータを移行する手順と、プライマリ ライブラリ上の構成ファイルは説明しません。# my3406.cnf の詳細  
[mysqld] 
ソケット = /tmp/mysql3406.sock 
ポート = 3406 
pid ファイル = /data/inst3406/data3406/my3406.pid 
ユーザー = mysql 
ログエラー=/data/inst3406/data3406/inst3406.err 
データディレクトリ=/data/inst3406/data3406 
ベースディレクトリ=/app/soft/mysql5 
 
#### マスターアイテムの場合 #### 
サーバーID=3406 
log_bin=/data/inst3406/log/bin/inst3406bin 
innodb_flush_log_at_trx_commit=1 
同期バイナリログ=1 
 
b. ライブラリの設定ファイルから# more my3506.cnf  
[mysqld] 
socket = /tmp/mysql3506.sock # 作者: Leshami 
port = 3506 # ブログ: <a target="_blank" href="http://blog.csdn.net/leshamipid-file" rel="external nofollow" >http://blog.csdn.net/leshami 
pid ファイル = /data/inst3506/data3506/my3506.pid 
ユーザー = mysql 
ログエラー=/data/inst3506/data3506/inst3506.err 
データディレクトリ=/data/inst3506/data3506 
ベースディレクトリ=/app/soft/mysql5 
 
#### スレーブアイテムの場合 #### 
サーバーID=3506 
リレーログ=/data/inst3506/log/リレー/リレー-bin 
読み取り専用=1 

3. コピーアカウントを作成する

#ポート3406でインスタンスを起動し、アカウント[mysql@app ~]を追加します$ mysqld_safe --defaults-file=/data/inst3406/data3406/my3406.cnf & 
[mysql@app ~]$ mysql -P3406 #3406にログイン 
 
master@localhost[(none)]> 'server_id'のような変数を表示します。 
+---------------+-------+ 
| 変数名 | 値 | 
+---------------+-------+ 
| サーバーID | 3406 | 
+---------------+-------+ 
 
#レプリケーション用のアカウントを作成します。master@localhost[(none)]> grant replication slave,replication client on *.* 
  -> 'repl' で識別される repl@'192.168.1.177' へ; 
 
#メインデータベースのログファイルを初期化し、ビルド環境ではリセットを慎重に使用してください 
master@localhost[(なし)]> マスターをリセットします。 
クエリは正常、影響を受けた行は 0 行 (0.01 秒) 
 
#メインデータベースのステータスを確認し、ログを 000001 に初期化します。 
master@localhost[(none)]> マスターステータスを表示、位置は120 
+--------------------+----------+--------------+------------------+-------------------+ 
| ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | 
+--------------------+----------+--------------+------------------+-------------------+ 
| inst3406bin.000001 | 120 | | | | 
+--------------------+----------+--------------+------------------+-------------------+ 

4. マスタースレーブ同期を構成する

#ポート3506でインスタンスを起動します [mysql@app ~]$ mysqld_safe --defaults-file=/data/inst3506/data3506/my3506.cnf & 
 
[mysql@app ~]$ msyql -P3506 
 
slave@localhost[(none)]> 'server_id'のような変数を表示します。 
+---------------+-------+ 
| 変数名 | 値 | 
+---------------+-------+ 
| サーバー ID | 3506 | 
+---------------+-------+ 
セット内の 1 行 (0.00 秒) 
 
#スレーブ データベースのマスター データベースを指す関連構成情報を追加します。このコマンドは、スタンバイ データベースの master.info ファイルと relay-log.info ファイルを生成して変更します。slave@localhost[(none)]> CHANGE MASTER TO MASTER_HOST='192.168.1.177', 
  -> MASTER_USER='repl'、 
  -> MASTER_PASSWORD='repl', 
  -> マスターポート=3406、 
  -> MASTER_LOG_FILE='inst3406bin.000001'、 
  -> MASTER_LOG_POS=0; 
クエリは正常、影響を受けた行は 0 行、警告は 2 個 (0.04 秒) 
 
#2つの警告が表示されました。slave@localhost[(none)]> show warnings を確認してください \G 
************************** 1. 行 **************************** 
 レベル: メモ 
  コード: 1759 
メッセージ: SSL/TLS を使用せずにプレーンテキストでパスワードを送信することは、非常に安全ではありません。 
************************** 2. 行 **************************** 
 レベル: メモ 
  コード: 1760 
メッセージ: MySQL ユーザー名またはパスワード情報を master.info リポジトリに保存することは安全ではないため、推奨されません。  
この問題と可能な代替案の詳細については、MySQL マニュアルを参照してください。 
セット内の 2 行 (0.00 秒) 
 
#この時点でスレーブのステータス情報を確認します。slave@localhost[(none)]> show slave status \G 
************************** 1. 行 **************************** 
        スレーブ_IO_状態:  
         マスターホスト: 192.168.1.177 
         マスターユーザー: repl 
         マスターポート: 3406 
        接続再試行: 60 
       マスターログファイル: inst3406bin.000001 
     読み取りマスターログ位置: 4 
        リレーログファイル: リレーbin.000001 
        リレーログ位置: 4 
    リレーマスターログファイル: inst3406bin.000001 
       Slave_IO_Running: いいえ #IO スレッドは実行されていません Slave_SQL_Running: いいえ #SQL スレッドは実行されていません...................... 
       マスター情報ファイル: /data/inst3506/data3506/master.info 
 
slave@localhost[(none)]> start slave; #スレーブを起動 
クエリは正常、影響を受けた行は 0 行 (0.01 秒) 
 
#意味は以下のとおりです。thread_typeオプションなしのSTART SLAVEは両方のスレーブスレッドを開始します。I/Oスレッドは読み取ります。 
マスターサーバーからイベントを読み取り、リレーログに保存します。SQLスレッドは、 
リレーログを出力して実行します。 
 
# スレーブのステータスを再度確認します robin@localhost[(none)]> show slave status\G 
************************** 1. 行 **************************** 
        Slave_IO_State: マスターがイベントを送信するのを待機中 
         マスターホスト: 192.168.1.177 
         マスターユーザー: repl 
         マスターポート: 3406 
        接続再試行: 60 
       マスターログファイル: inst3406bin.000001 
     読み取りマスターログ位置: 120 
        リレーログファイル: リレーbin.000002 
        リレーログ位置: 285 
    リレーマスターログファイル: inst3406bin.000001 
       Slave_IO_Running: はい #IO スレッドは実行状態です Slave_SQL_Running: はい #SQL スレッドは実行状態です............. 
     実行マスターログ位置: 120 
       リレーログスペース: 452 
           ............ 
       マスターサーバー ID: 3406 
         マスター_UUID: 32f53a0a-63ef-11e4-93d9-8c89a5d108ae 
       マスター情報ファイル: /data/inst3506/data3506/master.info 
          SQL_遅延: 0 
     SQL_残り遅延: NULL   
   Slave_SQL_Running_State: スレーブはすべてのリレー ログを読み取りました。スレーブ I/O スレッドがそれを更新するのを待機しています。#重要なプロンプト情報#スレーブ ライブラリには 2 つのスレッドがあります。1 つは I/O スレッド用で、マスター ライブラリに接続してマスター ライブラリに binlog の送信を要求するために使用されます。もう 1 つは SQL を実行するための SQL スレッドです。 
スレーブ@localhost[(なし)]> プロセスリストを表示\G 
************************** 1. 行 **************************** 
   識別子: 4 
  ユーザー: システムユーザー 
  ホスト:  
   デシベル: NULL 
コマンド: 接続 
  時間: 510993 
 状態: マスターがイベントを送信するのを待機中 
  情報: NULL 
************************** 2. 行 **************************** 
   識別子: 5 
  ユーザー: システムユーザー 
  ホスト:  
   デシベル: NULL 
コマンド: 接続 
  時間: 333943 
 状態: スレーブはすべてのリレーログを読み取りました。スレーブ I/O スレッドがそれを更新するのを待機しています。 
  情報: NULL 

5. 同期を確認する

#次に、マスター データベースでいくつかの操作を実行して、スレーブ データベースの同期ステータスを確認します。master@localhost[(none)]> show variables like 'server_id'; 
+---------------+-------+ 
| 変数名 | 値 | 
+---------------+-------+ 
| サーバーID | 3406 | 
+---------------+-------+ 
セット内の 1 行 (0.00 秒) 
 
#マスターデータベースの Binlog Dump スレッドは、binlog ログファイルをスレーブデータベースに送信するために使用されます。次のクエリは、master@localhost[(none)]> show processlist\G です。 
************************** 1. 行 **************************** 
   識別子: 12 
  ユーザー: repl 
  ホスト: 192.168.1.177:57440 
   デシベル: NULL 
コマンド: Binlog ダンプ 
  時間: 511342 
 状態: マスターはすべてのバイナリログをスレーブに送信しました。バイナリログが更新されるのを待機しています。 
  情報: NULL 
   
# メインライブラリにデータベースとテーブルを作成します。master@localhost[(none)]> create database tempdb; 
クエリは正常、1 行が影響を受けました (0.01 秒) 
 
master@localhost[(なし)]> tempdbを使用する 
データベースが変更されました 
master@localhost[tempdb]> information_schema.enginesからselect *としてテーブルtb_enginesを作成します。 
クエリは正常、9 行が影響を受けました (0.02 秒) 
記録: 9 重複: 0 警告: 0 
 
#以下はスレーブライブラリから確認した結果です。slave@localhost[(none)]> select count(*) from tempdb.tb_engines; 
+----------+ 
| カウント(*) | 
+----------+ 
| 9 | 
+----------+ 

読んでいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQL マスタースレーブレプリケーションの原理と設定方法(詳細)
  • あるテーブルのフィールドの内容を別のテーブルのフィールドにコピーする MySQL の SQL 文の書き方
  • MySQLデータテーブルフィールドの内容に対するバッチ変更、クリア、コピー、その他の更新コマンド
  • MySQLでテーブル構造をコピーする方法の概要
  • テーブル構造と内容を別のテーブルにコピーする MySQL SQL ステートメント
  • MySQL でのテーブルレプリケーション: create table like および create table as select
  • Windows での MySQL 自動バックアップのバッチ処理の実装 (ディレクトリのコピーまたは mysqldump バックアップ)
  • MySQL マスタースレーブレプリケーション(マスタースレーブ)の実際の動作例

<<:  vue3.0 でカルーセル コンポーネントをカプセル化する手順

>>:  Linuxでブーストライブラリをインストールするための完全な手順

推薦する

Vue 組み込みコンポーネントのキープアライブでの LRU アルゴリズムの使用

目次Vue の keep-alive 組み込みコンポーネントの使用でもこのアルゴリズムが使用されます...

$remote_addr に基づく nginx フロントエンド配布方法の詳細な説明

要件は次のとおりです。ドメイン名の下に複数のサーバーがあります。現在、特定の地域をテストしています。...

MySQL が暗黙のデフォルト値を処理する方法

何人かの学生は、マスターとスレーブの間の不一致の問題に遭遇したと述べました。一般的な状況としては、m...

docker-maven-plugin の詳細な使用方法

目次Docker-Maven-プラグインMavenプラグインの自動デプロイメント手順1. ホストマシ...

CSS3で実装されたサムネイルホバー効果

成果を達成する実装コードhtml <ヘッダー> <h1><em>...

Docker コンテナにデプロイされた Django のタイムゾーンの問題

目次Django でのタイムゾーン設定USE_TZ=真USE_TZ=偽Linux コンテナでのタイム...

MySQLの7種類のログの概要

MySQL には次のログ ファイルがあります。 1: 再実行ログ2: ロールバックログ(元に戻すログ...

トップナビゲーションバー機能を実現するCSS+HTML

ナビゲーション バー、固定トップ ナビゲーション バー、およびセカンダリ メニューの実装効果図の実装...

WebプロジェクトのDockerデプロイメントの実装

前回の記事では、docker サービスをインストールしました。引き続き、Web プロジェクトのデプロ...

CSS における px、em、rem、pt の特徴、違い、変換について詳しく説明します。

コンセプト紹介: 1. px (ピクセル):仮想的な長さの単位で、コンピュータ システムのデジタル画...

Vueは秒殺しのカウントダウンコンポーネントを実装する

この記事では、2番目のキルカウントダウンコンポーネントを実装するためのVueの具体的なコードを参考ま...

MySQLコマンドプロンプトで入力エラーが発生したときに前のコマンドを修正する方法

目次現在の問題解決プロセス具体的な手順解決した事件現在の問題MySQL コマンド プロンプトに複数行...

Mysql Explainコマンドの使用と分析

mysql explain コマンドは、MySQL がインデックスを使用して選択ステートメントを処理...

JavaScript イベント ループのケース スタディ

js のイベント ループJavaScript はシングルスレッドなので、同じイベントで実行できるメソ...

CSS の :focus-within の楽しさについて簡単に説明します

Bステーションでパスワードを入力するときに目を覆っているこの画像を見たことがある人もいると思いますこ...