У меня есть два узла 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 долларов в год.
Также они ДЕЙСТВИТЕЛЬНО продвигают свою облачную версию сейчас, что еще более безумно дорого.
Существует также Postgres-XL, но в нем также нет отработки отказа. Если вы потеряете какой-либо узел, вы потеряете все.
Это может быть связано с тем, что pgpool видит этот запрос как доступный только для чтения, но поскольку он фактически вызывает функцию (которая может содержать INSERT
UPDATE
или DELETE
операторов) он ломается при подключении к серверу только для чтения.