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