MySQL テーブルをシャーディングするための最良のアプローチは何ですか。私が考えることができるアプローチは次のとおりです。
- アプリケーションレベルのシャーディング?
- MySQL プロキシ層でのシャーディング?
- シャーディング用の中央検索サーバー?
この分野で興味深いプロジェクトやツールを知っていますか?
アプリケーション レベルのシャーディング: dbShards は、「アプリケーションを意識したシャーディング」を行う唯一の製品です。ウェブサイトにはいくつかの良い記事があります。当然のことながら、アプリケーション対応のシャーディングはより効率的になります。アプリケーションが、トランザクションを検索したり、プロキシによってリダイレクトされたりすることなく、トランザクションの行き先を正確に認識している場合、それ自体が高速になります。また、誰かがシャーディングを検討している場合、速度は唯一の懸念事項ではないにしても、多くの場合、主要な懸念事項の 1 つです。
プロキシを使って「シャード」する人もいますが、私の目にはそれはシャーディングの目的に反しています。別のサーバーを使用して、トランザクションにデータの検索場所または保存場所を指示しているだけです。アプリケーション アウェア シャーディングを使用すると、アプリケーションは自分でどこに行くべきかを認識します。はるかに効率的です。
これは本当に#2と同じです。
この分野で興味深いプロジェクトやツールを知っていますか?
この分野でのいくつかの新しいプロジェクト:
もちろんアプリケーションレベル。
この本で見つけた今までにない最高のアプローチ
ハイパフォーマンスMySQLhttp ://www.amazon.com/High-Performance-MySQL-Jeremy-Zawodny/dp/0596003064
簡単な説明:データを多くの部分に分割し、各サーバーに最大50の部分を保存できます。シャーディングの2番目に大きな問題であるリバランスを回避するのに役立ちます。それらのいくつかを新しいサーバーに移動するだけで、すべてがうまくいきます:)
購入して「mysqlスケーリング」の部分を読むことを強くお勧めします。
2018年現在、それに対するMySqlネイティブのソリューションがあるようです。実際には少なくとも 2 つ - InnoDB ClusterとNDB Cluster (商用バージョンとコミュニティ バージョンがあります) があります。
MySql community edition を使用するほとんどの人は InnoDB エンジンに精通しているため、これは最優先事項として調査する必要があります。すぐに使用できるレプリケーションとパーティショニング/シャーディングをサポートし、さまざまなルーティング/負荷分散オプションの MySql Router に基づいています。
テーブル作成の構文は、次のように変更する必要があります。
CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATETIME) PARTITION BY HASH ( YEAR(col3) );
(これは 4 つのパーティショニング タイプの 1 つにすぎません)
1 つの非常に重要な制限:
InnoDB 外部キーと MySQL パーティショニングには互換性がありません。パーティション化された InnoDB テーブルは、外部キー参照を持つことも、外部キーによって参照される列を持つこともできません。外部キーを持つ、または外部キーによって参照される InnoDB テーブルはパーティション化できません。