В настоящее время у нас есть база данных Postgres с 100 таблицами, 20 из которых содержат более 5 000 000 строк, главный сервер БД работает на процессорах Debian 32 МБ RAM 8.
Дополнительно к главной БД у нас есть подчиненная БД, реплицированная с использованием Slony.
Наше приложение использует Java и Hibernate Framework для SQL-запросов, c3p0 в качестве пула соединений.
Наша проблема заключается в том, что в настоящее время мы ожидаем высокие нагрузки в периоды пиковой нагрузки около 30 и около 4 в периоды низкой загруженности.
В настоящее время мы не используем балансировку нагрузки между главным и подчиненным для операторов выбора.
Конфигурация главной БД Postgres выглядит следующим образом:
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>
Одна из основных проблем, с которой мы сталкиваемся, заключается в том, что запрос select очень сложен, имеет множество объединений и даже объединений.
Каким было бы решение для настройки, масштабирования нашей действительной системы и избежания высокой нагрузки?
Обновить оборудование?
Балансировка нагрузки между ведущим и ведомым?
Плохая конфигурация?
Есть какие-нибудь предложения по лучшей системе репликации балансировки нагрузки, чем у slony?
Оптимизация операторов SQL невозможна, поскольку мы не разрабатываем программное обеспечение.