Javaテクノロジスタック
www.javastack.cn
優れたJavaテクノロジのパブリックアカウント
1.分割して組み合わせる
私は何度も言いましたが、特定のテクノロジーに固執しないでください。テクノロジーは同じです。重要なのはプログラミング思考であり、思考が最も重要です。
データの量が多い場合は、細分性を改善するために分割されたアイデアが必要です。データの量が断片化し過ぎている場合は、粒度を粗くするための合理的なアイデアが必要です。
1.1ポイント
多くのテクノロジーはポイントのプログラミングのアイデアを使用しています。ここにいくつかの例があります。これらはポイントのアイデアです
分散型サービスへの集中型サービスの開発
Collections.synchronizedMap(x)から1.7ConcurrentHashMapから1.8ConcurrentHashMapまで、スレッドの安全性を確保しながらロックの細分性を改善
AtomicIntegerからLongAdderまで、ConcurrentHashMapのsize()メソッド。分散型思考を使用して、casの数を減らし、数のマルチスレッド累積を強化する
JVMのG1 GCアルゴリズムは、ヒープをメモリ管理のために多くの領域に分割します
HBaseのRegionServerでは、データは複数のリージョンに分割されて管理されます
スレッドプールの開発は通常、リソースから分離されていますか?
2.2彼
多くの手法はプログラミングのアイデアにも適用されます。ここにいくつかの例を示します。これらはアイデアです
TLAB(スレッドローカルアロケーションバッファー)、スレッドローカルアロケーションバッファー。マルチスレッドの競合を回避し、オブジェクトの割り当て効率を向上させる
エスケープ分析では、インスタンス化された変数のメモリをスタックに直接割り当てます。ヒープに入る必要はありません。スレッドが終了し、スタックスペースが再利用されます。ヒープに割り当てられた一時オブジェクトの数を減らす
CMS GCアルゴリズムでは、マークの消去が使用されますが、メモリのデフラグをサポートする構成もあります。例:-XX:UseCMS-CompactAtFullCollection(FullGCの後にソートすると、Stop The Worldは長くなります)および-XX:CMSFullGCs-BeforeCompaction(いくつかのFullGCの後に圧縮と終了)
ロックの粗大化。一連の連続した操作が同じオブジェクトのロックを繰り返しロックおよび解放していることをJITが検出すると、ロック同期の範囲が拡大します。
Kafkaのネットワークデータ転送には、ネットワークオーバーヘッドを削減するためのいくつかのデータ構成があります。など:batch.sizeおよびlinger.msなど
通常、開発用の一括取得インターフェイスと呼ばれますか?
2.パーティション
この記事はMySql InnoDBに基づいています
それほど多くのことを言ったので、最初に本体について話し、最初にパーティショニングについて話しましょう。ブロガーは以前にMySqlパーティショニングブログを書いたので、あまり多くの時間を費やすことはありません。
詳細については、MySQLのパーティショニングを理解するための記事を参照してください。
2.1実装
これを実現する方法は上記のリンクに記載されていますが、テーブルに主キーまたは一意のインデックスがある場合、パーティション列は一意のインデックスの不可欠な部分である必要があります。
これはデータベースに分割され、アプリケーションは透過的で、コードは何も変更する必要がありません。
2.2内部文書
最初にデータディレクトリに移動します。ディレクトリの場所がわからない場合は、次のコマンドを実行できます。
次に内部ファイルを見てください:
上の図から、2つのタイプのファイル、.frmファイルと.ibdファイルがあることがわかります
.frmファイル:テーブル構造ファイル
.ibdファイル:InnoDBでは、インデックスとデータは同じファイルにあります。 。Orderテーブルは5つの領域に分割されているため、このようなファイルは5つあります。
.parファイル:実行結果は.parファイルである場合とそうでない場合があります。注:MySql 5.7.6以降、.parパーティション定義ファイルは作成されなくなりました。パーティション定義は内部データディクショナリに格納されます。
2.3データ処理
テーブルをパーティション分割すると、MySqlのパフォーマンスが向上します。テーブルがある場合、1つの.ibdファイルと大きなB +ツリーのみが存在します。テーブルが分割される場合、パーティションルールに従って異なる領域に分割されます。つまり、大きなB +ツリーは複数の小さなツリーに分割されます。
、効率を高め、確かに読んでクラスタ化インデックスのB +ツリーの対応するパーティションを歩いて、あなたが分割キーインデクスを取る場合は、セカンダリインデックスのB +ツリーの対応するパーティションを行きます。
パーティションキーを使用しない場合、すべてのパーティションで1回実行されます。複数の論理IOが発生します!
SQLステートメントのパーティションクエリを表示する場合は、Explain Partitons select xxxxxステートメントを使用できます。selectステートメントがいくつかのパーティションに分割されていることがわかります。
mysql> explain partitions select * from TxnList where startTime>'2016-08-25 00:00:00' and startTime<'2016-08-25 23:59:00';
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+
| 1 | SIMPLE | ClientActionTrack | p20160825 | ALL | NULL | NULL | NULL | NULL | 33868 | Using where |
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+
row in set (0.00 sec)
3.サブライブラリサブテーブル
テーブルが時間とビジネスに伴って大きくなると、Curryテーブルのデータ量が増加します。データ操作もますます大きくなります。
物理マシンのリソースには制限があり、最終的には、運ぶことができるデータの量とデータの処理能力が制限されます。現時点では、サブライブラリサブテーブルを使用して、1台のマシンに配置できない種類の超大規模テーブルを実行します。
違いは、パーティションは通常単一のマシンに配置され、アーカイブを容易にするために時間範囲パーティションがより使用されることです。それは、サブライブラリとサブテーブルが実現するコードを必要とするだけであり、パーティションはmysql内に実装されます。サブデータベースのサブテーブルとパーティションは競合せず、組み合わせて使用できます。
3.1実装
3.1.1サブライブラリとテーブル標準
100G +ストレージ
1日あたりのデータ増分200w +
単一テーブルの数1億以上+
3.1.2サブデータベースのサブテーブルフィールド
サブデータベースサブテーブルフィールドの値は非常に重要です
ほとんどのシナリオでは、このフィールドはクエリフィールドです
数値
通常はuserIdを使用し、上記の条件を満たすことができます
3.2分散データベースミドルウェア
分散データベースミドルウェアには、プロキシとクライアント側のアーキテクチャの2つのタイプがあります。プロキシモードにはMyCatとDBProxyが含まれ、クライアント側のアーキテクチャにはTDDLとSharding-JDBCが含まれます。
プロキシとクライアント側のアーキテクチャの違いは何ですか?それぞれの長所と短所は何ですか?実際には、知るために写真を見てください。
プロキシモードでは、selectステートメントとupdateステートメントがエージェントに送信され、エージェントが特定の基になるデータベースを操作します。したがって、高可用性を確保するにはエージェント自体が必要です。そうでない場合、データベースは停止せず、プロキシーがハングしてから終了します。
クライアントモードは通常、接続プールでカプセル化の層を作成し、内部でさまざまなライブラリに接続し、SQLはスマートクライアントに渡されて処理されます。通常、サポートされる言語は1つだけですが、他の言語を使用する場合は、多言語クライアントを開発する必要があります。
それぞれの長所と短所は次のとおりです。
3.3内部文書
サブデータベースサブテーブル+パーティションの例を見つけました。これは、より多くのテーブルを含む.ibdファイルが多いことを除いて、基本的にパーティションテーブルと同じです。ファイルの説明は上記のとおりです。
[miaojiaxing@Grim testmydata]# ls | grep 'base_info'
base_info_00.frm
base_info_00#P#p_2018.ibd
base_info_00#P#p_2019.ibd
base_info_00#P#p_2020.ibd
base_info_00#P#p_2021.ibd
base_info_00#P#p_init.ibd
base_info_00#P#p_max.ibd
base_info_01.frm
base_info_01#P#p_2018.ibd
base_info_01#P#p_2019.ibd
base_info_01#P#p_2020.ibd
base_info_01#P#p_2021.ibd
base_info_01#P#p_init.ibd
base_info_01#P#p_max.ibd
base_info.frm
base_info.ibd
3.4問題
3.4.1トランザクションの問題
データベースがテーブルに分割されたので、分散トランザクションが必要になります。異なるデータベースに挿入された複数のレコードが同時に成功または失敗するようにする方法。
一部の学生はXAについて考えるかもしれませんが、XAのパフォーマンスは低く、mysql5.7を使用する必要はありません。柔軟なトランザクションは現在の主流のソリューションであり、TCCモデルは柔軟なトランザクションに属しています。
Huaweiはsagaを使用し、AliはTXCを使用し、AntはDTXを使用しており、FMTモードとTCCモードをサポートしています。
3.4.2結合の問題
tddl、MyCATなどは、クロスシャード結合をサポートしています。ただし、フィールドの冗長性などによるデータベース間の結合は避けてください。
これが発生し、ミドルウェアがシャード結合をサポートしている場合、このように使用できます。サポートされていない場合は、手動でクエリを実行できます。
4.まとめ
サブテーブルは使用方法と同じではありません。サブテーブルは、単一のマシンに配置できない超大規模テーブルを受け入れるためのものです。通常、パーティションは単一のマシンに配置され、時間範囲パーティションはアーカイブを容易にするために使用されます。
安定したパフォーマンスの点では、これらはすべてサブテーブルですが、パーティションテーブルはmysqlによって内部的に実装されるため、サブテーブルスキームよりもデータのやり取りが少なくなります。
著者:GrimMjx
www.cnblogs.com/GrimMjx/p/11772033.html
終わり
学習資料:
最近の記事:
1. Java 10ビッグパックBの記述方法、自慢できます!
3. 習得しなければならない8つのGitHubの実用的なヒント!
4. まだ日付を使用していますか?LocalDateTimeをすばやく使用してください!
6. すべてのプログラマーが習得しなければならない8つのデータ構造!
7. シングルトンモードを作成する8つの方法は非常に完全です。
8. Nginxには別のNiu X機能があります!トラフィックのコピー
9. 私が行ったとき、私の同僚は実際にパスワードをプレーンテキストで保存しています。!!
10. 64コアCPUをすぐにクラッシュさせるジャンクSQLの一部です。
パブリックアカウントに乾物が多すぎます。コードをスキャンして、Javaテクノロジスタックのパブリックアカウントに注意してください。
「オリジナルを読む」をクリックして飛んでください〜