Cómo funciona?

Tu aplicación usará una versión modificada de la librería de SQLite la cual contiene el código de LiteSync para acceder a tu base de datos.

Las modificaciones en la librería de SQLite son internas y la interfaz es la misma.

Las librerías LiteSync se comunicarán entre ellas, intercambiándose transacciones de datos.






Replicaciones

La primera vez que la aplicación este abierta conectará con el/los nodo(s) y descargará una copia reciente de la base de datos.

En una centralizada topología el nodo primario enviará la copia de la base de datos a los nodos secundarios.

Una vez esté descargado el nodo comienza la sincronización.



Sincronización

Una vez los nodos tengan la misma base db intercambiarán transacciones que fueron ejecutadas cuando estuvieron fuera de línea.

Luego de esto entrarán en modo en línea y una vez una transacción ha sido ejecutada en un nodo es transferida para ser ejecutada en los nodos conectados.

Si el nodo está fuera de línea entonces la transacción es guardada en un registro local para ser intercambiada luego.



NECESITO CAMBIAR MI APLICACIÓN DE CÓDIGO?

Hay unos cuántos pasos pero básicamente debemos cambiar la cadena URI en la base de datos abriéndola desde aquí:

"file:/path/to/app.db"

para algo así:

"file:/path/to/app.db?node=secondary&connect=tcp://server.ip:1234"

Las buenas noticias son que LiteSync usa la interfaz nativa de SQLite3. significa que no necesitamos usar otra API.



Conección

Cada nodo tiene 2 opciones:

enlazar a una dirección
conectar a la dirección de pares

Entonces puedes elegir cual lado conectará al otro. Esto es indispensable cuando un lado está detrás de un router o firewall.



Topologías Soportadas


Topología Estrella, Centralizada


En esta topología tenemos un nodo en el cual todos los demás nodos estarán conectados, entonces debe estar en línea para que la sincronización entre en juego.

Aquí hay algunas configuraciones de ejemplo:


El nodo primario puede enlazar a una dirección y los nodos secundarios conectarse a ahí.

Nodo primario:

"file:/home/user/app.db?node=primary&bind=tcp://0.0.0.0:1234"

Nodo secundario: (en otro dispositivo)

"file:/home/user/app.db?node=secondary&connect=tcp://server:1234"


El nodo primario también puede conectarse a nodos secundarios.

Nodo primario:

"file:/home/user/app.db?node=primary&connect=tcp://address1:port1,tcp://address2:port2"

Nodos secundarios: (cada uno en un dispositivo separado)

"file:/home/user/app.db?node=secondary&bind=tcp://0.0.0.0:1234"


Incluso podemos usar una mezcla de estas 2 opciones.

Nodo primario:

"file:/home/user/app.db?node=primary&bind=tcp://0.0.0.0:1234&connect=tcp://address1:port1"

Nodo Secundario 1:

"file:/home/user/app.db?node=secondary&connect=tcp://server:1234"

Nodo Secundario 2:

"file:/home/user/app.db?node=secondary&bind=tcp://0.0.0.0:1234"



Estado de Sincronización

Podemos revisar el estado de sincronización usando este comando:

PRAGMA sync_status

Devuelve una cadena JSON.



Revisando si el db está totalmente listo

Si es la primera vez que la aplicación está siendo abierta en un dispositivo puede que descargue una nueva copia de la base de datos desde otro nodo. Hasta que esté hecho no podemos acceder al db.

Podemos recuperar el estado de sincronización y revisar la variable db_is_ready

Revisa los ejemplos de aplicaciones básicas abajo.



Cómo usarlo en mi aplicación?

Hay 3 pasos:

1  Reemplaza la librería de SQLite con el que contiene LiteSync

2  Cambia la cadena de conección URI

3  Revisa el estado listo de db

Cuando se compila aplicaciones C y C++ debes vincular tu aplicación a la librería de LiteSync.

Para otros idiomas debes tener el apropiado envoltorio instalado.



Ejemplo de nodo primario

El nodo primario puede ser una aplicación normal, exactamente la misma aplicación como los nodos secundarios pero usando un URI diferente.

O podemos usar una aplicación dedicada para ser el nodo primario.

Una aplicación independientemente básica usada sólamente para el propósito de mantener un nodo db centralizado que se vería así:

Elige un idioma -->



Ejemplo de aplicación básica

Una aplicación básica que escribe a la base de datos local se vería así:

Elige un idioma -->



SEGURIDAD

LiteSync utiliza el método de "secreto compartido" para controlar qué nodos pueden ser parte de la red, mediante el cifrado con una clave secreta

Es posible (y recomendado) habilitar el cifrado en la base de datos y en la comunicación entre los nodos

Consulte las instrucciones sobre Cifrado



LIMITACIONES ACTUALES

1  Las funciones no deterministas (que devuelven valores diferentes cada vez que se llaman) están bloqueadas, como random() y date('now'). Use valores explícitos generados en su aplicación

2  La palabra clave AUTOINCREMENT no es compatible, ¡pero no la necesita! (consulte el video para más detalles)

3  Solo una única aplicación puede acceder a la base de datos al mismo tiempo. Cada instancia debe usar su propia base de datos, y luego serán replicadas y sincronizadas usando LiteSync