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 入門概要

推薦する

MySQL複合インデックスの概要

目次1. 背景2. 複合インデックスを理解する3. 左端一致原則4. フィールド順序の影響5. 単一...

Echarts バー水平棒グラフのサンプルコード

目次横棒グラフデータとスタイルを動的に更新するeChartsの幅と高さの適応の問題を解決する縦棒グラ...

Linux での MySQL 5.7 の導入とリモート アクセス構成

前書き: 最近、私はパートナーとチームを組んで .NET Core プロジェクトに取り組む予定です。...

Vueはチャットインターフェースを実装する

この記事の例では、チャットインターフェースの表示を実現するためのVueの具体的なコードを参考までに共...

MySQL で不明なフィールド名を回避する方法

序文この記事では、DDCTF の 5 番目の質問、つまり不明なフィールド名をバイパスする手法を紹介し...

Navicat の MySQL へのリモート接続の実装手順の分析

序文皆さんはリモート サーバーで開発を行っており、MySQL の使用率はかなり高いはずです。コマンド...

CSS3でアニメーションを実装する3つの方法

これは、面接者の CSS に関する基本的な知識をテストするものです。 CSSでアニメーションを実装す...

MySQLのスペースをクリーンアップするいくつかの具体的な方法

目次序文1. ファイルのディスク使用量を確認する1.1 ディスク容量の使用状況を確認する1.2 ディ...

MySQL 5.7 でパスワードを変更するときに発生する ERROR 1054 (42S22) の解決方法

MySQL 5.7 を新しくインストールしました。ログインすると、パスワードが間違っているというメッ...

JS で Websocket ベースのマルチターミナル ブリッジング プラットフォームを実装する方法

目次1. デバッグ対象2. WebSocketの機能3. ソケット接続を確立する3.1 部屋の作成方...

ウェブページのFOUC問題によるウェブページの混乱の解決策

FOUC は Flash of Unstyled Content の略で、FOUC と略されます。簡...

MySQLはライブラリ内の主キーなしでテーブルインスタンスコードを素早く取得します

概要MySQL データベースで主キーのないテーブルを表示するための SQL ステートメントをいくつか...

MySQL 外部キー制約とテーブル関係の概要

目次外部キーテーブルの関係を決定する方法テーブル関係を作成する方法1対多の関係 - 従業員テーブルと...

vuex名前空間の使用

目次Vuex は単一の状態ツリーを使用するため、すべてのアプリケーション状態が比較的大きなオブジェク...

Dockerはローカルイメージとコンテナの保存場所を設定します

指定したサイズより大きいファイルを検索するには、find コマンドを使用します。 検索 / -typ...