PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 12/12/2013 18:41:48

dt
Membre

Load balancing avec pgpool2 ne fonctionne pas...

Bonjour,

j'essaye de mettre en place un cluster de serveurs postgresql avec pgpool2, en mode maitre / esclave et load balancing, mais les requêtes select sont toujours envoyés au maitre, jamais à l'esclave.

Pour mes tests, j'utilise trois VM Ubuntu server 12.04, la première avec pgpool2 version 3.1.1, les deux autres avec postgresql 9.1. J'ai mis en place la réplication par streaming entre le maitre et l'esclave, ça marche impeccable, les enregistrements insérés dans le maitres apparaissent dans l'esclave à peine une seconde plus tard. Pour traquer les requêtes sur les différents serveurs, j'ai mis log_statement à all sur le maitre et l'esclave.

Pour exécuter mes requêtes, je me connecte sur le serveur de pool avec psql, et je peux exécuter mes requêtes, sauf que quand je regarde les logs, toutes les requête sont exécutées sur le maitre, alors que je m'attendais à ce que les SELECT sont envoyés à l'esclave. Dans les logs du maitre, je vois bien les connexions / déconnexions toutes les 10 secondes pour les health check, mais rien du tout coté esclave. Pourtant, je peux me connecter depuis la machine de pool sur l'esclave avec psql. Si je coupe le master et redémarre pgpool, au bout d'un moment, je peux me connecter sur l'esclave et lancer des requêtes dessus, mais je ne peux pas faire d'insertion, la connexion est en read only. Et après redémarrage du maitre, on n'arrive plus à s'y connecter. Avec les logs pgpool en débug, le health check répond :

Dec 12 17:51:52 pool pgpool[4434]: health_check: 0 th DB node status: 3
Dec 12 17:51:52 pool pgpool[4434]: health_check: 1 th DB node status: 1

Pourtant, psql permet de s'y connecter et d'exécuter des requêtes...

Voici mon fichier pgpool.conf :

listen_addresses = '*'
port = 5432
socket_dir = '/var/run/postgresql'

pcp_port = 9898
pcp_socket_dir = '/var/run/postgresql'

# - Backend Connection Settings -

backend_hostname0 = '192.168.1.51'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/postgresql/9.1/main'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = '192.168.1.52'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/postgresql/9.1/main'
backend_flag1 = 'ALLOW_TO_FAILOVER'

# - Authentication -

enable_pool_hba = on
pool_passwd = 'pool_passwd' # fichier du mot de passe
authentication_timeout = 60

# - SSL Connections -
ssl = off

#------------------------------------------------------------------------------
# POOLS
#------------------------------------------------------------------------------

# - Pool size -
num_init_children = 32
max_pool = 4

# - Life time -
child_life_time = 300
child_max_connections = 0
connection_life_time = 0
client_idle_limit = 0
#------------------------------------------------------------------------------
# LOGS
#------------------------------------------------------------------------------
log_destination = 'syslog'
print_timestamp = on
log_connections = on
log_hostname = off
log_statement = on
log_per_node_statement = on
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'
#reset_query_list = 'ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT'


#------------------------------------------------------------------------------
# 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'

#------------------------------------------------------------------------------
# MASTER/SLAVE MODE
#------------------------------------------------------------------------------

master_slave_mode = on
master_slave_sub_mode = 'stream'
# - Streaming -
sr_check_period = 0
sr_check_user = ''
sr_check_password = ''
delay_threshold = 0

# - Special commands -
#follow_master_command = ''

#------------------------------------------------------------------------------
# PARALLEL MODE AND QUERY CACHE
#------------------------------------------------------------------------------

parallel_mode = off
enable_query_cache = off
pgpool2_hostname = ''
# - System DB info -
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 = 'nobody'
health_check_password = ''

#------------------------------------------------------------------------------
# FAILOVER AND FAILBACK
#------------------------------------------------------------------------------

#failover_command = ''
#failback_command = ''
#fail_over_on_backend_error = on

#------------------------------------------------------------------------------
# ONLINE RECOVERY
#------------------------------------------------------------------------------

recovery_user = 'postgres'
recovery_password = 'postgres'
recovery_1st_stage_command = ''
recovery_2nd_stage_command = ''
recovery_timeout = 90
client_idle_limit_in_recovery = 0

#------------------------------------------------------------------------------
# OTHERS
#------------------------------------------------------------------------------

relcache_expire = 0

Je vous remercie de votre aide, ma configuration me semble correcte, je n'ai pas la moindre idée pourquoi le load balancing ne fonctionne pas.

Denis

Dernière modification par dt (12/12/2013 18:56:15)

Hors ligne

#2 12/12/2013 19:11:05

dt
Membre

Re : Load balancing avec pgpool2 ne fonctionne pas...

J'ai trouvé...
Je lançais pgpool2 avec la commande

sudo service pgpool2 start

Le problème venait du script de lancement du service. En rajoutant l'option -D dans le script pour le lancement de pgpool2, tout fonctionne normalement : les health check ont lieu sur les 2 serveurs, et les SELECT vont bien vers l'esclave !

Hors ligne

#3 03/02/2015 09:41:45

woreirsis
Membre

Re : Load balancing avec pgpool2 ne fonctionne pas...

En rajoutant l'option -D dans le script pour le lancement de pgpool2, tout fonctionne normalement : les health check ont lieu sur les 2 serveurs, et les SELECT vont bien vers l'esclave !


We offer best quality    learnalanguage.com    test papers and     learn portuguese    dumps materials. You can get our 100% guaranteed  questions     coloradomesa.edu    to help you in passing the real exam.

Hors ligne

Pied de page des forums