Hola Mariano.

    Me interesa mucho ver como seria el formato que planeas para agilizar el proceso, quizas puedo ayudar ;).

En cuanto a la espera en time.sleep(60) la baje considerablemente a 5, ayudo a reducir el tiempo entre  reintentos  y el Time out lo setee a '1'.
El resultado mejora bastante.

probare el 'NOWAIT'  en  pyreplica.py, revisare como funciona la configuración ;)

Saludos y gracias.


Mariano Reingart wrote:
2009/10/13 Javier Fritz Alsite <jfritz.aliste@gmail.com>:
  
Hola.

    Como ya he comentado estoy instalando un "cluster de replicacion" basado
en PyReplica, creo que todo va bastante bien, ahora estoy ajustando algunos
valores para mejorar la performance. El punto que busco solucionar ahora es
el tiempo desde que ocurre un error, normalmente por concurrencia, hasta que
se reintenta la ejecución.

    

Hola Javier, el tema de la performance ante concurrencia es un punto
que lo tengo visto con pyReplica.
Para que sea compatible con versiones de posgresql antiguas, no usa id
de transacciones (txid), por lo que bloquea los registros a replicar y
usa commit en dos fases.
En futuras versiones tengo planeado no bloquear esta tabla y usar las
txid para agilizar el tema, evitar los bloqueos y los commits en dos
fases, lo que debería acelerar mucho el proceso.
Si te interesa te puedo comentar como sería.

  
    Buscando en los archivos de PyReplica encontre un valor que se pueden
manejar para mejorar el tiempo de respuesta: time out entre selects, lo
ajuste a 3 seg, funciona mucho mejor, por defecto viene con 60 segs,
pensando que estos servidores son exclusivos para el servicio de postgres, y
atienden a 5 usuarios mas 2 esclavos de PyReplica. El problema principal
sucede cuando dos nodos esclavos intentan leer el mismo registro de forma
concurrente, es un error conocido y se acepta su condicion, pero el problema
es el tiempo que demora en reintetar la ejecución del query, a pesar de
mejorar el rendimiento con el cambio mencionado, creo que aun es lenta la
reacción del servidor esclavo en reintentar la ejecución, demora mucho mas
de tres segundos.

    

Cambiaste la linea que espera entre reintentos no?
daemon.py, clase Replicator, método run:

           time.sleep(60)

Este es el valor que duerme entre error y error, para que no sature el
servidor en caso de que haya problemas de conectividad o similar.

  
Existe algun otro ajuste que pueda realizarse a los valores por defectos de
PyReplica.
    

Podes intentar que el SELECT no se bloquee agregando NOWAIT, con ello
no va a esperar y debería reintentar más rapidamente si tenés alta
concurrencia:
pyreplica.py, función replicate:

cur0.execute("SELECT id,sql FROM replica_log "
                 "WHERE NOT %s %s "
                 "ORDER BY id ASC FOR UPDATE NOWAIT" % (slave_field, sql) ,args)

Cualquier cosa avisame,
Sds
Mariano