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でブーストライブラリをインストールするための完全な手順

推薦する

Dockerはコンテナポートバインディングのローカルポートを実装します

今日、イメージを起動した後、HTTP リクエスト経由でアクセスできないという小さな問題が発生しました...

IE をフリーズさせる HTML コード

任意のテキスト エディターを開き、次のコードをコピーして、たとえば SomeFilename.htm...

RedisとMySQLの違いを簡単に説明してください

MySQL はディスクに保存される永続的なストレージであり、取得には一定の IO が伴うことはご存じ...

Dockerでrabbitmqをデプロイする際に発生した2つの問題

1. 背景DockerでRabbitMQをデプロイする際に、次の2つの問題が発生します。問題1: ス...

MySQL エラー: 接続数が多すぎる場合の解決策

MySQLデータベースの接続が多すぎますこのエラーは明らかに、mysql_connect の後に m...

CSS メニューボタンアニメーション

ドロップダウンメニューを書くには、ボタンをクリックします。メニューの入り口はアイコンボタンをクリック...

Docker に fastdfs イメージをインストールする際の注意事項

1. Docker環境を準備する2. fastdfsイメージを検索する 3. イメージをプルするdo...

Vue2.0は適応解像度を実装する

この記事では、適応解像度を実現するためのVue2.0の具体的なコードを参考までに紹介します。具体的な...

CSS を使用して複数の方法で等幅レイアウトを実装するサンプルコード

この記事で説明する等幅レイアウトでは、純粋な CSS を使用して、要素の幅を手動で設定することなく、...

Win10システムにMySQL 8.0をインストールするときに発生する問題を解決する

Win10 システムに MySQL 8.0 をインストールする際に発生する問題と解決策は次のとおりで...

jconsole を使用してリモート Tomcat サービスを監視する方法

JConsoleとはJConsole は Java 5 で導入されました。 JConsole は、コ...

JavaScript の例におけるループの使用法の詳細な説明

退屈だったので、ループに関する簡単な演習をいくつかまとめてみました。JS を学び始めたばかりの方に役...

最新のウェブフロントエンドフレームワーク10選を紹介(翻訳)

Web 開発の世界では、フレームワークは非常に一般的です。新しいフレームワークやテンプレートが毎日の...

Webpack コンポーネントの使用状況統計を実装するための 50 行のコード

背景最近、リーダーからコンポーネント ライブラリを構築するように依頼があり、プロジェクトで現在使用さ...

Facebook によるインターネット サービスのほぼ完璧な再設計

<br />出典: http://www.a-xuan.cn/?p=197 先ほどFac...