我们目前有一个 Postgres 数据库,其中包含 100 个表,其中 20 个具有超过 5 000 000 行,主数据库服务器在 Debian 32MB RAM 8 处理器上运行。
除了主数据库,我们还有一个使用 Slony 复制的从数据库。
我们的应用程序使用 Java 和 Hibernate 框架进行 SQL 查询,c3p0 作为连接池。
我们的问题是,我们预计当前高峰时段的高负载大约是 30 点,而低流量时段大约是 4 点。目前我们没有在选择语句中使用主从之间的负载平衡。
Postgres master 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>
我们面临的一个主要问题是选择查询非常复杂,有很多连接甚至联合。
调整、扩展我们的实际系统并避免高负载的解决方案是什么?
升级硬件?主从之间的负载平衡?配置错误?
有什么比 slony 更好的负载平衡复制系统的建议吗?
优化 SQL 语句是不可能的,因为我们不是在开发软件。