Привет. Возникла необходимость отправлять запросы SELECT на реплику. В качестве балансировщика настраиваю PG-POOL, поднял тестовый стенд в докере, текст docker-compose ниже.
Возникают два вопроса:
1) При тестировании подаю SELECT, запрос уходит на реплику, всё ок. Выключаю (stop) контейнер postgres с репликой. Соединение psql разрывается и восстанавливается, подаю SELECT - запрос уходит на master. Стартую реплику. подаю SELECT, все последующие запросы уходят на master. Вроде бы должно помочь statement_level_load_balance, но ничего не меняется. Хочется чтобы при поднятии репилики запросы уходили на репилику. Может кто-то сталкивался?
2) Не пойму как устроена аутентификация и авторизация обычных пользователей (которые уже возможно созданы в БД). В pgpool есть встроенные механизм аутентификации - файл pool_passwd, в него записываются пользователи и пароли пользователей которые могут подключаться к pgpool(?). Далее если в пользователь есть в БД именно с этим-же паролем он может работать с бд в рамках своих привилегий. Такой результат я получил, тестами. Верно? А нет возможности когда какой-то служебный пользователь ходит в БД и делает проверку пользователь/пароль который он получил от pgpool когда пользователь начал подключаться? Чтобы не создавать разные сущности с одними и теми же данными.
В существующей схеме мне надо создавать одного и того-же пользователя в двух разным местах .Если я всё правильно понимаю.
version: '2'
services:
postgresql-master:
image: 'docker.io/bitnami/postgresql:14'
ports:
- '6432:5432'
volumes:
- 'postgresql_master_data:/bitnami/postgresql'
environment:
- POSTGRESQL_PGAUDIT_LOG=READ,WRITE
- POSTGRESQL_LOG_HOSTNAME=true
- POSTGRESQL_REPLICATION_MODE=master
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_USERNAME=postgres
- POSTGRESQL_DATABASE=postgres
- POSTGRESQL_PASSWORD=mypassword
postgresql-slave:
image: 'docker.io/bitnami/postgresql:14'
ports:
- '7432:5432'
depends_on:
- postgresql-master
environment:
- POSTGRESQL_USERNAME=postgres
- POSTGRESQL_PASSWORD=mypassword
- POSTGRESQL_MASTER_HOST=postgresql-master
- POSTGRESQL_PGAUDIT_LOG=READ,WRITE
- POSTGRESQL_LOG_HOSTNAME=true
- POSTGRESQL_REPLICATION_MODE=slave
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_MASTER_PORT_NUMBER=5432
pgpool:
image: docker.io/bitnami/pgpool:4
ports:
- 5432:5432
depends_on:
- postgresql-slave
volumes:
- ./conf/extra.conf:/config/extra.conf
- ./ssl:/opt/bitnami/pgpool/certs
environment:
- PGPOOL_BACKEND_NODES=0:postgresql-master:5432,1:postgresql-slave:5432
- PGPOOL_USER_CONF_FILE=/config/extra.conf
- PGPOOL_ENABLE_TLS=yes
- PGPOOL_TLS_CERT_FILE=/opt/bitnami/pgpool/certs/server.crt
- PGPOOL_TLS_KEY_FILE=/opt/bitnami/pgpool/certs/server.key
#PGPOOL_POSTGRES_USERNAME: Postgres administrator user name, this will be use to allow postgres admin authentication through Pgpool.
#PGPOOL_POSTGRES_PASSWORD: Password for the user set in PGPOOL_POSTGRES_USERNAME environment variable. No defaults.
# Имя пользователя поторым подключается PGPOOL к postgres
- PGPOOL_POSTGRES_USERNAME=postgres
- PGPOOL_POSTGRES_PASSWORD=mypassword
#PGPOOL_ADMIN_USERNAME: Username for the pgpool administrator. No defaults.
#PGPOOL_ADMIN_PASSWORD: Password for the user set in PGPOOL_ADMIN_USERNAME environment variable. No defaults.
#Имя пользователя для администрирования PGPOOL
- PGPOOL_ADMIN_USERNAME=PGPOOL_ADMIN_USERNAME
- PGPOOL_ADMIN_PASSWORD=PGPOOL_ADMIN_PASSWORD
#PGPOOL_HEALTH_CHECK_USER: Specifies the PostgreSQL user name to perform health check. Defaults to value set in PGPOOL_SR_CHECK_USER.
#PGPOOL_HEALTH_CHECK_PASSWORD: Specifies the PostgreSQL user password to perform health check. Defaults to value set in PGPOOL_SR_CHECK_PASSWORD.
#любой пользователь read-olny
- PGPOOL_SR_CHECK_USER=postgres
- PGPOOL_SR_CHECK_PASSWORD=mypassword
# - PGPOOL_AUTHENTICATION_METHOD=md5
healthcheck:
test: ["CMD", "/opt/bitnami/scripts/pgpool/healthcheck.sh"]
interval: 10s
timeout: 5s
retries: 5
volumes:
postgresql_master_data:
driver: local
extra.conf
log_destination = 'syslog,stderr'
log_statement = on
log_per_node_statement=on
statement_level_load_balance=1
backend_weight0 = 0
backend_weight1 = 1