MySQL のマスタースレーブレプリケーションと読み取り書き込み分離の原理と使用法の詳細な説明

MySQL のマスタースレーブレプリケーションと読み取り書き込み分離の原理と使用法の詳細な説明

この記事では、例を使用して、MySQL マスター/スレーブ レプリケーションと読み取り/書き込み分離の原理と使用方法を説明します。ご参考までに、詳細は以下の通りです。

マスタースレーブレプリケーション

ここに画像の説明を挿入

コンセプト

MySQL-A データベースに影響する操作は、データベース上で実行された後、ローカル ログ システム A に書き込まれます。
ログシステム内の変更されたデータベースイベント操作が、MYSQL-A のポート 3306 のネットワークを介して MYSQL-B にリアルタイムで送信されると仮定します。
MYSQL-B はそれを受信すると、それをローカル ログ システム B に書き込み、データベース内でデータベース イベントを 1 つずつ完了します。
すると、MYSQL-A が変更されると、MYSQL-B も変更されます。これがいわゆる MYSQL レプリケーションです。
上記のモデルでは、MYSQL-A がマスター サーバー、MYSQL-B がスレーブ サーバーです。
ログ システム A は、実際には MYSQL ログ タイプのバイナリ ログであり、データベース テーブルを変更するすべてのアクション (つまり、バイナリ ログ) を保存するために特に使用されます。 [MYSQL は、トランザクションのセキュリティを確保するために、ステートメントの実行後、ロックを解除する前にバイナリ ログに書き込みます。]
ログシステムBはバイナリログではありません。MYSQL-Aのバイナリログからコピーされており、自身のデータベース変更によって生成されたものではないため、リレー感がありリレーログと呼ばれます。
上記のメカニズムにより、MYSQL-A と MYSQL-B のデータベース データの一貫性は保証されますが、時間の遅延が確実に発生し、つまり MYSQL-B のデータが遅れていることがわかります。
ネットワーク要因を考慮しなくても、MYSQL-A のデータベース操作は同時に実行できますが、MYSQL-B はリレー ログから 1 つのエントリのみを読み取って実行できます。そのため、MYSQL-A は頻繁に書き込みを行い、MYSQL-B が追いつけない可能性があります。 】

問題を解決する

データ損失の防止方法、バックアップ、読み取りと書き込みの分離、データベースの負荷分散、高可用性

環境構築

1. 環境を準備します。2 つの Windows オペレーティング システムの IP アドレスは、172.27.185.1 (マスター) と 172.27.185.2 (スレーブ) です。
2. マスター サービス (172.27.185.1) サーバーに接続し、スレーブ ノードにアカウント権限を割り当てます。
'root'@'172.27.185.2' ('root' によって識別) にレプリケーション スレーブを許可します
3. メインサービスのmy.iniファイルに追加します

サーバーID=200
ログ bin = mysql bin
リレーログ=リレービン
リレーログインデックス=リレービンインデックス

MySQLサービスを再起動する
4. スレーブサービスのmy.iniファイルに追加します。

サーバーID = 210
replicate-do-db =itmayiedu #データベースの同期が必要

MySQLサービスを再起動する
5. サービスからマスターデータベースを同期する

奴隷を停止します。
変化
マスターをmaster_host='172.27.185.1'、master_user='root'、master_password='root'に設定します。
スレーブを起動します。
スレーブステータスを表示します。

注意: ①同じLAN内にいることを確認してください ②360WiFiを使用してLANを作成してください ③すべてのファイアウォールをオフにすることをお勧めします

読み書き分離とは

データベース クラスター アーキテクチャでは、マスター データベースはトランザクション クエリの処理を担当し、スレーブ データベースは選択クエリの処理のみを担当するため、両者の分担が明確になり、データベースの全体的な読み取りおよび書き込みパフォーマンスが向上します。もちろん、マスター データベースのもう 1 つの機能は、トランザクション クエリによって発生したデータの変更をスレーブ データベースに同期すること (書き込み操作) です。

読み取りと書き込みの分離の利点

1) サーバーの負荷を分散し、マシンのシステム処理効率を向上させます。読み取りと書き込みの分離は、読み取りが書き込みをはるかに上回るシナリオに適しています。選択が多いサーバーがある場合、更新と削除はこれらの選択によってアクセスされているデータによってブロックされ、選択が終了するまで待機します。同時実行パフォーマンスは高くありません。マスターとスレーブは、自分の書き込みと読み取りのみを担当するため、X ロックと S ロックの競合が大幅に緩和されます。
マスターが 1 台、スレーブが 3 台あり、上記 1. のスレーブ ライブラリの一方的な設定は無視し、1 分間に書き込みが 10 回、読み取りが 150 回あると仮定します。次に、マスター 1 台とスレーブ 3 台は合計 40 回の書き込みに相当しますが、読み取りの合計数は変わらないため、平均して各サーバーは 10 回の書き込みと 50 回の読み取りを担当します (マスター データベースは読み取り操作を実行しません)。したがって、書き込みは変更されませんが、読み取りは大幅に分散され、システム パフォーマンスが向上します。さらに、読み取りが償却されると、書き込みパフォーマンスが間接的に向上します。したがって、全体的なパフォーマンスが向上しました。簡単に言えば、マシンと帯域幅をパフォーマンスと交換することを意味します。
2) 冗長性を高め、サービスの可用性を向上します。データベース サーバーがダウンした場合、別のスレーブを調整して、できるだけ早くサービスを回復できます。

マスタースレーブ複製原理

バイナリ ログ、binary-log に依存します。
バイナリログはデータベースに変更を加えるステートメントを記録します
テーブルの挿入、削除、更新、作成

スケールアップとスケールアウトの違い

スケールアウトとは、アプリケーションを水平方向に拡張できることを意味します。一般的に、データ センター アプリケーションの場合、スケール アウトとは、マシンを追加しても、アプリケーションがこれらのマシンのリソースを有効に活用して効率を向上させ、優れたスケーラビリティを実現できることを意味します。
スケールアップとは、アプリケーションを垂直方向に拡張できることを意味します。一般的に、単一のマシンの場合、スケールアップとは、コンピューティング ノード (マシン) が CPU コアやストレージ デバイスを追加し、より大きなメモリを使用すると、アプリケーションがこれらのリソースを最大限に活用して効率を向上させ、優れたスケーラビリティを実現できることを意味します。

マイキャット

Mycatとは

オープンソースの分散データベースシステムです。ただし、データベースは一般的に独自のデータベースエンジンを持っているのに対し、Mycat は独自のデータベースエンジンを持っていないことから、厳密には完全なデータベースシステムとは言えません。あくまでアプリケーションとデータベースの橋渡しをするミドルウェアとしか言えません。
Mycat ミドルウェアが登場する前は、MySQL マスター スレーブ レプリケーション クラスターで読み取りと書き込みの分離を実現する場合、通常はプログラム セグメントで実行していました。これにより、データ セグメントとプログラム間の結合が高すぎるという問題が発生しました。データベースのアドレスが変更された場合、それに応じて My プログラムを変更する必要があります。データベースが誤ってハングアップした場合、プログラムが使用できなくなることも意味し、多くのアプリケーションでは受け入れられません。

Mycat ミドルウェアを導入すると、プログラムとデータベースを効果的に分離できます。これにより、プログラムは、基盤となるデータベースがどのようにサービスを提供するかを知らなくても、データベース ミドルウェアのアドレスに注意を払うだけで済みます。多数の一般的なデータ集約、トランザクション、データ ソースの切り替えなどのタスクは、ミドルウェアによって処理されます。
Mycat ミドルウェアの原理は、データをシャーディングすることです。元のデータベースから、複数のシャード データベースに分割されます。すべてのシャード データベース クラスターが完全なデータベース ストレージを構成します。これは、ディスク アレイの RAID0 に似ています。

Mycatのインストール

テーブル構造を作成する

`weibo_simple`が存在しない場合はデータベースを作成します。
-- ------------------------------------
-- `t_users` ユーザーテーブルのテーブル構造 -- ------------------------------------
`t_users` が存在する場合はテーブルを削除します。
テーブル `t_users` を作成します (
 `user_id` varchar(64) NOT NULL COMMENT '登録ユーザーID',
 `user_email` varchar(64) NOT NULL COMMENT '登録ユーザーのメールアドレス',
 `user_password` varchar(64) NOT NULL COMMENT '登録ユーザーパスワード',
 `user_nikename` varchar(64) NOT NULL COMMENT '登録ユーザーのニックネーム',
 `user_creatime` datetime NOT NULL COMMENT '登録時間',
 `user_status` tinyint(1) NOT NULL COMMENT '検証ステータス 1: 検証済み 0: 未検証',
 `user_deleteflag` tinyint(1) NOT NULL COMMENT '削除マーク 1: 削除済み 0: 削除されていない',
 主キー (`user_id`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

-- -------------------------------------
-- `t_message` マイクロブログ テーブルのテーブル構造 -- -------------------------------------
`t_message` が存在する場合はテーブルを削除します。
テーブル `t_message` を作成します (
 `messages_id` varchar(64) NOT NULL COMMENT 'Weibo ID',
 `user_id` varchar(64) NOT NULL COMMENT '投稿ユーザー',
 `messages_info` varchar(255) デフォルト NULL コメント 'Weiboコンテンツ',
 `messages_time` datetime DEFAULT NULL COMMENT 'リリース時間',
 `messages_commentnum` int(12) DEFAULT NULL COMMENT 'コメント数',
 `message_deleteflag` tinyint(1) NOT NULL COMMENT '削除マーク 1: 削除済み 0: 削除されていない',
 `message_viewnum` int(12) DEFAULT NULL COMMENT 'ビュー数',
 主キー (`messages_id`)、
 キー `user_id` (`user_id`),
 制約 `t_message_ibfk_1` 外部キー (`user_id`) 参照 `t_users` (`user_id`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

server.xml を構成する

	<!-- ユーザーを追加 -->
  <ユーザー名="mycat">
  <property name="password">mycat</property>
  <property name="schemas">mycat</property>
  </ユーザー>
	
	<!-- ユーザーを追加 -->
  <ユーザー名="mycat_red">
  <property name="password">mycat_red</property>
  <property name="schemas">mycat</property>
	<プロパティ名="readOnly">true</プロパティ>
  </ユーザー>

schema.xml を構成する

<?xml バージョン="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:スキーマ xmlns:mycat="http://org.opencloudb/">
  <!-- server.xml 内のユーザーのスキーマ名と同じ -->
  <スキーマ名="mycat" checkSQLschema="true" sqlMaxLimit="100">
    <テーブル名="t_users" プライマリキー="user_id" データノード="dn1" ルール="rule1"/>
   
    <テーブル名="t_message" タイプ="global" プライマリキー="messages_id" データノード="dn1" />
  </スキーマ>
<dataNode 名="dn1" データホスト="jdbchost" データベース="weibo_simple


" />
  
  <dataHost name="jdbchost" maxCon="1000" minCon="10" バランス="1"
        writeType="0" dbType="mysql" dbDriver="ネイティブ" switchType="1"
        スレーブしきい値="100">
     <heartbeat>ユーザーを選択()</heartbeat> 
    <writeHost ホスト="hostMaster" url="172.27.185.1:3306" ユーザー="root" パスワード="root">
    </writeHost>
    <writeHost ホスト="hostSlave" url="172.27.185.2:3306" ユーザー="root" パスワード="root"/>
  </データホスト>
  
</mycat:スキーマ>

ルール.xmlファイルを構成する

<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<!-- - - Apache License バージョン 2.0 (以下「ライセンス」) に基づいてライセンスされます。 
	- ライセンスに従わない限り、このファイルを使用することはできません。 
	ライセンスのコピーは、http://www.apache.org/licenses/LICENSE-2.0 から入手できます。 
	- - 適用法で義務付けられている場合、または書面で同意されている場合を除き、ソフトウェア - 
	ライセンスに基づいて配布されるものは、「現状のまま」配布され、 
	明示的または黙示的を問わず、いかなる種類の保証または条件も保証しません。 
	権限と制限を規定する特定の言語のライセンス 
	ライセンスに基づいて。 -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/">
	 <テーブルルール名="ルール1">
    <ルール>
      <columns>ユーザーID</columns>
      <アルゴリズム>関数1</アルゴリズム>
    </ルール>
  </tableRule>
  <関数名="func1" クラス="org.opencloudb.route.function.AutoPartitionByLong">
 	<property name="mapFile">autopartition-long.txt</property>
  </function>
</mycat:ルール>

エラーをより正確に特定するには、log4j.xmlを変更します。

起動するにはstartup_nowrap.batをダブルクリックします

よくある質問
SHOW MASTER STATUS はいの場合は、my.iniファイルに1行追加します。
log-bin=mysql-bin

アカウントに権限を割り当てる
grant all privileges on . to 'root'@'172.27.185.1' identified by 'root';

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキル」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL マスタースレーブレプリケーション 読み書き分離の設定方法の詳細説明
  • MySQL マスタースレーブレプリケーションの読み書き分離構造の詳細な説明
  • MySQL マスタースレーブレプリケーション、読み取り/書き込み分離、バックアップとリカバリの詳細な説明
  • MySQL データベースのマスター・スレーブ レプリケーションと読み取り/書き込み分離

<<:  JavaScriptのループの違いについての詳細な説明

>>:  VMware vSAN 入門概要

推薦する

CSS はモバイル互換性の問題を解決するために 0.5px の線を実装します (推奨)

【コンテンツ】: 1.背景画像のグラデーションスタイルを使用する2. スケールを使ってズームできる...

jQueryの競合問題を解決する方法

フロントエンド開発において、$ は jQuery の関数です。$ のパラメータが異なると、実装される...

HTML ページに SVG を挿入する複数の方法

SVG (Scalable Vector Graphics)は、XML 構文に基づいた画像形式です。...

Linux ファイアウォールを設定してポート 80 と 3306 を開く方法

ポート80も設定されています。まずファイアウォール設定ファイルを入力しますシェル># vim ...

Vueは左上と右上のスライドナビゲーションを実装します

ナビゲーションなどは日々の開発でよく使うので、記録として記事を書きます。ナビゲーションは終了/開始位...

vscodeで保存した後のHTML自動フォーマットの問題を解決する

vsCode のバージョンは最近更新され、現在のバージョン番号は 1.43 です。実際、vsCode...

DockerでPrometheusをインストールする詳細なチュートリアル

目次1. Node Exporterをインストールする2. cAdvisorをインストールする3. ...

Vueはアンカー配置機能を実装します

この記事では、アンカー配置を実装するためのVueの具体的なコードを例として紹介します。具体的な内容は...

ウェブサイトのユーザーエクスペリエンスデザイン(UE)

Google Reader で、JunChen が書いた「フロー理論と設計」というタイトルの投稿を見...

ウェブサイトのフロントエンドパフォーマンスの最適化: JavaScript と CSS

Yahoo チームが書いた、ウェブサイトのパフォーマンス最適化に関する記事を読みました。この記事は...

MySQL 5.7 共通データ型

——「MySQL in Simple Terms (第 2 版)」からのメモ数値型整数型バイト最小最...

Docker でローカルにイメージをインポート/保存/読み込み/削除する方法

1. Dockerはローカルイメージをインポートする場合によっては、イメージをローカルまたは別の友人...

MySQL エラー「すべての派生テーブルには独自のエイリアスが必要です」の解決方法

MySQL は、マルチテーブルクエリを実行するときにエラーを報告します。 [SQL] SELECT ...

スプレッド演算子のサンプルコードと JavaScript での応用

スプレッド演算子を使用すると、式をある時点で展開できます。スプレッド演算子は、複数のパラメーター (...