13

MySQL データベースで大量のデータを扱っており、シャーディングを使用してスケールアウトしたいと考えています。シャーディングの原則を理解しており、データをどのようにシャーディングしたいかについても理解しています。

データベースのシャーディングについて調べると、シャードされたデータベースを実際に管理およびクエリする方法に関する包括的な例が見つかりません。

具体的には、データを複数のテーブル/データベース (シャード) に分割したとしましょう。そのデータをクエリする最良の方法は何ですか? 使用するシャードを mysql にインテリジェントに認識させる方法はないと思います。

シャードとクエリを管理できるサードパーティ ソフトウェアはありますか? それとも、シャードされたデータとやり取りするために自分のコード (php で書かれている) を変更する必要がありますか?

4

3 に答える 3

9

いくつかの大規模なシステムを扱った価値があるので、会社の一般的なapsで使用するためにサーバーからのクエリを集約するカスタムの社内アプリがありました。

たとえばselect * from t1、次のように変換されました。

select * from db1.t1
union
select * from db2.t2

主な問題は、サーバー間の結合に遭遇した場合、数百万以上の行のシステムでは、ネットワークにかなりの打撃を与え、クエリの処理に長い時間がかかる可能性があることです。

たとえば、ネットワーク分析を行っていて、ユーザーの属性の「リンク」を決定するためにテーブルで結合を行う必要があるとします。

次のような奇妙なクエリが発生する可能性があります(構文を許してください)。

  select db1.user1.boss, db1.user1.name, db2.user.name db2.user.boss from db1 inner join on db1.user.name = db2.user.name

(たとえば、人の上司とその上司、または友人の友人などを取得します。)

連鎖タイプのクエリを実行するために適切なデータを取得したい場合、これは非常に大きなPITAになる可能性がありますが、合計、平均などの単純な統計の場合、これらの人に最適なのは、統計をテーブルに集約する夜間のクエリでした。各サーバー(例:nightlystats)。例:select countif(user.datecreated>yesterday,1,0) as dailyregistered, sumif(user.quitdate)... into (the new nightly record)

これにより、合計列を合計するだけのカウント、個々のサーバー値にサーバーの合計カウントを掛けてから合計合計で割るなど、毎日の統計が非常に簡単になり、ダッシュボードビューが非常にすばやく表示されます。高いレベル。

結局、多くのインデックス作成と最適化を行うことになり、一般的に使用される情報の小さなローカルテーブルを保持するなどのトリックは、クエリを高速化するのに役立ちました。

大規模なクエリの場合、db guyは完全なシステムコピーをバックアップシステムにダンプし、ネットワークに過度に影響を与えないように、それを使用して日中にローカルで処理します。

これを減らすことができるいくつかのトリックがあります。たとえば、小さなテーブル(たとえば、ユーザーのメインテーブルなど、変更されないデータなど)を共有して、それらの収集に時間を無駄にする必要がないようにします。

実際に本当に役立つもう1つのことは、単純なクエリの合計と合計を夜間のテーブルに集約することです。

最後に興味深いのは、bwの問題の回避策は、「バックオフ」タイムアウトを社内の「クエリアグリゲーター」にプログラムすることでした。遅延すると、要求するレコードが少なくなり、要求していたクエリに遅延が追加されます(レポートを作成していて、時間に敏感ではないため、これは問題なく機能しました)

自動スケーリングするSQLがいくつかあります。最近、これを実行するツール(phpではない)に関する記事を読みました。それらはクラウド仮想マシンプロバイダーに関連していると思います。

このスレッドは、いくつかのツールと考えも提供します。MySQLシャーディングアプローチ?

NoSQLがオプションである場合は、そのルートに進む前に、そこにあるすべてのdbシステムを調べることを検討してください。

ただし、探しているものによっては、NoSQLアプローチの方が拡張しやすい場合があります。

于 2012-11-15T10:25:03.077 に答える
4

Shard-Queryを使用します。

参照: http://www.mysqlperformanceblog.com/2011/05/14/distributed-set-processing-with-shard-query/

于 2011-06-04T17:05:36.257 に答える
0

mysql ではパーティショニングまたはシャーディングを使用できます。パーティショニングを使用すると、mysql は where 句の条件に従って正しいデータをフェッチします。シャーディングを使用している場合は、シャーディング キーを定義する必要があります。したがって、データはシャーディング キーに従ってテーブルにシャーディングされます。

従業員テーブルがあり、employee_id に従ってこのテーブルをシャーディングし、シャード カウントが 10 であるとします。シャード テーブルのデータは、employees_(employee_id % 10) のようにテーブル名に入れることができます。したがって、従業員データは、シャーディング キーに従って、employees_1、employees_2 .....employees_10 という名前のテーブルに格納されます。

ここでは、mysql はテーブル名を自動的に計算しませんが、使用している言語で行う必要があります。

于 2018-02-06T03:55:43.150 に答える