2016-09-22 21 views
6

私たちは、アプリケーションでOracleデータベースの代わりにPostgreSQL DBを評価しようとしています。 PostgreSQL 9.5は、128 GBのメモリ、32のCPUコア、SSDストレージを備えたLinuxマシンにインストールされています。接続プールと分散トランザクションはJBoss 7アプリケーションサーバーによって管理され、SQLクエリはHibernate 4によって生成/実行されます。ほとんどのテーブルには数千万の行があり、そのうちの1つに何百万行もあります。合計で約3000のデータベース接続(アプリケーションサーバーによってプールされます)がアクティブで同時に使用されます。いくつかのクエリを変更し、低速のインデックスを作成し、ドキュメントに基づいてDBとOSの設定を調整しました。しかし、スループットは数倍遅く、最終的にDB応答時間は10〜20倍になります。何千もの接続と分散トランザクションによるPostgreSQL DBのパフォーマンス問題

私はいくつかのグーグルをやったと私はPostgreSQLのDBを同じ方法で使用して他の誰(AB)についての情報を見つけることができませんでした。この高い数値を使用して、アクティブなデータベース接続

  • の何千もを使用して

    • を1つのテーブルの行の取引(準備されたトランザクション)
    • 保存億

    分散Oracleはさらに高い負荷を処理問題ありません。私はあなたの経験、提案、リンクなどを共有

  • +2

    ZalandoはPostgresを使用しており、同時に多くのクライアントにサービスを提供しています。だから、エンジンが面倒ではないのですが、私はそれを伝えることができます:)大規模なテーブルを扱うためには、パーティション化が便利です。この質問はかなり広範ですが、私はあなたが期待する答えを得るつもりはないと思っています。 –

    +0

    コメントありがとうございます。 GITリポジトリ(https://github.com/zalando/patroni/search?utf8=%E2%9C%93&q=prepared)に基づいて、分散トランザクションは使用しません。max_prepared_transactions = 0 デフォルト値max_connectionsは100です。私は生産価値が異なる可能性が高いことを理解しています。 –

    +1

    独自のトランザクションマネージャがありますか?分散トランザクションを使用して、クラスタ上の異なるデータベース間でグローバル・トランザクションを許可していますか?代わりに報酬を考えましたか? –

    答えて

    0

    解決策は、Linuxカーネルをアップグレードし、Java接続プールのDB接続数を3000から300に減らすことでした。この変更後、Oracle DBと同じトラフィックを処理できました。偶然

    私はロバート・ハース (VP、チーフアーキテクト、EnterpriseDBの、PostgreSQLの主要な貢献者とコミッタ@データベースサーバ)によって書かれたポストDid I Say 32 Cores? How about 64?のコメントセクションに問題解決につながる情報の貴重な作品を発見した:

    いいえ、私は、64コアサーバーで優れたパフォーマンスを得るには、PostgreSQL> = 9.2 Linux> = 3.2が必要になると言います。変更の大半は実際にはPostgreSQL側にありますが、Linuxカーネルのlseekスケーリング機能も重要でした。

    -1

    Approprite設定が多数の接続を処理するために、postgresql.confファイルで提供されなければならない

    感謝を申し上げ。また、レプリケーションとロードバランシングのために、pgpool2によってフロントエンドにすることもできます。私たちはクラスタ化されたenvでPostgresを使用しており、うまくいきます。

    +0

    何千ものアクティブな接続がありますか、分散トランザクションを使用していますか、何百万ものレコードがありますか? –

    +0

    はい、複数のサーバー、複数のアプリケーション、多数のユーザーが同時に接続しています – Sri

    +0

    「多数のユーザー」を定義してください。同時に数百または数千ものアクティブなクエリですか? –

    関連する問題