У меня есть кластер PostreSQL, в котором есть главный и подчиненный серверы. Я видел, что pgx/pgxpool
поддерживает одновременное подключение к нескольким хостам, но не понимаю, как тогда будут выполняться запросы. Может ли pgx понять, где находится мастер? (Я не нашел, чтобы он мог это сделать.) И будет ли pgx вообще работать, если у меня есть мастер и слейв, а на слейве могут выполняться только запросы только на чтение.
Помогите пожалуйста разобраться в проблеме
У меня была мысль, что запросы будут разбросаны по кругу, но подтверждения я не нашел. И я не знаю, что будет, если запрос на запись попадет на слейв.
Я примерно понимаю, как можно написать обертку вокруг пула, чтобы он поддерживал такую архитектуру, но не понимаю, нужно это или нет.
🤔 А знаете ли вы, что...
Go активно развивается и имеет регулярные релизы.
относительно нескольких хостов: pgx переопределяет те же правила для атрибутов строки подключения, что и реализация postgresql.
В документе PostgreSQL упоминается циклический перебор до тех пор, пока одно соединение не будет соответствовать критериям (соединение установлено и target_session_attrs
не будет сопоставлено).
ссылка на документ postgres:
Можно указать несколько хостов для подключения, чтобы они проверялись в заданном порядке.
target_session_attrs=primary
или target_session_attrs=read-write
)Этот параметр определяет, должен ли сеанс иметь определенные свойства, чтобы быть приемлемым. Обычно он используется в сочетании с несколькими именами хостов для выбора первой приемлемой альтернативы среди нескольких хостов.
Что касается pgx
дела:
Документ pgx.ParseConfig приведет вас (2 ссылки) к pgconn.ParseConfig
В документации явно упоминается поддержка нескольких хостов, поддержка target_session_attrs
менее очевидна — это подразумевается из того факта, что PGTARGETSESSIONATTRS
поддерживается, и из ссылки на атрибуты строки подключения — но она поддерживается.
В коде pgx проверка target_session_attrs при соединении проходит через одну из функций ValidateConnectTargetSessionAttrs*