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

Параллельный режим pgpool2: не суперпользователи должны указать пароль в строке подключения

У меня есть два узла postgres AWS RDS, поддерживающих настройку pgpool в параллельном режиме на EC2. После использования pgbench для заполнения тестовых таблиц я получаю странное поведение от тестовых запросов. Любой запрос, в котором используется функция, вызывает ошибку, указанную в строке темы, в то время как другие запросы работают должным образом. Три примера, показывающих успех, ожидаемую неудачу и неожиданную неудачу:

Успех - дает ожидаемый набор рекордов:

psql -c "SELECT aid FROM pgbench_accounts" "host=localhost port=9999 user=pgpool password=pass dbname=bench_parallel"
# Giant record set is returned here.

Поскольку вспомогательные узлы подключены к RDS, требуется аутентификация md5. Аутентификация работает нормально в случае нефункциональных запросов, что можно увидеть, заменив правильный пароль, указанный выше, на неправильный.

Ожидаемая ошибка аутентификации:

psql -c "SELECT aid FROM pgbench_accounts" "host=localhost port=9999 user=pgpool password=notmypass dbname=bench_parallel"
psql: FATAL:  password authentication failed for user "pgpool"

Вот что меня озадачило: если я добавлю в запрос функцию вроде min () или count (), у меня возникнут проблемы с аутентификацией:

psql -c "SELECT count(aid) FROM pgbench_accounts" "host=localhost port=9999 user=pgpool password=pass dbname=bench_parallel"
ERROR:  password is required
DETAIL:  Non-superusers must provide a password in the connection string.

Как видно из этого последнего запроса, пароль предоставляется в строке подключения (во всяком случае, для внешнего интерфейса), и это правильный пароль, как показано в первом запросе.

Почему мой первый запрос работал нормально без проблем с аутентификацией, а третий не работал? Я где-то пропустил обстановку?

Изменить 2014-10-23: Добавление дополнительной информации.

Я добавил привилегии суперпользователя пользователю pgpool в системной базе данных (внешнего интерфейса) и больше не получаю Non-superusers must provide a password in the connection string как ошибка. Теперь я получаю:

ERROR:  could not establish connection
DETAIL:  fe_sendauth: no password supplied

Включив отладку для pgpool и просматривая журнал, я вижу, что запрос переписывается следующим образом, который при вызове dblink не содержит пароля, указанного в исходной строке подключения:

2014-10-23 19:59:10 DEBUG: pid 1643: OneNode_do_command: Query:  SELECT 
    sum(pool_g$0) AS count FROM 
    dblink('host=ip-10-1-2-17 dbname=bench_parallel port=9999 user=pgpool',
    'SELECT pool_parallel("SELECT count(aid) FROM pgbench_accounts")',false) 
    AS pool_t$0g (pool_g$0 bigint )

Есть Citus (pgShard), который должен работать со стандартными инстансами Amazon RDS. Хотя у него есть уловки. Если вы используете версию с открытым исходным кодом, у вас будет единственная точка отказа. Его узел-координатор не дублируется.

Вы можете получить его версию с полной отказоустойчивостью и бесшовным переключением при отказе, но вам придется купить корпоративную лицензию, но это СУЩЕСТВЕННО дорого. Это легко будет стоить вам от 50 000 до 100 000 долларов в год.

Также они ДЕЙСТВИТЕЛЬНО продвигают свою облачную версию сейчас, что еще более безумно дорого.

https://www.citusdata.com/

Существует также Postgres-XL, но в нем также нет отработки отказа. Если вы потеряете какой-либо узел, вы потеряете все.

Это может быть связано с тем, что pgpool видит этот запрос как доступный только для чтения, но поскольку он фактически вызывает функцию (которая может содержать INSERT UPDATE или DELETE операторов) он ломается при подключении к серверу только для чтения.