Конфигурация 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, и я настроил базу данных на 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 config
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
любая помощь приветствуется!
1 ответ
Из руководства пользователя 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 - нет смысла накладывать два пула соединений друг на друга. Также я не думаю, что вы должны использовать более одной базы данных.