現在、100 個のテーブルを持つ Postgres データベースがあり、そのうち 20 個は 5,000,000 行を超えており、マスター DB サーバーは Debian 32MB RAM 8 プロセッサで実行されています。
マスター DB に加えて、Slony を使用して複製されたスレーブ DB があります。
私たちのアプリケーションは、SQL クエリに Java と Hibernate フレームワークを使用し、c3p0 を接続プールとして使用します。
私たちの問題は、現在、ピーク時に 30 前後、トラフィックが少ない時間に 4 前後の高負荷が予想されることです。現在、選択ステートメントのマスターとスレーブ間の負荷分散は使用していません。
Postgres マスター DB の構成は次のとおりです。
shared_buffers = 6144MB
temp_buffers = 16MB
max_prepared_transactions = 20
work_mem = 128MB
max_fsm_pages = 409800
自動バキュームがオンになっています。
c3p0 Hibernate 接続プールの構成は次のとおりです。
<property name="c3p0.min_size">3</property>
<property name="c3p0.max_size">200</property>
<property name="c3p0.timeout">300</property>
<property name="c3p0.max_statements">1000</property>
<property name="c3p0.idle_test_period">300</property>
私たちが直面している大きな問題の 1 つは、select クエリが非常に複雑で、多数の結合や共用体さえあることです。
実際のシステムを調整、スケーリングし、高負荷を回避するためのソリューションは何ですか?
ハードウェアをアップグレードしますか? マスターとスレーブ間の負荷分散? 構成が悪い?
slony よりも優れた負荷分散レプリケーション システムに関する提案はありますか?
ソフトウェアを開発していないため、SQL ステートメントの最適化はできません。