序文リレーショナル データベースは、システムのボトルネックになる可能性が高くなります。単一のマシンのストレージ容量、接続数、および処理能力には制限があります。データ量と同時実行性が増加すると、データベースをセグメント化する必要があります。 データ シャーディングの手段は、データベースとテーブルを異なる部分に分割することです。ライブラリとテーブルのシャーディングには 2 つの側面があります。シャーディング テーブルなしでライブラリのみをシャーディングする場合と、シャーディング ライブラリなしでテーブルのみをシャーディングする場合があります。 データベース分散の核となる内容は、データの分割と、分割後のデータの配置および統合に他なりません。 データベースを複数のテーブルに分割する必要があるのはなぜですか?サブテーブル 1 つのテーブル内のデータの量が多すぎると、SQL 実行のパフォーマンスに重大な影響を及ぼします。一般的に、単一のテーブルが数百万に達すると、パフォーマンスは比較的低下するため、テーブルをサブテーブルに分割する必要があります。 テーブルを分割するということは、1 つのテーブルのデータを複数のテーブルに入れて、1 つのテーブルのみをクエリすることを意味します。たとえば、テーブルをプロジェクト ID ごとに分割し、1 つのテーブルに固定数のプロジェクト データを配置して、各テーブルのデータ量を制御可能な範囲内で制御できるようにします。 サブライブラリ 経験上、データベースは最大 2000 件の同時リクエストをサポートするときに拡張する必要があり、健全な単一データベースの同時実行値は 1000 前後で維持するのが最適です。すると、1 つのライブラリのデータを複数のライブラリに分割し、アクセスするときに 1 つのライブラリのみにアクセスすれば済みます。 これは、データベースとテーブルのシャーディングと呼ばれます。なぜデータベースとテーブルをシャーディングする必要があるのでしょうか?
データベースとテーブルを分割する方法写真を直接見てください: 垂直分割の場合、テーブルの垂直分割を回避するために、システム設計の最初にテーブルを適切に設計することをお勧めします。 水平分割は、範囲または特定のフィールド ハッシュによって実行できます。範囲で分割するメリットは、容量の拡張が簡単で、新しいテーブルやデータベースを用意するだけで済むことです。ただし、ホットな問題を引き起こしやすいため、実際に使用する際にはビジネスシナリオと組み合わせて検討する必要があります。ハッシュ分割のメリットは、各データベースやテーブルのリクエスト負荷を均等に分散できることです。デメリットは、容量拡張が難しく、以前のデータを再ハッシュする必要があり、データ移行のプロセスが必要になることです。 シャーディングによって生じる問題サブデータベースとサブテーブルは、単一のマシンと単一のデータベースによってもたらされるネットワーク IO、ハードウェア リソース、および接続数への負荷を効果的に軽減できます。しかし、いくつかの問題も発生しました。
データ移行2 つのデータ移行ソリューションを紹介します。 最も低レベルの解決策は、システムをしばらくシャットダウンし、事前に作成されたデータ インポート ツールを使用して単一のテーブルからデータを抽出し、それをサブライブラリとサブテーブルに書き込むことです。 2 番目のソリューションは、デュアル書き込み移行ソリューションであり、より信頼性が高いようです。オンラインシステムでは、以前にデータが書き込まれたすべての場所、追加、削除、変更操作、古いデータベースの追加、削除、変更に加えて、新しいデータベースの追加、削除、変更が追加されます。これは、いわゆる二重書き込みです。システムが展開された後、ソリューション 1 のデータ インポート ツールを実行して、古いデータベースを読み取り、新しいデータベースを書き込みます。書き込み時には、gmt_modified などのフィールドに基づいてデータの最終変更時刻を決定する必要があります。新しいデータベースにデータがない場合、またはデータが新しいデータベースのデータよりも新しい場合にのみ、データが書き込まれます。簡単に言えば、新しいデータを古いデータで上書きすることは許可されていません。 1 回の書き込み後も、不一致が残る場合があります。この場合、プログラムは自動的に新しい検証ラウンドを実行し、新しいデータベースと古いデータベースの各テーブルの各データを比較します。相違点がある場合、プログラムは古いデータベースからデータを読み取り、再度書き込みます。データが完全に一致するまでこのサイクルを繰り返します。 ミドルウェアサブライブラリとサブテーブル用のより一般的なミドルウェアは次のとおりです。
要約すると、Sharding-jdbc と Mycat が検討できるオプションです。 Sharding-jdbc などのクライアント層ソリューションの利点は、デプロイメントが不要で、運用および保守コストが低く、プロキシ層での二次転送が不要で、パフォーマンスが高いことです。欠点はカップリングです。 MySQL パーティショニング (非推奨)ここでパーティショニングが導入されているのは、主に分割、データベースとテーブルのシャーディングなどの概念との混乱を避けるためです。
LIST パーティションの例を次に示します。 テーブルorders_listを作成します( id INT AUTO_INCREMENT、 顧客姓 VARCHAR(30)、 ストアID INT、 営業担当者ID INT、 注文日 日付、 注 VARCHAR(500)、 インデックス idx (id) ) エンジン = INNODB PARTITION BY LIST(store_id) ( パーティション p1 値 (1, 3, 4, 17) インデックスディレクトリ = '/var/orders/district1' データディレクトリ = '/var/orders/district1'、 パーティション p2 (2, 12, 14)の値 インデックスディレクトリ = '/var/orders/district2' データディレクトリ = '/var/orders/district2', パーティション p3 値 (6, 8, 20) インデックスディレクトリ = '/var/orders/district3' データディレクトリ = '/var/orders/district3', パーティション p4 値 (5, 7, 9, 11, 16) インデックスディレクトリ = '/var/orders/district4' データディレクトリ = '/var/orders/district4', パーティション p5 値 (10, 13, 15, 18) インデックスディレクトリ = '/var/orders/district5' データディレクトリ = '/var/orders/district5' ); パーティショニングの利点:
要約するMySQL シャーディングに関するこの記事はこれで終わりです。MySQL シャーディングの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: editplus の Zen コーディング例コードの説明
さっそく、コードを直接投稿します。具体的なコードは次のとおりです。 <!DOCTYPE htm...
問題を見つける今日はTomcatのソースコードを勉強するつもりなので、公式サイトからTomcatのソ...
序文前回の記事では、eコマース シナリオでのフラッシュ セールの例を通じて、モノリシック アーキテク...
Vue コンポーネントは接続されているため、コンポーネント間で値を渡す必要があるのは避けられません...
Docker-machineはDockerが公式に提供しているDocker管理ツールです。これは d...
will-change は、要素にどのような変更が行われるかをブラウザに伝え、ブラウザが事前に最適化...
HTMLはヘッドとボディの2つの部分で構成されています** ヘッド内のタグはヘッドタグです** タイ...
構文: <marquee> …</marquee>モバイル属性マーキーを使用...
a タグ疑似クラスの役割: 「:link」: 訪問されていないタグの状態。 「:visited」: ...
0. 準備: • iTunesを閉じる• タスクマネージャーでiTunesから始まるサービスを終了し...
XHTML CSS ページ制作中に遭遇する問題の解決策は、解決策と呼ぶには少々大げさです。せいぜい、...
前書き: position:sticky は CSS ポジショニングの新しい属性です。相対ポジショニ...
序文Web ページを作成するときに、次のような状況に遭遇することはよくあります。 <本文>...
この記事では、Navicatを使用してcsvデータをmysqlにインポートする方法を参考までに紹介し...
Web プロジェクトを war にパッケージ化するアイデアにとって最も重要なことは、アトリフィカを...