2016-08-27 3 views
2

Я использую Postgres с Sequelize как интерфейс ORM/query. В последнее время мы стали бить некоторые ошибки:В чем разница между пулом соединений и max_connections?

SequelizeConnectionError: remaining connection slots are reserved for non-replication superuser connections 

Глядя в него, проблема, кажется, связано с пределами соединения, установленные для Postgres, но у меня был какой-то проблемы, выяснить, как связать настройки на стороне клиента пула с настройки Postgres:

на моих Postgres 9,4 базы данных (на Amazon RDS), мой max_connections по умолчанию настроен на 26:

SELECT name, setting FROM pg_settings WHERE name='max_connections'; 
+-----------------+---------+ 
| name   | setting | 
+-----------------+---------+ 
| max_connections | 26  | 
+-----------------+---------+ 

в Sequelize, я поставил мой пул:

pool: { 
    max: 10, 
    min: 0, 
    idle: 10000 
}, 

Некоторые вопросы:

  • В общем, как это пул относятся к max_connections?
  • Имеет ли каждое соединение в бассейне 1 счет из max_connections?
  • Означает ли это, что пул max всегда должен быть меньше, чем max_connections?
  • Опустив тайм-аут простоя в бассейне, вы поможете свободным соединениям быстрее?

ответ

2

Это ниже запрос поможет вам узнать, почему у вас так много соединений

SELECT * FROM pg_stat_activity 

В общем, как это пул относятся к max_connections?

Максимальное значение в вашем пуле указывает отсутствие соединений, установленных в вашем пуле. В postgresql max_connections - это отсутствие соединений, установленных на сервере базы данных. Поэтому каждое соединение из вашего пула принимает 1 значение от max_connections

Установка max_connections до 26 довольно низкая, я предлагаю вам увеличить установленное значение.

Имеет ли каждое соединение в пуле 1 счет из max_connections?

Да, каждое соединение выдает 1 счет.

Означает ли это, что пул max всегда должен быть меньше, чем max_connections?

Да, бассейн Максы всегда должны быть меньше, чем max_connections

будет понижающим период ожидания на бассейн помощью свободных соединений быстрее?

Да, это определенно помогает, но не идеальное решение в этом случае.

Возможные причины !!

  1. Иногда может произойти утечка связи, тогда база данных может получить в 10 раз больше соединений, чем обычно.
  2. Также распространенной проблемой является то, что нравится, что на стороне клиента приложение разбивая и оставляя открытых соединений, а затем открыть новые, когда он перезагружается

А также, вы проверить superuser_reserved_connections значение переменной, можно найти в этой post, это может помочь вам!

Вы используете герою для объединения пулов?

A bit more detailed explanation here

+1

Спасибо! Это было очень полезно. Мы не используем героку, наши приложения развернуты на EC2. –

+0

@SankethKatta Конечно, спасибо :) – Jordon

Смежные вопросы