Re: Consulta PyReplica

From: Mariano Reingart <reingart(at)gmail(dot)com>
To: Javier Fritz Alsite <jfritz(dot)aliste(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta PyReplica
Date: 2009-10-14 14:26:22
Message-ID: 5aebd8250910140726i15f1f50sbc634c6172020dc8@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2009/10/13 Javier Fritz Alsite <jfritz(dot)aliste(at)gmail(dot)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

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Arturo 2009-10-14 14:26:40 Re: psql portable
Previous Message Alvaro Herrera 2009-10-14 14:21:37 Re: psql portable