MySQL でよく使用されるデータベースとテーブル シャーディング ソリューションの概要

MySQL でよく使用されるデータベースとテーブル シャーディング ソリューションの概要

1. データベースのボトルネック

IO ボトルネックであろうと CPU ボトルネックであろうと、最終的にはデータベースのアクティブ接続数が増加し、データベースが処理できるアクティブ接続数のしきい値に近づいたり、さらには到達したりします。ビジネス サービスの観点から見ると、利用可能なデータベース接続はほとんどないか、まったくありません。次に何が起こるかは想像がつきます (同時実行性、スループット、クラッシュ)。

1. IOボトルネック

最初のタイプ: ディスク読み取り IO ボトルネック。ホット データが多すぎるため、データベース キャッシュに保存できません。各クエリで大量の IO が生成され、クエリ速度が低下します -> シャーディングと垂直シャーディング。

2 番目のタイプ: ネットワーク IO ボトルネック、要求されるデータが多すぎる、ネットワーク帯域幅が不十分 -> シャーディング。

2. CPUボトルネック

1 つ目のタイプ: SQL の問題。たとえば、SQL に join、group by、order by、非インデックス フィールド条件クエリなどが含まれる場合、CPU 計算操作が増加します -> SQL の最適化、適切なインデックスの確立、ビジネス サービス レイヤーでのビジネス計算の実行など。

2 番目のタイプ: 単一テーブル内のデータ量が大きすぎるため、クエリ中にスキャンされる行数が多すぎて、SQL 効率が低く、CPU が最初のボトルネックになる -> 水平テーブル パーティション分割。

2. サブライブラリとサブテーブル

1. 水平データベース

概念:フィールドと特定の戦略 (ハッシュ、範囲など) に基づいて、1 つのデータベース内のデータを複数のデータベースに分割します。

結果:

  • 各ライブラリの構造は同じです。
  • 各データベースのデータは異なり、重複はありません。
  • すべてのライブラリを結合したものが完全なデータです。

シナリオ:システムの絶対的な同時実行性が増加し、テーブル シャーディングでは根本的な問題の解決が困難です。また、データベースを垂直にシャーディングするための明確な業務提携がありません。

分析:ライブラリが増えると、IO と CPU への負荷が飛躍的に軽減されます。

2. 横長テーブル

概念:フィールドと特定の戦略 (ハッシュ、範囲など) に基づいて、1 つのテーブル内のデータを複数のテーブルに分割します。

結果:

  • 各テーブルの構造は同じです。
  • 各テーブルのデータは異なり、共通部分はありません。
  • すべてのテーブルを結合したものが完全なデータです。

シナリオ:システムの絶対的な同時実行性は向上していませんが、単一テーブル内のデータ量が大きすぎるため、SQL の効率に影響し、CPU の負荷が増加してボトルネックになります。推奨: SQLクエリ最適化の原則の分析

分析:テーブル内のデータ量が削減され、単一のSQL実行の効率が高くなり、CPUへの負担が自然に軽減されます。

3. 垂直サブデータベース

概念:テーブルに基づいて、さまざまなビジネス属性に応じてさまざまなテーブルが異なるデータベースに分割されます。

結果:

  • 各ライブラリの構造は異なります。
  • 各データベースのデータも異なり、共通部分はありません。
  • すべてのライブラリを結合したものが完全なデータです。

シナリオ:システムの絶対的な同時実行性が向上し、個別のビジネス モジュールを抽象化できるようになりました。

分析:この時点で、基本的にサービスに変えることができます。

たとえば、ビジネスが発展するにつれて、公開されている構成テーブルや辞書テーブルが増えていきます。このとき、これらのテーブルを別のライブラリに分離したり、サービス化したりすることもできます。さらに、ビジネスが発展し、一連のビジネス モデルが開発されると、関連するテーブルを個別のデータベースに分離したり、サービスに変換したりすることもできます。

4. 縦型テーブル

概念:フィールドに基づき、フィールドのアクティビティに応じて、テーブル内のフィールドは異なるテーブル (メイン テーブルと拡張テーブル) に分割されます。

結果:

  • 各テーブルの構造は異なります。
  • 各テーブルのデータも異なります。一般的に、各テーブルのフィールドには少なくとも 1 つの交差する列 (通常は主キー) があり、これを使用してデータを関連付けます。
  • すべてのテーブルを結合したものが完全なデータです。

シナリオ:システムの絶対的な同時実行性は向上していません。テーブルにはレコードは多くありませんが、フィールドは多くあります。ホット データと非ホット データが一緒に保存されるため、1 行のデータに必要なストレージ スペースが大きくなります。その結果、データベース キャッシュ内のデータ行数が減少し、クエリ中にディスク データを読み取るときに大量のランダム読み取り IO が生成され、IO ボトルネックが発生します。

分析:リスト ページと詳細ページを使用して理解を深めることができます。垂直テーブル分割の原則は、ホット データ (冗長性があり、一緒にクエリされることが多いデータ) をメイン テーブルとしてまとめ、非ホット データを拡張テーブルとしてまとめることです。この方法では、より多くのホット データをキャッシュできるため、ランダム読み取り IO が削減されます。分割後、すべてのデータを取得するには、2 つのテーブルを結合してデータを取得する必要があります。

ただし、結合は CPU の負荷を増やすだけでなく、2 つのテーブルを結合してしまうため (1 つのデータベース インスタンス上に存在する必要があります)、結合は絶対に使用しないでください。関連データについては、ビジネス サービス レイヤーで作業し、メイン テーブルと拡張テーブルのデータを個別に取得し、関連フィールドを使用して関連付けることですべてのデータを取得する必要があります。

3. ライブラリとテーブルシャーディングツール

  • sharding-sphere: jar、以前は sharding-jdbc;
  • TDDL: jar、Taobao 分散データ レイヤー。
  • Mycat: ミドルウェア。

注意: 公式ウェブサイトとコミュニティを優先し、ツールの長所と短所を自分で調べてください。

4. データベースとテーブルを分割する手順

容量 (現在の容量と増加) に基づいてシャードまたはテーブルの数を評価 -> キーを選択 (均等に) -> テーブル シャーディング ルール (ハッシュまたは範囲など) -> 実行 (通常は二重書き込み) -> 容量拡張の問題 (データの移動を最小限に抑える)。

5. シャーディングの問題

1. 非パーティションキークエリの問題

水平データベースとテーブルシャーディングに基づく分割戦略は、一般的に使用されるハッシュ方式です。

パーティションキーに加えて、クエリの条件としてクライアント上にはパーティション以外のキーが1つだけあります。

マッピング方法

遺伝学的方法

注: 書き込み時に、図に示すように、user_id は遺伝的手法によって生成されます。例えば、x ビット遺伝子については、8 つのテーブルに分割すると、23=8 なので、x は 3 となり、3 ビット遺伝子となります。 user_id に基づいてクエリを実行する場合、モジュールは対応するサブライブラリまたはサブテーブルに直接ルーティングできます。

user_name に基づいてクエリを実行する場合は、まず user_name_code 生成関数を使用して user_name_code を生成し、次に係数を取得して対応するサブライブラリまたはサブテーブルにルーティングします。 ID 生成によく使用される Snowflake アルゴリズム。

パーティションキーに加えて、クライアントのクエリの条件として複数の非パーティションキーがあります。

マッピング方法

冗長化方式

注: order_id または buyer_id でクエリを実行する場合、クエリは db_o_buyer データベースにルーティングされます。seller_id でクエリを実行する場合、クエリは db_o_seller データベースにルーティングされます。ちょっと本末転倒な気がしますね!他に良い方法はあるでしょうか?テクノロジースタックを変更するのはどうでしょうか?

パーティションキーに加えて、バックグラウンドにはさまざまな非パーティションキーの組み合わせ条件クエリもあります。

NoSQLアプローチ

冗長化方式


2. パーティションキーなしのデータベース間およびテーブル間のページングクエリの問題

水平データベースとテーブルシャーディングに基づく分割戦略は、一般的に使用されるハッシュ方式です。

注: NoSQL メソッド (ES など) を使用して解決されました。

3. 容量拡張の問題

水平データベースとテーブルシャーディングに基づく分割戦略は、一般的に使用されるハッシュ方式です。

データベースの水平拡張(データベース方式からのアップグレード)

注: 拡張は指数関数的に行われます。

水平拡張テーブル(ダブルライト移行方式)

ステップ 1: (同期デュアル書き込み) アプリケーションの構成とコードを変更し、デュアル書き込みを追加してデプロイします。

ステップ 2: (同期デュアル書き込み) 古いデータベースの古いデータを新しいデータベースにコピーします。

ステップ 3: (同期デュアル書き込み) 古いデータベースに基づいて、新しいデータベース内の古いデータを検証します。

ステップ 4: (同期二重書き込み) アプリケーションの構成とコードを変更し、二重書き込みを削除してデプロイします。

注: 二重書き込みは一般的な解決策です。

6. サブライブラリとサブテーブルの概要

データベースとテーブルを分割するには、まずボトルネックがどこにあるかを把握し、それから合理的に分割する必要があります (データベースを分割するか、テーブルを分割するか? 水平に分割するか、垂直に分割するか? 何回分割するか?)。また、データベースとテーブルを分割する目的で分割することはできません。

キーの選択は非常に重要です。均等分割クエリと非パーティション キー クエリの両方を考慮する必要があります。

要件が満たされている限り、分割ルールは可能な限り単純にする必要があります。

よく使われるMySQLシャーディングソリューションの概要についてはこれで終わりです。MySQLシャーディングの詳細については、123WORDPRESS.COMの以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL シャーディング入門ガイド
  • 順序再構築に関する簡単な説明: MySQL シャーディング
  • MySQL シャーディングの詳細
  • MySQLデータベースシャーディングとテーブルシャーディングが完全に崩壊
  • MySQLデータベースとテーブルシャーディング後の主キー処理のいくつかの方法
  • SpringBoot+MybatisPlus+Mysql+Sharding-JDBC シャーディング
  • MySQLデータベースとテーブルを分割するいくつかの方法

<<:  CSSは解析プロセスでさまざまな読み込み効果を実装します

>>:  ブラウザのCSS、JavaScript、背景画像のキャッシュをクリアする簡単な方法

推薦する

HTMLでキーワードを強調表示するのに最適なソリューション

最近、プロジェクトに取り組んでいるときに、Web ページ上のキーワードを強調表示する機能に遭遇しまし...

開発環境にUbuntu 16をインストール後の初期設定

オフィスでは、Linux 開発環境として Ubuntu システムが必要です。現在、Ubuntu 16...

MySQLデータベースの操作とメンテナンスのデータ復旧方法

これまでの 3 つの記事では、論理バックアップと物理バックアップを含む、MySQL データベースの一...

Docker+Nginx を使ってシングルページアプリケーションをデプロイする

開発から導入まで自分で行うシングルページアプリケーションを開発する場合、ビルドを実行した後 npm ...

CSS エラスティック ボックス flex-grow、flex-shrink、flex-basis の詳細な説明

3 つの属性 flex-grow、flex-shrink、flex-basis の機能は次のとおりで...

MySQL テーブルデータのインポートとエクスポートの例

この記事では、MySQL テーブル データのインポートおよびエクスポート操作について説明します。ご参...

ページ内の検索エンジンの呼び出しはBaiduを例に挙げています

今日、突然、自分のウェブページで Google や Baidu のような強力な検索エンジンを呼び出す...

MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明

MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明itemcontractprice ...

ウェブサイトはグレー表示されています。画像を含む互換コードはすべてのブラウザをサポートしています

通常、国喪の日、大地震の日、清明節には、ウェブサイト全体を灰色にして、故人への哀悼の意を表します。そ...

Vue 初心者ガイド: 最初の Vue-cli スキャフォールディング プログラムの作成

1. Vue - 最初の vue-cli プログラムVueの開発はNodeJSに基づいています。実際...

MySQL の 2 種類の一時テーブルの使用方法の詳細な説明

外部一時テーブルCREATE TEMPORARY TABLE によって作成された一時テーブルは、外部...

iframe テクニックを使用して訪問者 QQ 実装のアイデアとサンプル コードを取得する

今日、仕事中に、一時的に追加した友人から、Web ページを使用して訪問者の QQ を取得する方法を尋...

Node.js http モジュールの使用

目次序文ウェブHTTP サーバーファイルサーバー練習する序文Node.js 開発の目的は、JavaS...

擬似分散グラフィックを実現するための VMware 構成 Hadoop チュートリアル

1. 実験環境シリアルナンバープロジェクトソフトウェアとバージョン1オペレーティング·システムCen...