Seleccionar página

Al agregar pgpool-II a PostgreSQL nos da balanceo de carga. También nos podría dar alta disponibilidad, pero aún no lo hemos hecho.

Nos entrega balanceo de carga, ya que permite enviar la consulta que hagamos a diferentes servidores, pero que para nosotros es sólo uno. También podría darnos alta disponibilidad, es decir que cuando el master no este disponible un slave se transformara en el master.

En la máquina instalamos pgpoll-II para ello ejecutamos el siguiente comando:

apt-get install pgpool2

Y paramos el servicio por un rato

service pgpool2 stop

Ahora vamos a configurar pgpool-II

cd /etc/pgpool2/
cp pgpool.conf{,.back}
cp pcp.conf{,.back}
echo pgpool:`pg_md5 contrasena` >> pcp.conf

Ahora editamos el archivo /etc/pgpool2/pgpool.conf para que quede así:

#———————-#
# CONNECTIONS  #
#———————#

listen_addresses = ‘localhost’
port = 5432
socket_dir = ‘/var/run/postgresql’
pcp_port = 9898
pcp_socket_dir = ‘/var/run/postgresql’

#—————#
# BACKEND #
#————–#
backend_hostname0 = ‘ip_master’
backend_port0 = 5432
backend_weight0 = 0
backend_data_directory0 = ‘/var/lib/postgresql/xxx/main’
backend_flag0 = ‘ALLOW_TO_FAILOVER’

backend_hostname1 = ‘ip_slave1’
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = ‘/var/lib/postgresql/xxx/main’
backend_flag1 = ‘ALLOW_TO_FAILOVER’

#———#
# AUTH #
#———#

enable_pool_hba = off
pool_passwd = ”
authentication_timeout = 60

#——#
# SSL #
#——#
ssl = off

#———-#
# POOLS #
#———-#
num_init_children = 32
max_pool = 4
child_life_time = 300
child_max_connections = 0
connection_life_time = 0
client_idle_limit = 0

#———#
# LOGS #
#——–#
log_destination = ‘stderr’
print_timestamp = on
log_connections = off
log_hostname = off
log_statement = off
log_per_node_statement = off
log_standby_delay = ‘none’
syslog_facility = ‘LOCAL0’
syslog_ident = ‘pgpool’
debug_level = 0

#————————#
# FILE LOCATIONS #
#———————–#
pid_file_name = ‘/var/run/postgresql/pgpool.pid’
logdir = ‘/var/log/postgresql’

#——————————–#
# 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 = ”
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,currval

#——————————-#
# MASTER/SLAVE MODE #
#——————————-#
master_slave_mode = on
master_slave_sub_mode = ‘stream’

sr_check_period = 0
sr_check_user = ‘pgpool’
sr_check_password = ‘contrasena
delay_threshold = 0

follow_master_command = ”

#————————————————–#
# PARALLEL MODE AND QUERY CACHE #
#————————————————–#
parallel_mode = off
enable_query_cache = off
pgpool2_hostname = ”
system_db_hostname = ‘localhost’
system_db_port = 5432
system_db_dbname = ‘pgpool’
system_db_schema = ‘pgpool_catalog’
system_db_user = ‘pgpool’
system_db_password = ”

#———————-#
# HEALTH CHECK #
#———————-#
health_check_period = 0
health_check_timeout = 20
health_check_user = ‘pgpool’
health_check_password = ‘pgpool’

Entonces ahora, tenemos configurado pgpool-II. Pero aún nos falta permitir el acceso en el master y los slave, para ello editamos el archivo /etc/postgresql/xxx/main/pg_hba.conf y agregamos los siguiente:

host all pgpool ip_maquina_pgpool/32 md5

Y como de seguro ocuparemos un usuario distinto de postgres y pgpool para nuestra aplicación, lo agregamos también:

host base_datos usuario ip_pgpool/32 password

Si lo queremos dejar sólo en una base de datos:

host base_datos usuario ip_pgpool/32 password

Ahora iniciamos pgpool-II en la máquina que la instalamos:

service pgpool2 start

Y podríamos entonces consultar la base de datos con el usuario de la aplicación usando:

psql -h localhost -W -U usuario -d base_datos

Ahora habría que estudiar como configurar la alta disponibilidad.