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 キャンバス テトリス ゲーム

推薦する

HTML テーブルタグチュートリアル (26): セルタグ

<TD> タグの属性は、テーブル内のセルのプロパティを設定するために使用されます。表 &...

HTMLフォーム送信方法のケーススタディ

フォームの送信方法をまとめると次のようになります。 1. 送信ボタンを使用して送信します。送信ボタン...

MySQL 5.7.16 無料インストール版のインストールと設定方法のグラフィックチュートリアル

この記事ではMySQL 5.7.16のインストールと設定方法を記録します。具体的な内容は以下のとおり...

JavaScriptはシンプルな計算機能を実装します

この記事では、参考までに、簡単な計算機能を実装するためのJavaScriptの具体的なコードを紹介し...

vue $http の get および post リクエストのクロスドメイン問題を解決する

Vue $http get および post リクエストのクロスドメイン問題まずconfig/ind...

ウェブタイポグラフィにおける致命的な意味的ミス 10 選

<br />これは、Steven D が書いた Web フロントエンド開発デザインの基本...

JavaScript はクリックして画像の形状を変更する (変換アプリケーション) を実装します。

JavaScriptをクリックすると画像の形状が変わります(変形の応用)。参考までに具体的な内容は...

マウスの尾行効果を実現する JavaScript

マウス効果では、setTimeout を使用して固定時間にノードを生成し、ノードを削除し、生成された...

LinuxでのMySQLのインストール手順

1. mysql tar ファイルをダウンロードします。参考: 2. インストールパッケージがあるデ...

CSS の inline-block の最小幅値の詳細な説明

序文最近、私は夜に時間を取って「CSS World」という本を読んでいます。この本は非常に興味深く、...

Windows Server 2008 R2 で忘れたパスワードを処理する方法

Windows Server 2008R2を忘れた場合の対処方法サーバーの数が多すぎる、サーバーが多...

Vue+swiperでタイムライン効果を実現

この記事では、タイムライン効果を実現するためのvue+swiperの具体的なコードを参考までに共有し...

SQL ステートメント実行の詳細な説明 (MySQL アーキテクチャの概要 -> クエリ実行プロセス -> SQL 解析順序)

序文:私はずっと、SQL 文がどのように、どのような順序で実行されるのかを知りたいと思っていました。...

21 の MySQL 標準化および最適化のベスト プラクティス!

序文良い習慣はすべて宝物です。この記事は、SQL の後悔の治療法、SQL パフォーマンスの最適化、S...