Docker ベースの MySQL マスタースレーブレプリケーション環境を構築するための実装手順

Docker ベースの MySQL マスタースレーブレプリケーション環境を構築するための実装手順

1. はじめに

以前のプログラム アーキテクチャは次の形式になります。

プログラムのサイズが大きくなると、複数のバックグラウンド サービス インスタンスに拡張する可能性がありますが、データベースはまだ 1 つしかないため、システムのボトルネックは依然としてデータベースにあります。そのため、今回の主なタスクはデータベースの拡張です。主な形式は、複数のデータベース インスタンスを拡張し、読み取りと書き込みの分離を実現し、一部の書き込みタスクをメイン データベースに割り当て、サブ データベースを読み取りタスクに使用するというものです。これによりシステムのパフォーマンスが向上します。

変更されたアーキテクチャは次のとおりです。

2. 建設前の環境

今回は環境構築にDockerを使用し、MySQLのバージョンは5.7.13を使用しています。

docker pull mysql:5.7.13

全体的な構造は次のとおりです。

  • 書き込みノードとして機能する 1 つのマスター ノード。
  • 2 つのスレーブ ノードが読み取りノードとして機能します。

まず、これらのノードを個別に起動し、異なるポートにマップします。このマシンのデータベース接続ツールを使用して接続し、正常に起動および接続されているかどうかをテストします。

docker run -p 3307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13
docker run -p 3308:3306 --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13
docker run -p 3309:3306 --name mysql-slave2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13

ここでは、マスター ノード (mysql-master) をポート3307にマップし、2 つのスレーブ ノード (mysql-slave1、2) をそれぞれポート33083309にマップします。次に、MySQL のルートパスワードを123456に設定します。

その後、 navicatなどのツールを使用して接続し、MySQL をテストできます。

これらのノードにそれぞれ入り、構成ファイルを編集します。

docker exec -it mysql-master /bin/bash

コンテナに入るには名前を使用しますが、ID に応じて選択することもできます。つまり、 docker exec -it 對應容器的id /bin/bash

viおよびvimプログラムはプリインストールされていないため、ダウンロード時にapt updateコマンドを実行し、外部ソースからダウンロードする必要があります。よく知られている理由により、速度は非常に遅いです。ダウンロード元を国内のものに変更しました。

/etc/aptフォルダに入り、まず元のファイルをバックアップします。

mv ソース.リスト ソース.リスト.bak

次に、次のコマンドを使用して新しいファイルを作成し、その内容を入力します。

echo deb http://mirrors.aliyun.com/ubuntu/ xenial メイン 制限付き宇宙 マルチバース > ソースリスト

次にapt updateなどの操作を実行し、最後にvimをインストールします。

3. マスタースレーブ構成を実行する

マスターノードの構成

マスターノードコンテナに入った後、 /etc/mysqlフォルダに入ると、主に変更されるmy.cnfファイルがあります。

このファイルを編集し、 [mysqld]を見つけて、その下に次のコマンドを追加します。

[mysqld]
...
...
## 一意の番号 server-id=101
## これは重要な設定項目です log-bin=mysql-bin

設定が完了したら、設定を有効にするために MySQL サービスを再起動する必要があります。再起動するには、 service mysql restartコマンドを使用します。再起動が完了すると、MySQL コンテナは閉じられます。コンテナdocker restart mysql-masterも再起動する必要があります。

スレーブ構成

マスターノードと同様に、 /etc/mysql/my.cnfファイルを編集します。

[mysqld]
...
...
## 一意の番号 server-id=103
## 選択してください。このノードを他のノードのマスターノードとして使用する必要がある場合は、# log-bin=mysql-bin を追加する必要があります。

マスターノードとスレーブノードのリンク

マスターノード

マスターノードコンテナでMySQL mysql -u root -pと入力します。パスワードはコンテナの起動時に設定した123456です。

MySQLに入ったら、 show master status;を実行します。

ここから、 FilePositionという 2 つの情報の値を取得します。それぞれmysql-bin.000001154です。

スレーブノード

MySQLに入り、次のコマンドを実行します。

マスターを、master_host='***'、master_port=3306、master_user='root'、master_password='123456'、master_log_file='****'、master_log_pos= *** に変更します。

これらのパラメータがそれぞれ何を意味するのか説明してください。

master_host: マスター ノードの IP アドレス。このマシンで次のコマンドを使用して、コンテナーの IP アドレスを表示できます。

docker examine --format='{{.NetworkSettings.IPAddress}}' コンテナ名 | コンテナ ID

master_port: 外部にマップされたポート番号ではなく、mysql のポート番号

master_user: mysqlのユーザー。権限が必要です。私は直接rootを使用しましたが、新しいユーザーを作成して使用することもできます。

master_password: 同期に使用するMySQLアカウントのパスワード

master_log_file: 同期に使用されるファイル、つまりマスターノードからクエリされたファイル。ここではmysql-bin.000001です。

master_log_pos: バイナリログファイルの同期を開始する位置。マスターノードからクエリされた位置です。私の場合は154です。

先ほどのコマンドを実行した後、MySQL ターミナルでshow slave status \G;を実行して、マスターとスレーブの同期ステータスを表示します。

ここで構成情報を確認すると、2 つの属性slave_io_runningslave_sql_runningが両方とも no になっていることがわかります。つまり、これらは閉じられていることを意味します。

start slaveを実行して、マスタースレーブレプリケーションを開始できます。実行後、 show slave status \G;コマンドを再度実行して、両方の属性がyesになっていることを確認します。これは、マスタースレーブレプリケーションが有効になっていることを示します。

起動に失敗した場合は、ネットワークが接続されているかどうか、同期に使用した mysql パスワードが正しいかどうか、同期ファイルの名前と場所が正しいかどうかを確認できます。

テスト

マスター データベースに新しいデータベースを作成できます。スレーブ データベースにこのデータベースが存在する場合、マスターとスレーブの同期が完了したことを意味します。

4. カスケード構成

別のバックアップ ノードを追加し、このノードをスレーブ 1 ノードからバックアップします。つまり、スレーブ 1 ノードはバックアップ ノードのマスター ノードとして機能します。これにより、マスター -> スレーブ -> バックアップのカスケード関係が形成されます。

私はもともと上記の手順に従い、それをスレーブのmy.cnfに追加しました

log-bin=mysql-slave-bin #区別するためにファイル名を変更しました

次にバックアップノードで実行します

マスターを、master_host='***'、master_user='root'、master_password='123456'、master_port=3306、master_log_file='****'、master_log_pos= *** に変更します。

コマンドは、対応するスレーブ ノードの IP およびその他の属性に置き換えられます。それは機能しないことが判明しました。プライマリノードが変更されても、バックアップノードは変更されません。

そこで調査してみると、スレーブノードのbinlogファイルには変更された情報の記録がなく、バックアップノードはこのファイルの変更を監視しているのと同等であることがわかりました。このファイルが変更されていなければ、バックアップノードには変更がないことになります。これをもう少し詳しく説明しましょう。MySQL の binlog はすべての変更を記録するので、理論的にはいつでも binlog を使用してデータベースの内容を復元できます。

したがって、マスター ノードが変更された後にスレーブ ノードの binlog ログをどのように記録するかが問題になります。

my.cnfファイルを編集するときに、 log_slave_updates=1別の行を追加できます。これにより、スレーブはマスターから同期を受け取った後、バイナリ ログを独自の binlog にも書き込むようになります。

可能です。マスターノードが変更されると、スレーブノードとバックアップノードも変更されます。バックアップノードのデータはスレーブノードからバックアップされます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker ベースの MySQL マスタースレーブ レプリケーションを実装する方法
  • MySql マスタースレーブレプリケーションを実装する Docker 方式の詳細説明 (実践編)
  • docker を使用して MySQL マスタースレーブレプリケーション環境を迅速に構築する方法の詳細な説明
  • Docker コンテナを使用して MySql マスター スレーブ レプリケーションを構築する
  • MySQL 5.7 Docker のマスタースレーブレプリケーションアーキテクチャの構築に関するチュートリアル
  • Docker で MySQL マスター スレーブ レプリケーションを実装するためのサンプル コード

<<:  MySQL 8.0.17 のインストールと設定方法のグラフィックチュートリアル

>>:  JavaScript キャンバス テトリス ゲーム

推薦する

TypeScript デコレータ定義

目次1. コンセプト1.1 定義1.2 デコレータファクトリー1.3 デコレータの組み合わせ1.4 ...

CSS3 で実装された価格表

結果: 実装コードhtml <div id="価格表" class=&qu...

Mac OS10.12 に mysql5.7.18 をインストールするチュートリアル

ウェブ全体を検索して、さまざまな落とし穴を見つけましたが、問題は解決しませんでした。ついに自分でも分...

MySQL テーブルスペースの断片化の概念と関連する問題の解決策

目次背景表領域の断片化とは何ですか?表領域の断片化を確認する方法表スペースの断片化問題を解決する方法...

JS ネイティブ 2048 ゲーム ソース コード共有 (インターネットの最新情報)

最近、アルゴリズムについて学んでいて、アルゴリズムで動く小さなゲームに出会いました。そのコードは次の...

Docker で Tomcat を使用して Web アプリケーションを迅速にデプロイする方法の例

Docker の基本的な操作を学習した後、コンテナにいくつかの基本的なアプリケーションをデプロイして...

Vueのスロットの詳細な説明

Vue でのコードの再利用により、mixnis が提供されます。テンプレートの再利用により、スロット...

Nginx http を https にアップグレードする手順を完了する

httpとhttpsの違いは一部のウェブサイトでは、http を開くと、安全ではないというメッセージ...

HTML+JS に基づくシンプルな年齢計算ツールの実装

目次序文デモンストレーション効果HTMLコードCSSコードJavascriptコードデモアドレス序文...

単一行関数と文字計算日付プロセス制御を説明する MySQL の例

目次1. キャラクター機能1. ケースコントロール機能2. キャラクターコントロール機能2. 数学関...

MySQLインスタンスが起動できない問題の分析と解決

目次序文シナリオ分析要約する序文数日前、友人がWeChatで私に連絡してきて、マシンがダウンタイムか...

nginx での listen ディレクティブの例の分析

プロットレビュー前回の記事では、ロケーション命令の解析プロセスを分析しました。この内容を簡単に確認し...

ビューポートの基本原理と詳細な使用方法

1. ビューポートの概要モバイル ブラウザは通常、画面よりも幅の広い仮想ウィンドウにページをレンダリ...

JSブラウザストレージの詳しい説明

目次導入クッキークッキーとはクッキー生成方法クッキーの適用シナリオクッキーのデメリット回避策ローカル...