入門
大規模なインターネットアプリケーションでは、大量のデータを保存し、アクセスするためには、システム設計のボトルネックとなっている、システムの安定性と拡張性は大きな問題を引き起こしました。分割データは、サイトのパフォーマンスを向上させることにより、スケールアウトデータ層アーキテクチャは、R&D人材の好ましい方法となっています。
•セグメンテーションデータベースのレベル:損失による削減ダウンタイムを最大化しながら、あなたは、単一のマシンの負荷を軽減することができます。
•ロードバランシング戦略:あなたは、ダウンタイムの可能性を低下させる、単一のマシンにアクセス負荷を軽減することができます。
•クラスタリングのソリューション:シングルポイントデータベースに起因するデータベースのダウンタイムの問題を解決するためにアクセスすることができません。
•個別の読み取りと書き込みの戦略:最高速度とは、同時データの量を増やすには、アプリケーションを読み込みます。
問題の説明
1、再インデックス低い効率に大きなデータの単一テーブルの量、読み取り - 書き込みロック、挿入操作。
図2に示すように、単一のライブラリデータが大きすぎる(1T-2Tは、データベースへのデータの量に限界です)
3、単一のデータベース・サーバあまりにも多くの圧力
4、ボトルネックの書き込み速度(同時実行数百)
この問題を解決するためのアイデアは:テーブルが分割されたときにライブラリが分割されている場合、データベースが大きすぎる単一の大きなテーブル彼らの実際の状況に応じて、読み取りおよび書き込みおよびクラスタの別々の高い同時実行の場合を考えます。
データ分割方法は以下のとおりです。パーティション、サブテーブル、サブライブラリー
•パーティション
•データテーブルのみ論理端表に、N個のブロックに分割されているが、基礎となる物理ブロックがNで構成されています
•サブテーブル
•収納スペースとN個の独立したエンティティテーブルに分解一定の規則に従ってテーブルです。システムは、対応するワードを示す定義されたルールに従って読み書きする必要がある、それを操作します。
•サブライブラリー
ポイントテーブルたら、ライブラリテーブルはより多くなります
データベース全体のライブラリと比較すると、表には、本です。本の中で何かを見つけるために見てみると、関係なく、各章は、効率を探している場合の低下します。そして、データベース内の同じトークンは、分割されています。
パーティション
ゾーニングの使用を考慮すると?
•クエリの速度テーブルは、時間の使用に影響を与えるために遅れています。
•SQLを最適化
•データの量
•テーブル内のデータが分割されています
•データの操作は、多くの場合、データの一部のみを必要とする、すべてではなく、データの
パーティションの問題
•キーは、クエリの効率を向上させることができます
ポイントテーブル
サブテーブルを考慮すると?
•クエリの速度テーブルは、時間の使用に影響を与えるために遅れています。
•SQLを最適化
•データの量
•遅く、頻繁に挿入や関節の問い合わせ、
この問題を解決するためのサブテーブル
•サブテーブル、単一のテーブルを並行性を向上させるため、およびディスクI / O性能が向上し、書き込み動作の効率が改善されます
•短時間の照会
•別のファイルに分散されたデータ、ディスクI / Oパフォーマンスの向上
•データの読み書きロックの影響が小さくなります
•インデックスデータの削減を再構築するためにデータベースを挿入します
パーティションおよびサブテーブルの違いとの関係
•表のパーティションおよびサブ目的は、CRUD表の効率を改善するために、データベースの負担を軽減することです。
•データがテーブルの変更にのみ格納されているパーティションは、サブテーブルは、複数のテーブルにテーブルです。
•シェレメチェボ、テーブルデータが比較的大きい場合には、2つの方法は、互いに組み合わせて使用することができます。
•負荷の軽いが、表のデータは比較的長い時間、のみ分割することができます。
共通のサブ地区ポリシールールのリスト(似ました)
•範囲(レンジ)
•ハッシュ(ハッシュ)
•時間で割れ目
•ハッシュテーブルの後に従ったポイント数を法
•認証ライブラリで構成データベースを保存するDBを作成することで、DBはDBに別々のuser_idのマッピングを保存
サブライブラリー
サブライブラリーの使用を考慮すると?
•単一DB・ストレージ・スペースが十分ではありません
•クエリの量の増加に伴い、単一のデータベースサーバがサポートする方法はありません
サブライブラリーは、問題を解決します
•その主な目的は、単一ノードのデータベース・サーバのI / Oキャパシティの制約、問題に対処するために、データベースのスケーラビリティを突破することです。
垂直分割
•テーブルを結合したり、関係が存在していない必要性が異なるデータベース・システム内の異なるサーバに配置することができます。
•ビジネス垂直に応じて分割。たとえば、次の事業資金、メンバーシップ、順序3つのデータベースに分かれているよう。
•問題に対処する必要があります:クロストランザクションデータベース、jionのお問い合わせやその他の問題。
スプリット水平
•たとえば、サイトのほとんど。そして、ユーザデータは、ユーザレベルへのデータに基づいて、ユーザーができ、関連しています。
•ルールに従って分割、ライブラリーの一般的なレベルは、垂直サブライブラリーの後に分割されています。例えば、毎日の処理の注文の数は巨大であり、レベルが一定の規則に従って分類することができます。対処すべき課題:データルーティングおよびアセンブリ。
別々の読み取りと書き込み
•データの適時性が高くないため、それは読んでの分離を書くためにデータベースを介して圧力を緩和することができます。解決すべき課題:ビジネスはビジネスで一定のタイムラグ許可だけでなく、データの同期化の問題されているものの区別。
アイデア:
垂直ライブラリ - >サブライブラリーのレベル - >個別の読み取りおよび書き込み
データ分割の問題が直面した後、
問題
•トランザクション、サブライブラリーサブテーブルをサポートし、それが分散トランザクションになり、
サブライブラリーのサブテーブルの後、それが分散トランザクションになります。あなたが取引を実行するためにデータベース自体分散トランザクション管理機能に依存している場合、それは、高いパフォーマンスコストを支払うことになり、プログラムロジックの形成取引を制御するのを助けるために、アプリケーションプログラムによって場合、希望負担プログラミングを。
クロスデータベース•は、クロステーブルの問題に参加すると
•サブライブラリーサブテーブル、読み、強い一貫性を確保するために、分散、分散用いて書き込み、必然的に低減性能、システムの複雑性が増加、その結果、遅延をもたらす別個。
関連テーブル間のサブライブラリーのサブテーブルの操作が制限されます後、我々は異なるサブテーブルサイズのテーブルを結合することはできません異なるサブライブラリにあるテーブルを結合することはできません、クエリの結果は、元の事業を完了するために、あなたはに複数のクエリが必要な場合があります完全な。ラフソリューション:グローバルテーブル:基本データ、すべてのライブラリは、コピーを持っています。冗長フィールド:いくつかのフィールド、このようなクエリが参加する必要はありません。システム層アセンブリ:すべてのお問い合わせは、その後組み立てて、より複雑です。
一般的な解決策:
異なる方法、異なる特性、異なる強調における厳密な境界間について•。実際の状況に応じて、各モードの特性が処理を実行します。
•システム格納されたデータをアップグレードする必要があると同時に、ビジネス、サードパーティ製のデータベースミドルウェア(アトラス、Mycat、TDDL、DRDS)を使用します。
データストレージの進化
1つのデータベース内の単一のテーブル
•シングルライブラリーは、すべてのユーザーがDBライブラリ・ユーザ・テーブルで見つけることができ、最も一般的な単一テーブルのデータベース設計は、例えば、データベースDB内のユーザー(利用者)のテーブルがあります。
シングル・クドローテーブル
•ユーザの数が増加するように、データは、ユーザクエリにタイムテーブルのある程度に達したときにユーザ・テーブルが大きくなるデータの量が徐々に従って全体DBのパフォーマンスに影響を与える、遅くなります。MySQLを使用している場合は、より深刻な問題は、あなたが時間を追加する必要がある場合、すべての読み取りおよび書き込み操作が唯一の期間を待って、mysqlのテーブルをロックすることでもあります。
•ユーザーレベルが何らかの方法で分割される切断、二つの同一user_0000を生成するテーブルの構造、テーブルなどuser_0001、user_0000 + user_0001 + ...データは完全なデータであることを起こることができます。
マルチテーブルマルチデータベース
十分ではない、おそらく、単一のDBのデータ・ストレージ・スペースの量は、単一のクエリの増加量として、データベースサーバがサポートする方法がありません。この時間は、データベースレベルを分割することができます。
概要
全体的に、優先順位区画。パーティションが需要を満たすことができないとき、私たちは、効率性の向上のための合理的なスコアシートは、パーティションよりも良くなるポイントテーブルを検討し始めました。
垂直ライブラリ - >サブライブラリーのレベル - >個別の読み取りおよび書き込み
実用的な操作
図1に示すように、単一のマルチテーブル・ライブラリ
マルチテーブルの単一のライブラリーは、水平分割データを、複数のテーブルのテーブルの構造と同様に、テーブルに格納されたデータのために、異なる規則に従ってデータを分割しています。
これには、私がデータ・テーブルにデータを分割設置年で、保存されたデータテーブルのデータの年に従って格納されたとき、私たちのビジネスのお問い合わせも年によって行われ、一般的に年間にわたるデータのクエリを持っていませんデータの後にマルチテーブルクエリをマージすることは避けてください。
図2に示すように、単一のデータベーステーブル以上
まったく同じデータベースは、そのデータを保存するために異なるルールをインストールし、次は私の春ブーツマルチデータソースの設定です:
#複数のデータソース
custom.datasource.names =江蘇省、安徽省、山東省、湖北省、湖南省、福建省
custom.datasource.jiangsu.type = com.zaxxer.hikari.HikariDataSource
custom.datasource.jiangsu.driverClassName =はcom.mysql.jdbc.Driver
custom.datasource.jiangsu.url = JDBCます。mysql://127.0.0.1:?3306 / nda_jiangsu useUnicode = YES&characterEncoding = UTF-8
custom.datasource.jiangsu.username =ルート
custom.datasource.jiangsu.password =
custom.datasource.anhui.type=com.zaxxer.hikari.HikariDataSource
custom.datasource.anhui.driverClassName =はcom.mysql.jdbc.Driver
custom.datasource.anhui.url = JDBCます。mysql://127.0.0.1:?3306 / nda_anhui useUnicode = YES&characterEncoding = UTF-8
custom.datasource.anhui.username =ルート
custom.datasource.anhui.password =
custom.datasource.shandong.type = com.zaxxer.hikari.HikariDataSource
custom.datasource.shandong.driverClassName =はcom.mysql.jdbc.Driver
custom.datasource.shandong.url = JDBCます。mysql://127.0.0.1:?3306 / nda_shandong useUnicode = YES&characterEncoding = UTF-8
custom.datasource.shandong.username =ルート
custom.datasource.shandong.password =
custom.datasource.hubei.type=com.zaxxer.hikari.HikariDataSource
custom.datasource.hubei.driverClassName =はcom.mysql.jdbc.Driver
custom.datasource.hubei.url = JDBCます。mysql://127.0.0.1:?3306 / nda_hubei useUnicode = YES&characterEncoding = UTF-8
custom.datasource.hubei.username =ルート
custom.datasource.hubei.password =
custom.datasource.hunan.type=com.zaxxer.hikari.HikariDataSource
custom.datasource.hunan.driverClassName =はcom.mysql.jdbc.Driver
custom.datasource.hunan.url = JDBCます。mysql://127.0.0.1:?3306 / nda_hunan useUnicode = YES&characterEncoding = UTF-8
custom.datasource.hunan.username =ルート
custom.datasource.hunan.password =
custom.datasource.fujian.type=com.zaxxer.hikari.HikariDataSource
custom.datasource.fujian.driverClassName =はcom.mysql.jdbc.Driver
custom.datasource.fujian.url = JDBCます。mysql://127.0.0.1:?3306 / nda_fujian useUnicode = YES&characterEncoding = UTF-8
custom.datasource.fujian.username =ルート
custom.datasource.fujian.password =
このデータは、各地域のデータの整合性を確保するために、地域に応じて分割され、
関連業務における場合、ユーザは、対応するデータベースを照会州によれば:
DynamicDataSourceContextHolder.setDataSourceType(provincename)。
3、マルチテーブルマルチライブラリー
マルチテーブルマルチデータベースの導入は、マルチテーブルマルチデータベースソリューションの基本的なJDBCデータベースの详细独自の実装で軽量なサブライブラリーサブテーブルツール、シャーディング-JDBCを導入するとき。あなたは完全にビジネスコードを書く時間で、単一のデータベース、単一のテーブルによると、マルチテーブルマルチライブラリーの問題は、あなたが解決するためのシャーディング-JDBCを持って、彼らは、自分のサブライブラリーのサブテーブルのルール・インタフェースを実現するサブライブラリーサブテーブルのルールを設定する必要があります。
pom.xml設定
サブルールを達成するためのインタフェース・ライブラリ
パブリッククラスDemoDatabaseShardingAlgorithmはPreciseShardingAlgorithm {@Overrideを実装します
パブリック文字列doSharding(Collectioncollection、PreciseShardingValue preciseShardingValue){
{(コレクション列毎)のために
System.out.println(それぞれ+ "==" + preciseShardingValue.getValue())。
IF(each.endsWith(Long.parseLong(preciseShardingValue.getValue()のtoString())%2+ "")){
それぞれを返します。
}
}
新しいIllegalArgumentExceptionをスローし();
}
}
サブメートルのルールインターフェイスを実現するために、
パブリッククラスDemoTableShardingAlgorithmは{PreciseShardingAlgorithmを実装します
@オーバーライド
パブリック文字列doSharding(Collectioncollection、PreciseShardingValue preciseShardingValue){
{(コレクション列毎)のために
System.out.println(それぞれ+ "= 2 =" + preciseShardingValue.getValue())。
IF(each.endsWith(Long.parseLong(preciseShardingValue.getValue()のtoString())%2+ "")){
それぞれを返します。
}
}
新しいIllegalArgumentExceptionをスローし();
}
}
コールの規則
@Bean(名前= "shardingDataSource")
データソースgetShardingDataSourceは(){SQLExceptionがスロー
ShardingRuleConfiguration shardingRuleConfig;
shardingRuleConfig =新しいShardingRuleConfiguration();
。shardingRuleConfig.getTableRuleConfigs()を追加(getUserTableRuleConfiguration());
shardingRuleConfig.getBindingTableGroups()( "USER_INFO")を追加します。;
shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(新StandardShardingStrategyConfiguration( "USER_ID"、DemoDatabaseShardingAlgorithm.class.getName()));
shardingRuleConfig.setDefaultTableShardingStrategyConfig(新StandardShardingStrategyConfiguration( "USER_ID"、DemoTableShardingAlgorithm.class.getName()));
新しいShardingDataSourceを返す(shardingRuleConfig.build(createDataSourceMap()));
}
これが完了すると、ビジネスは単一のテーブルを書くために行のコードを完全に従うものとします、シャーディング-JDBCは自動的にサブライブラリーのサブテーブルデータベースの挿入だけでなく、マルチテーブルクエリデータの統合を達成するのに役立ちます。
サブライブラリーのサブテーブル内のJDBCプロトコル層の拡大を使用してシャーディング-JDBCは、瓶の形にサービスを提供する軽量コンポーネントである、核となるアイデアは、物事の核心を完了し、小さいながらも美しいです。
シャーディング-JDBCも読んでライブラリを記述するための圧力を減らすために、分離を書き込む機能を提供します。
さらに、シャーディング-JDBC JPAは、JPAは、Hibernate、MyBatisの、任意のJava ORMフレームワークのような春のJDBCテンプレートとして、シーンで使用することができます。
しかし、今シャーディング-JDBCは、MySQLデータベースをサポートしています
そして、サードパーティ製のプラグインもmycat挿入とクエリデータサブライブラリサブテーブルが達成することができますが、mycatは契約のMySQLのレプリケーション、Mycat Serverは、MySQLデータベースを装っプロキシ、に基づいて、およびシャーディング-JDBCは、JDBCベースのインタフェースです提供するサービスの軽量瓶パッケージの形で拡張、。
mycatのお問い合わせは、仮想データベースになってきた独自の使用で開始し、ビジネスプロセスの仮想データベースmycat接続され、その後、実際のデータベースの実装mycatサブライブラリーサブテーブルのデータを接続します。
サブライブラリーサブテーブルプログラム製品
サブライブラリーサブテーブルミドルウェアの現在市場で比較的、エージェントベースのアプローチは、ここでのMySQLプロキシとアメーバ大きいあり、Hibernateのフレームワークは、そこに基づいてJDBC详细のシャーディング、JDBC、Hibernateのシャードに基づいに基づいています同様のMavenのプラグインのキノコストリートキノコストリートTShardingのMyBatisの、コバーiBATISはテンプレートクラスクライアントの春を書き換えることもできます。
オープンソース製品は一部の大企業にあります。