Wrapper para dbapi2

Chema Cortes pych3m4 en gmail.com
Vie Jul 28 01:47:56 CEST 2006


El 27/07/06, Pepe Aracil<pepe en diselpro.com> escribió:

> Tengo que montar un sistema de réplica en Mysql de un solo sentido, es
> decir si del servidor A es el maestro y los servidores B y C son esclavos,
> todas las modificaciones (INSERT,DELETE,UPDATE,GRANT,...) que se hagan en
> el servidor A se replicaran en los servidores B y C, pero no a la inversa.
>
> La idea es adaptar ana aplicación CGI que utiliza DBAPI2 de forma que haga
> un roundrobin con todos los servidores (A,B,C) para las sentencias de
> consulta,
> pero que solo utilice el servidor A para las operaciones de escritura.
>
> Una idea era utilizar SQLRelay, pero no encuentro la forma para que las
> escrituras
> se las envíe a un solo servidor mientras que haga roundrobin en las
> lecturas.
>
> La otra opción es hacer un wrapper de la dbapi2 de forma que sea
> transparente
> para la aplicación tanto el rounddobin como la escritura forzada en el
> servidor A.
> La idea es analizar la cadena que se le pasa al "execute" y si es un
> select se va a un
> host (al que le toque el turno) y si es una operación de escritura se va
> al host A.
>
> ¿Alguien se ha encontrado en esta misma situación?

Parece que ha habido más gente en esta situación. Mira lo siguiente:

http://dev.mysql.com/doc/refman/5.0/es/cj-replication-connection.html


Es un wrapper para JDBC, pero te puede dar una idea. El modo de
trabajar es configurando la conexión de sólo lectura (entre esclavos)
o de lectura/escritura (maestro). Aunque no lo he probado, supongo que
funcionará desde jython pasándole al zxJDBC el driver
"com.mysql.jdbc.ReplicationDriver". Si lo haces me gustaría conocer
cómo te fue:

from com.ziclix.python.sql import zxJDBC

dburl="jdbc:mysql://master,slave1,slave2,slave3/test"
user="user"
passwd="password"
driver="com.mysql.jdbc.ReplicationDriver"

conn=zxJDBC.connect( dburl,user,passwd,driver)
cur=conn.cursor()

#trabajo con el master
conn.setReadOnly(false)
cur.execute(.....)

#trabajamos con los esclavos en "round-robin"
conn.setReadOnly(true)
cur.execute(...)


Lo que no tengo claro es qué pasa con las transacciones. Podría ser
que las transacciones se deshacen (rollback) al pasar a modo de sólo
lectura, por lo que se deberían consolidar antes del cambiar el modo.




Más información sobre la lista de distribución Python-es