MyCatに基づくMysqlデータベースの読み取りと書き込みの分離

1.データセグメンテーション

1.1理由

  従来のビジネスシナリオでは、データの量は多くなく、同時実行の量も多くないため、単一マシンのデータベースサービスは基本的にビジネスニーズを満たすことができます。インターネット時代では、データが爆発的に増加し、データの量と同時実行性が劇的に増加しました。これは、単一マシンのデータベースに多くの課題をもたらします。スタンドアロンデータベースのボトルネックの問題を解決するには、データベースをセグメント化し、大きなデータベースを複数の小さなデータベースに変換する必要があります。

1.2、データスイッチング

  大規模なデータベースを複数の小規模なデータベースに実現するには、データベースをセグメント化する必要があります。データセグメンテーションとは、元々単一のデータベースに格納されていたデータを、いくつかのルールを介して複数のデータベース(通常は複数のホスト)に分散し、単一のデータベースの負荷を軽減することです。データセグメンテーションは通常、垂直セグメンテーションと水平セグメンテーションに分けられます。

1.2.1、垂直セグメンテーション

  垂直セグメンテーションとは、さまざまなテーブルまたはスキーマに従ってさまざまなデータベースにセグメント化することです。垂直セグメンテーションの特徴は、単純なルール、簡単な実装であり、さまざまなビジネス間の結合が少なく、相互の影響が少ない、ビジネスモジュールに従って分割できます。

垂直セグメンテーションの利点:

  • 分割後、ビジネスは明確になり、分割ルールは明確になります。
  • システム間の拡張と統合が簡単。
  • 簡単なデータメンテナンス

垂直セグメンテーションのデメリット:

  • クロスデータベースデータをクエリする方法はありませんが、インターフェイスを介してのみ呼び出すことができるため、システムが複雑になります。
  • クロスデータベーストランザクションを処理する必要があります。
  • 垂直セグメンテーション後も、大型時計のパフォーマンスのボトルネックは1つだけです。
1.2.2、水平セグメンテーション

  水平セグメンテーションは主に、特定のルールに従ってテーブル内のデータを異なるデータベーステーブルに分割することであり、垂直セグメンテーションよりも複雑です。

水平セグメンテーションの利点:

  • 単一データベースのビッグデータと高い同時実行性のパフォーマンスのボトルネックを解決しました。
  • 分割ルールは十分にカプセル化されており、アプリケーション側にはほとんど透過的であり、開発者は分割の詳細を気にする必要はありません。
  • システムの安定性と負荷容量を改善します。

水平セグメンテーションのデメリット:

  • ルールの分割は抽象化が困難です。
  • クロスデータベースデータをクエリする方法はありません
  • 断片化されたトランザクションの一貫性を解決することは困難です。
  • 2回目の拡張では、データの移行と保守が困難になります。

2.読み取りと書き込みの分離

  ほとんどのインターネットサービスは、読み取りが多く、書き込みが少ない傾向があります。現時点では、データベースの読み取り操作は、最初にデータベースのボトルネックと呼ばれることがよくあります。このとき、データベースの読み取りパフォーマンスを直線的に向上させたい場合は、読み取り/書き込みロックを排除します。競合し、データベースの書き込みパフォーマンスを向上させると、読み取り/書き込み分離アーキテクチャを使用できます。

  読み取りと書き込みの分離は、通常、データベースのデュアルシステムホットバックアップ機能によって実現されます。つまり、最初のデータベースサーバーは、サービスを外部に追加、削除、および変更するためのサービスを提供し、2番目のデータベースは主に読み取り操作を実行します。

  データベースから多数の読み取り操作をストライピングすると、読み取り操作で専用の読み取りデータベースからデータを読み取ることができ、データベースのアクセス圧力が大幅に軽減され、データ読み取りの応答速度も大幅に向上します。読み取りと書き込みの分離は、データベースのパフォーマンスのボトルネックを解決するための「特効薬」ですか?マスターデータベースとスレーブデータベース間の同期が遅れたり、ダウンしたりした場合はどうなりますか?これは、読み取りと書き込みの分離の欠点です。マスターとスレーブ間のデータ同期が失敗した場合、または同期遅延が比較的大きい場合、書き込みライブラリと読み取りライブラリのデータに一貫性がありません。 -時間の要件により、ユーザーはこのデータの不整合を受け入れることができない場合があります。

3.MyCatの概要

  MyCatとは何ですか?定義と分類の観点から、これはオープンソースの分散データベースシステムであり、フロントエンドユーザーはMySqlクライアントとコマンドラインツールでアクセスできるデータベースプロキシと見なすことができ、そのバックエンドはネイティブですMySqlプロトコルは、複数のMySqlサービスと通信します。MyCatのコア機能は、サブデータベースとサブテーブルです。つまり、大きなテーブルは水平方向にN個の小さなテーブルに分割され、バックエンドのMySqlデータに格納されます。

  MyCatは、純粋なMySqlエージェントではなくなりました。そのバックエンドは、MySql、Oracle、SqlServer、DB2などのメインストリームデータベースと、MongoDBなどのNoSqlデータベースをサポートしています。フロントエンドユーザーにとっては、バックエンドで使用されるデータベースに関係なく、標準のSQLステートメントをサポートするMyCatの従来のデータベースであり、フロントエンド開発者にとっては、開発の難しさを大幅に軽減し、開発を改善できます。速度。

  • DBAの場合、
    MyCatは次のように理解できます。MyCatはMySqlであり、MyCatの背後に接続されているMySqlは、MyISAM、InnoDBなどのMySqlのストレージエンジンとして理解できます。したがって、MyCat自体はデータを保存しません。データはMyCatの背後に接続されたMySqlに保存されます。データの信頼性とトランザクションは、MySqlによって保証されます。
  • 開発者にとって、
    MyCatは次のように理解できます。MyCatは、MySqlとほぼ同じデータベースライブラリサービスです。MySqlに接続することでMyCatに接続できます。ほとんどの場合、一般的に使用されるORMフレームワークを使用してMyCatに接続することもできますが、フラグメント化されたテーブルの場合は、最高のパフォーマンスを実現するために標準のSQLステートメントを使用することをお勧めします。
  • アーキテクトにとって、
    MyCatは次のように理解できます。MyCatは強力なデータベースミドルウェアです。読み取りと書き込みの分離、データベースとテーブルだけでなく、ディザスタリカバリとバックアップ、クラウドプラットフォームの構築などにも使用できるため、あなたのアーキテクチャは非常に適応性があり、柔軟性があります。

上記のコンテンツは、Moke.comのJavaArchitectコースのティーチングノートからのものです。

MyCatの基本概念
  • スキーマ
    データベースミドルウェアは、1つ以上のデータベースクラスターで構成されるロジックライブラリと見なすことができます。開発者はデータベースミドルウェアの存在を知る必要はありません。開発者はデータベースの概念を持っているだけで済みます。
  • 論理テーブル(テーブル)
    アプリケーションシステムの場合、データの読み取りと書き込みを行うテーブルが論理テーブルです。論理テーブルのデータは水平方向に分割され、さまざまなシャードライブラリに分散されます。開発者の場合、論理テーブルを操作するだけでよく、その後の断片化の詳細は開発者に透過的です。
  • フラグメント化されたテーブル
    非常に大量のデータがあり、データを水平方向に分割する必要があるテーブルの場合、これをフラグメント化されたテーブルと呼びます。スライスされていないテーブルは、スライスされていないテーブルと呼ばれます。
  • グローバルテーブル
    実際のビジネスでは、多数のディクショナリテーブルがあります。データベース間のクエリを回避するために、シャーディングする必要のないこれらのテーブルを、データの冗長性によってシャーディングライブラリ内のすべてのテーブルにコピーします。グローバルテーブルと呼ばれます。

  • シャードノード(dataNode)のデータが分割された後、大きなテーブルが異なるシャードデータベースに分割され、各シャードテーブルが配置されているデータベースはシャードノードと呼ばれます。
  • ノードホスト(dataHost)
    データが分割された後、各シャードノードが実際の物理ホストを占めるとは限りません。同じ物理ホスト上に複数のシャードノードが存在します。これらのシャードノードが配置されているホストは、ノードホストと呼ばれます。単一ノードの同時実行性の制限を回避するために、読み取りと書き込みの負荷が高いシャードノードを異なるノードホストに配置するようにしてください。
  • フラグメンテーションルール(ルール)
    大きなテーブルを複数のフラグメンテーションテーブルに分割する場合、特定のルールが必要です。特定のビジネスロジックに従って、データは特定のフラグメンテーションに分割されます。このルールはフラグメンテーションルールと呼ばれます。
  • グローバルシーケンス番号(シーケンス)、つまり分散グローバルID。
    データを水平方向に分割した後、各シャードのデータレコードのIDが一意であることを確認する必要があります。このとき、ライブラリの自動インクリメントルール必須です。現時点では、外部メカニズムを使用してデータの一意の識別を保証する必要があります。データの一意の識別を保証するこのメカニズムは、グローバルシリアル番号と呼ばれます。

4.MyCatに基づく読み取り/書き込み分離を実現します

4.1。環境への準備

  MyCatに基づく読み取りと書き込みの分離を実現するには、MySQlのマスタースレーブ環境を準備する必要があります。具体的な構築方法については、「MySql5.7データベースのインストールとマスタースレーブ同期の構成」を参照してください

4.2、MyCatをダウンロード

MyCatダウンロードリンク:http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/

または、wgetコマンドを介してダウンロードします。

wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
4.3、解凍
tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz

解凍されたディレクトリ:
ここに画像の説明を挿入

4.4、server.xmlを構成します

  このファイルの変更は、主にMyCatアカウントのパスワードとデータベース名を構成するために使用されます。

<mycat:server xmlns:mycat="http://io.mycat/">
	<system>
		 <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
		<property name="nonePasswordLogin">0</property>
		<!--省略了其他的属性配置,详细请参考server.xml配置文件--->
	</system>
	
	<!-- 全局SQL防火墙设置 -->
	<!--白名单可以使用通配符%或着*-->
	<!--例如<host host="127.0.0.*" user="root"/>-->
	<!--例如<host host="127.0.*" user="root"/>-->
	<!--例如<host host="127.*" user="root"/>-->
	<!--例如<host host="1*7.*" user="root"/>-->
	<!--这些配置情况下对于127.0.0.1都能以root账户登录-->
	<firewall>
	   <whitehost>
	      <host host="1*7.0.0.*" user="root"/>
		  <host host="*" user="root" />
	   </whitehost>
       <blacklist check="false">
       </blacklist>
	</firewall>
	<!--配置了写操作用户,其中name为用户名,password为用户密码,schemas为逻辑库名称-->
	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">db_test</property>
		<property name="defaultSchema">db_test</property>
		<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>
	<!--配置了user用户,设置readOnly=true,表示该用户是用来读操作的-->
	<user name="user">
		<property name="password">123456</property>
		<property name="schemas">db_test</property>
		<property name="readOnly">true</property>
		<property name="defaultSchema">db_test</property>
	</user>
</mycat:server>

4.5、配置schema.xml

  schema.xmlファイルは、主にmycatロジックライブラリと実際のMySQLデータベース間のマッピング関係を構成するために使用されます。次の要素が関係しています。

  • スキーマmycatロジックライブラリ構成は、server.xml内のデータベースに対応し、dataNodeを介して対応する書き込み操作データノードを管理します。
  • dataNodeデータノード。主に、実データノードdataHostの情報を対応する実データベース名に関連付けるために使用されます。その中で、nameはスキーマノードが参照するノードの名前を設定するために使用され、dataHostは実際のデータベースの構成情報を表し、データベースの実際のデータベース名を表します。
  • dataHostは、実際のデータベースの構成情報ノードであり、データの読み取りおよび書き込み戦略のいくつかの構成が含まれます。また、ハートビートノード、writeHost書き込みライブラリ構成情報なども含まれます。
  • writeHostは、ライブラリ構成情報を書き込みます。これは主に書き込みライブラリ情報を構成するために使用されます。dataHostノードの下に複数のwriteHost書き込みライブラリ構成が存在する場合があります。writeHostエレメントの下で、読み取りライブラリー構成のreadHostノードを構成できます。
  • readHostは、ライブラリ構成情報ノードを読み取ります。

  その中には、dataHostノードにいくつかの属性balance、writeType、およびswitchTypeがあります。それらの意味は次のとおりです。

バランス属性:

  • balance = "0"の場合、読み取り/書き込み分離メカニズムはオンにならず、すべての読み取り操作は現在使用可能なwriteHostに送信されます。
  • balance = "1"の場合、すべてのreadHostとスタンバイwriteHostは、selectステートメントのロードバランシングに参加します。簡単に言えば、デュアルマスターデュアルスレーブモード(M1-> S1、M2-> S2、およびM1とM2が相互のマスターとバックアップ)、通常の状況では、M2、S1、S2はすべてselectステートメントのロードバランシングに参加します。
  • balance = "2"の場合、すべての読み取り操作はwriteHostとreadhostにランダムに分散されます。
  • balance =“ 3”の場合、すべての読み取り要求は、実行のためにwriterHostに対応するreadhostにランダムに分散されます。writerHostは読み取り圧力に耐えられません。balance= 3はバージョン1.4以降でのみ使用可能であり、1.3では使用できないことに注意してください。

writeType属性:

  • writeType = "0"の場合、すべての書き込み操作は構成の最初のwriteHostに送信され、最初の操作はハングアップして、まだ生きている2番目のwriteHostにカットされ、再起動後に切り替えられた操作が優先されます。構成ファイルdnindex.propertiesに記録されます。
  • writeType = "1"の場合、すべての書き込み操作は、構成されたwriteHostにランダムに送信されます。
  • writeType = "2"、実装されていません。

switchType属性:

switchType = "-1"は、自動切り替えがないことを意味します
switchType = "1"、デフォルト値、自動切り替え
switchType = "2"は、MySQLマスター/スレーブ同期の状態に基づいて切り替えるかどうかを決定します

  ここでの主な目的は読み取りと書き込みの分離を実現することであるため、最終的な構成は次のようになります。

<mycat:schema xmlns:mycat="http://io.mycat/">
	<!--name的值需要和servler.xml文件中的一致,然后需要添加dataNode属性-->
	<schema name="db_test" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema>
	<!--这里name值可以自定义,在schema中引用即可,dataHost对应dataHost 节点的name值,database对应真正需要操作的写库名称-->
	<dataNode name="dn1" dataHost="db_host" database="test" />
	<!--这里需要修改balance=3,这样所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,不然,写库可能会用于读操作,不利于后面测试-->
	<dataHost name="db_host" maxCon="1000" minCon="10" balance="3"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- 配置写库信息 -->
		<writeHost host="hostM1" url="192.168.1.8:3306" user="root" password="123456">
				   <!-- 配置读库信息 -->
			 <readHost host="hostS2" url="192.168.1.9:3306" user="root" password="123456" />
		</writeHost>
	</dataHost>
</mycat:schema>
4.6、Mycatを起動します

  mycatのbinディレクトリで、起動コマンドを実行します。

 ./mycat start
4.7、テスト

  起動が成功したら、Navicatを使用してMySQLと同じ方法でmycatに接続しますが、mycatのデフォルトのポートは8066です。同時に、server.xmlでホワイトリストを構成する必要があります。そうしないと、ログインが拒否されます。

  ルートユーザーとユーザーユーザー(以前はserver.xmlで構成されていた)を使用して接続を確立します。メインデータベース192.168.1.8にデータを追加します。この時点で、2つの接続には同じデータが表示されます。スレーブデータベース192.168にいる場合.1.8 1.9にデータを追加します。現時点では、ユーザーの接続のみがデータを表示できます(主にライブラリの読み取り操作を確認するために、ここでbalance = "3"を設定することを忘れないでください)。

5.まとめ

  このブログ投稿では、mycatの基本的な知識と、mycatに基づく読み取りと書き込みの分離について学び、mycatの使用法について予備的な知識を持っています。フォローアップ学習プロセスでは、引き続き試行と記録を行い、フォローアップでサブデータベースとテーブルの試行を実行します。

おすすめ

転載: blog.csdn.net/hou_ge/article/details/112919428