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

推薦する

HTML でテキストの折り返しを実装する例 (HTML でテキストと画像が混在)

1. 画像の周りのテキスト通常のものを使用する場合、たとえば次のようになります。コードをコピーコー...

TypeScript ジェネリックを簡単に説明する方法

目次概要ジェネリック医薬品とはビルドシステムジェネリック医薬品の一般的な理解ジェネリッククラスジェネ...

vuex データの永続化のための 2 つの実装ソリューション

目次ビジネス要件:解決策 1: vuex-persistedstate解決策2: vuex-pers...

MySQLはデータテーブル内の既存のテーブルを分割します

目次操作方法操作プロセス既存のテーブルにパーティション テーブルを作成し、データを新しいテーブルに移...

MySQL のロードバランサーとして nginx を使用する方法

注意: nginxのバージョンは1.9以上である必要があります。nginxをコンパイルするときに、-...

メタを使用してトラフィックキャッシュをキャンセルし、ページにアクセスするたびにページを更新して簡単にデバッグできるようにします。

コードをコピーコードは次のとおりです。 <!-- ブラウザがローカル キャッシュからページにア...

既存のMySQLデータベースの文字セットを統一する方法

序文データベースでは、一部のデータ テーブルとデータは latin1 であり、一部のデータ テーブル...

EChartsマルチチャート連携機能の実装プロセス

表示するデータが多い場合、1 つのチャートに表示しても効果はよくありません。このとき、2 つのチャー...

各グループの最新データを取得するためにMySQLベースのグループを実装する

序文:グループ化関数はグループ内の最初のデータを取得しますが、各グループ内の最新のデータを取得する必...

Vue再帰コンポーネントの簡単な使用例

序文多くの学生は既に再帰に精通していると思います。アルゴリズムの問​​題を解決するために再帰がよく使...

MySQL がデフォルトの分離レベルとして繰り返し読み取りを選択する理由

目次Oracle 分離​​レベルMySQL 分離レベル要約する多くの読者は、MySQL のトランザク...

CSS はコンテナ レベル (div...) タグを 1 つの位置 (ページの右端) に固定します。

コードは次のようになります。 。プロセス{ 境界線:1px 実線 #B7B7B8; 背景:#F8F8...

MySQLのデッドロックチェック処理の通常の方法

通常、デッドロックが発生すると、重みが最も小さい接続が強制終了され、ロールバックされます。ただし、最...

バックエンド管理システムを構築するためのvue-element-adminの実装手順

最近、カンファレンスの健康申告システムに取り組んでいたとき、バックエンドを構築する必要があり、vue...

マークアップ言語 - フレーズ要素

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...