3

アドバイスを求めています。私はシャーディングを使用したことはありませんが、最近それについて何かを読み、データベース (PostgreSQL 9.1) での長時間の実行クエリに役立つと思います。

説明

  • posts2億行のテーブルがあります。
  • 各投稿には、projectsテーブルへの外部キーがあります。
  • 各プロジェクトの posts テーブルには 100 ~ 300,000 行あります (平均: 30,000)
  • projects_id通常、外部キーのプロジェクト テーブルと結合された posts テーブルでクエリを実行します。
  • 他のテーブルのページとの結合を実行することはめったにありません。

ページに 100,000 行を超えるプロジェクトでは、私のクエリ (特定の期間と集計で追加された投稿を取得する) が非常に遅くなります。

シャーディングを使用する必要がありますか?

もし、そうなら:

  • どのようにシャードする必要がありますか? projects_idページテーブルでキーとして使用する必要がありますか?
  • テーブルページを分割するだけで十分ですか (posts_1、posts_2 ... テーブルを作成します)?
  • 1 台のマシン (さまざまなディスク上のシャード テーブル) で複数のディスク (パーティション) を使用する必要がありますか?

そうでない場合:

シャーディングの代わりに何を使用すればよいですか? より高速なディスク (SAS) を搭載したサーバーを購入しました。それは役に立ちましたが、十分ではありませんでした。マスター/スレーブ (pgPool2 を使用) を使用しようとしましたが、スレーブ データベースでより長いクエリを実行したい場合、次のエラーが発生します。

エラー: リカバリと競合するため、ステートメントをキャンセルしています 詳細: ユーザー クエリは、削除する必要がある行バージョンを確認する必要があった可能性があります。

シャーディングに関する詳細な質問:

  • 各シャード テーブル (posts_1、posts_2...) にいくつの行を含める必要がありますか?
  • PostgreSQL でのシャーディングに最適なソリューション/ツールは何ですか? Pl/プロキシ?
4

1 に答える 1

2

徹底的なボトルネック分析とシステムの望ましいユースケースがなければ、それを伝えるのは難しい. あなたはその実行速度がどれほど遅いかを正確に言ったことはありません.

シャーディングの代わりに考慮すべきいくつかのオプションを紹介します。

  1. 一般的なクエリ (最新のものなど)には、 Solrなどの検索エンジンを使用します。
  2. カウンタ テーブルを使用するか、Redisなどを使用して統計集計を行います (投稿数)
  3. メッセージ キュー (Redis (pub/sub) またはRabbitMQ ) を使用して、データベースへの書き込みを抑制します
  4. キャッシュ、キャッシュ、キャッシュ
  5. 最後に、NoSQL オプションを検討してください (これを行う必要があることは非常に疑わしいです)。

私が言及した少なくとも 3/5 のオプションを実行していない場合は、おそらくシャーディングを実行して代替案を検討するべきではありません。Postgresql は次のような場合に遅いことで悪名高いため、特に 2 番ですselect count(*) from ...

于 2012-12-21T02:56:20.423 に答える