2009/11/3 Javier Fritz Alsite <[email protected]> > Estimados. > > Estoy utilizando esta solución (pyreplica) y esta bastante estable, pero > tengo el siguiente problema. Tengo tres servidores cada uno es maestro de > los otros dos, debido a esto se producen cientos de bloqueos en la tabla de > replicación, a pesar de ello en unos poco segundos las bases son > sincronizadas en ambos esclavos (aprox. 10 seg, muy optimo, considerando en > la replicación de 500 querys por internet). Hasta aqui todo bien. > > El problema que esta apareciendo ahora es que cada algun tiempo (10hrs ó > mas) el hilo de replicación se suspende, no se detiene, de echo el > "keepalive" continua enviando datos al log, pero los query's simplemente no > se ejecutan en el destino, no se envian correos del error y en el log solo > aparecen los keepalive del hilo. ¿alguna pista?, ¿quedo a la espera de > alguna consulta?¿algun timeout no respetado?, se ajustaron todos a 3 seg, en > las configuraciones de PyReplica. > > Por algún motivo se debe estar bloqueando, hace un SELECT FOR UPDATE que es muy costoso, mas si tenes varios esclavos.
> Por ahora al detectar una acumulación importante de datos pendientes, se > reinicia el esclavo de pyreplica y se normaliza la situación, asi como > tambien en algunos casos el bloqueo es tal que la la petición de una > consulta demora muchisimo y ha sido necesario un restart al pgsql. > > Quizas el problema pase por ajustes al mismo motor, esto pensando en un > timeout u otro parametro que ayude a "soltar" consultas que toman demasiado > tiempo o que provoquen bloqueos prolongados, y asi no bloquear el servicio > para el resto de los usuarios del motor. > > El problema es el SELECT FOR UPDATE, habría que utilizar los id de transacción (txid). En ves de hacer: SELECT id,sql FROM replica_log WHERE NOT replicated ORDER BY id ASC FOR UPDATE Habría que hacer: SELECT id, sql FROM replica_log WHERE txid > mayor_txid_replicada OR txid IN (lista_de_txid_pendientes) y obviamente se elimina la necesidad de marcar las filas replicadas en el maestro: UPDATE replica_log SET replicated=TRUE WHERE NOT replicated Con lo que se eliminarían los bloqueos y actualizaciones en el maestro. El tema es como almacenar la lista de txid pendientes en el esclavo, con la función txid_current_snapshot(): http://www.postgresql.org/docs/8.4/interactive/functions-info.html Sds Mariano http://www.arpug.com.ar/
