Назад | Перейти на главную страницу

Конфигурация pgpool с кластером Liferay

Я использую кластер Liferay, подключенный к pgpool2, и когда я запускаю активную пользовательскую активность на веб-серверах, я вижу множество исключений, касающихся того, что liferay не может установить соединение с БД. За pgpool стоят две БД

Примеры исключений

Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!
----------
Caused by: com.mchange.v2.resourcepool.ResourcePoolException: A ResourcePool cannot acquire a new resource -- the factory or source appears to be down.
org.postgresql.util.PSQLException: The connection attempt failed.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:152)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125)
    at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
    at org.postgresql.jdbc3.Jdbc3Connection.<init>(Jdbc3Connection.java:24)
    at org.postgresql.Driver.makeConnection(Driver.java:393)
    at org.postgresql.Driver.connect(Driver.java:267)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:146)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:195)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:211)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1086)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1810)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648)
Caused by: java.io.EOFException
    at org.postgresql.core.PGStream.ReceiveInteger4(PGStream.java:289)
    at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:282)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:108)
    ... 14 more
------
02:34:55,197 WARN  [C3P0PooledConnectionPoolManager[identityToken->Q5VpVuN8]-HelperThread-#0][BasicResourcePool:894] Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicResourcePool@427db1c2 is interrupting all Threads waiting on a resource to check out. Will try again in response to new client requests.

У меня есть настройка liferay для использования C3p0, а db, который я настроил, - это pgpool2. Я играю с этим уже несколько дней, пробуя миллионы комбинаций, и я думаю, что я нахожусь в лучшем состоянии, но все еще не там, и я не администратор базы данных. Liferay настроен с тем же пользователем / проходом, поэтому я думаю, что pgpool будет повторно использовать кешированное соединение, но я не могу определить проблему. Вот мои конфиги

конфигурация postgres

max_connections = 200
shared_buffers = 100MB

Конфигурация pgpool2

num_init_children = 500
max_pool = 10
child_max_connections = 4950
child_life_time = 300
connection_life_time = 0
client_idle_limit = 0

Конфигурация Liferay

jdbc.default.acquireIncrement=5
jdbc.default.acquireRetryAttempts=3
jdbc.default.acquireRetryDelay=1000
jdbc.default.connectionCustomizerClassName=com.liferay.portal.dao.jdbc.pool.c3p0.PortalConnectionCustomizer
jdbc.default.idleConnectionTestPeriod=60
jdbc.default.maxIdleTime=3600
jdbc.default.maxPoolSize=1000
jdbc.default.minPoolSize=10
jdbc.default.numHelperThreads=100

Следует ли увеличивать max_connections на моих серверах БД за pgpool? Или измените параметры pgpool на что-то вроде

num_init_children = 10
max_pool = 500
child_max_connections = 4950
connection_life_time = 0
client_idle_limit = 0

любая помощь приветствуется!

Из pgpool-II руководство пользователя

max_pool*num_init_children <= (max_connections - superuser_reserved_connections)

Если вам нужно 500 одновременных подключений к pgpool, вам нужно еще больше max_connections в вашей конфигурации Postgres. Итак, для 500 одновременных подключений вам потребуется:

В pgpool.conf:

num_init_children = 500
max_pool = 1 # there's no need for more if you don't use different credentials

В postgresql.conf:

max_connections = 550

Также - я не думаю, что вам следует использовать C3PO и PgPool-II - не имеет смысла ставить два пула соединений друг на друга. Также Я не думаю, что вам следует использовать более одной базы данных.