Настройка pgpool2 в режиме балансировки запросов.
В случае когда используется репликация баз данных, выполнение SELECT'ов в разных сереверах возвращает всегда одинаковый результат. Pgpool2 в режиме балансировки позволяет снизить нагрузку на каждый сервер PostgreSQL. Это делается за счет распределения запросов между всеми серверами в кластере баз данных, тем самым увеличивая общую пропускную способность. Балансировка работает лучше всего в случаях когда в БД выполняется множество одновременных запросов на чтение.Схема: есть два PostgreSQL сервера работающие в режиме потоковой репликации. Настроим балансировщик так, чтобы часть запросов на чтение уходило в слейв. Учитывая что приложения будут подключаться к балансировщику, следует учесть детали связанные с авторизацией. Авторизацию будем выполнять на уровне pgpool2 через pool_hba.conf. На бекендах PostgreSQL пропишем доверенный вход со стороны балансировщика.
Правим pg_hba.conf на каждом узле с PostgreSQL. Адрес балансировщика в данном случае 172.31.26.43.
# vi /etc/postgresql-9.0/pg_hba.conf
host all all 172.31.26.43/32 trust
# /etc/init.d/postgresql-9.0 reload
На узле с балансировщиком разрешаем подключение только с использование MD5, разрешаем локальный вход и вход с серверов приложений
# vi /etc/pgpool2/pool_hba.conf
# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# application backend's
host app_db app_user 172.31.1.10/32 md5
host app_db app_user 172.31.1.11/32 md5
host app_db app_user 172.31.1.12/32 md5
Теперь прописываем хеши паролей от тех ролей которые будут подключаться к pgpool2, в нашем случае это app_user. Используем pg_md5, она сама запишет реквизиты в нужном формате в /etc/pgpool2/pool_passwd
# pg_md5 --md5auth --username=app_user role_pass
Теперь необходимо определить реквизиты доступа на каждый сервер где размещено приложение, которое будет подключаться к балансировщику.
Прописываем реквизиты postgresql роли, в .pgpass для каждого пользователя которому необходимо подключаться к postgresql через pgpool2
# vi ~/.pgpass
*:*:app_db:app_user:role_pass
# chmod 600 ~/.pgpass
Теперь конфигурируем pgpool2.
# vi /etc/pgpool2/pgpool.conf
#------------------------------------------------------------------------------
# CONNECTIONS - настройки службы и определние бэкендов
#------------------------------------------------------------------------------
# - pgpool Connection Settings -
listen_addresses = '*'
port = 5432
socket_dir = '/var/run'
# - pgpool Communication Manager Connection Settings -
pcp_port = 9898
pcp_socket_dir = '/var/run'
pcp_timeout = 10
# - Backend Connection Settings -
backend_hostname0 = '172.31.26.50'
backend_port0 = 5432
backend_weight0 = 1
backend_hostname1 = '172.31.20.98'
backend_port1 = 5432
backend_weight1 = 1
# - Authentication -
enable_pool_hba = on
authentication_timeout = 60
# - SSL Connections -
ssl = off
#------------------------------------------------------------------------------
# POOLS
#------------------------------------------------------------------------------
# - Pool size -
num_init_children = 32
max_pool = 4
# - Life time -
child_life_time = 120
child_max_connections = 0
connection_life_time = 120
client_idle_limit = 120
#------------------------------------------------------------------------------
# LOGS
#------------------------------------------------------------------------------
# - Where to log -
log_destination = 'syslog'
# - What to log -
print_timestamp = off
log_connections = off
log_hostname = off
log_statement = off
log_per_node_statement = off
log_standby_delay = 'if_over_threshold'
# - Syslog specific -
syslog_facility = 'LOCAL0'
syslog_ident = 'pgpool'
# - Debug -
debug_level = 0
#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------
pid_file_name = '/var/run/pgpool.pid'
logdir = '/var/log'
#------------------------------------------------------------------------------
# CONNECTION POOLING
#------------------------------------------------------------------------------
connection_cache = on
reset_query_list = 'ABORT; DISCARD ALL'
#------------------------------------------------------------------------------
# REPLICATION MODE
#------------------------------------------------------------------------------
replication_mode = off
replicate_select = off
insert_lock = on
lobj_lock_table = ''
# - Degenerate handling -
replication_stop_on_mismatch = off
failover_if_affected_tuples_mismatch = off
#------------------------------------------------------------------------------
# LOAD BALANCING MODE
#------------------------------------------------------------------------------
load_balance_mode = on
ignore_leading_white_space = on
white_function_list = ''
black_function_list = 'nextval,setval,lastval,currval'
#------------------------------------------------------------------------------
# MASTER/SLAVE MODE
#------------------------------------------------------------------------------
master_slave_mode = on
master_slave_sub_mode = 'stream'
# - Streaming -
sr_check_period = 0
sr_check_user = 'postgres'
sr_check_password = ''
delay_threshold = 10000000
#------------------------------------------------------------------------------
# PARALLEL MODE AND QUERY CACHE
#------------------------------------------------------------------------------
parallel_mode = off
enable_query_cache = off
pgpool2_hostname = ''
Теперь запускаем
# /etc/init.d/pgpool2 start
Проверяем через pgbench
# psql -h 127.0.0.1 -p 5432 -U postgres -c 'show pool_status' app_db
Если все верно, то будет вывод таблицы с перечисленными настройками.
На главную "Virtualizing Linux"
Добрый день, подскажите, как поступить в ситуации postgresql+pgpool если нужна авторизация через ldap. Можно ли пропустить авторизацию pgpool (не создавать файл pool_passwd?) или может pgpool умеет подключаться не через md5?
ОтветитьУдалить