2009-12-11 11 views
24

In un'applicazione che incorpora SQLite3 e utilizza un database in memoria, è possibile replicare il database tra due istanze in esecuzione dell'applicazione? Potrei farlo a mano con un protocollo homebrew che duplica tutti i miei accessi al DB, ma sembra qualcosa che dovrebbe essere fatto all'interno del livello DB.SQLite supporta la replica?

risposta

12

Approccio forza bruta: inviare il comando ".dump" per creare una rappresentazione di testo dei dati. Leggi quei dati nel secondo database. Non sono sicuro che tu possa usarlo.

Se avete bisogno di un aggiornamento a grana fine (l'invio di una copia di ciascuna fino a l'altra copia), dare un'occhiata a sqlite3_update_hook

Ma come pensate di gestire gli errori? Ad esempio, cosa succede quando la copia del DB in app2 non può effettuare un aggiornamento per qualche motivo?

Per risolvere questo problema, spostare il database in un processo server e fare in modo che le due app parlino.

+0

Ok, quindi sqlite3_update_hook sarebbe il mio punto di partenza per il layering a livello di riga per riga. È molto utile, grazie. In risposta agli altri punti, evito cose che non possono essere inserite da determinate proprietà magiche dell'applicazione. Il desiderio di due istanze separate anziché di un DB centrale è guidato da un requisito di robustezza per distribuzione e sqlite è guidato da un limite di risorse di sistema. – kdt

+1

Ok. Assicurati che entrambe le copie esauriscano memoria/spazio su disco allo stesso tempo, ecc. –

+0

Questa non sembra una risposta seria. Sì, potresti eventualmente costruirlo da solo, ma sarà una grande impresa renderlo affidabile. –

0

No, non perché l'ambito del progetto è un semplice database in-process. Ma poiché il database è solo un singolo file, è possibile scrivere il proprio script di replica basato su semplici operazioni di copia di file, rsync o qualcosa di simile.

Se si desidera un tipo client/server di RDBMS basato su SQLite, è possibile dare un'occhiata a SQLiteDBMS.

1

Se si desidera eseguire la replica in un database in memoria, è necessario consultare berkeley DB (BDB). Tuttavia, il modello di dati per BDB è un dizionario stringa-stringa, quindi perdi la flessibilità di SQL. in più ha una licenza di tre clausole, quindi se il tuo progetto è commerciale devi ottenere le licenze.

0

Unison? La cosa migliore che si poteva fare era il backup a caldo, perché SQLite db in un file monolitico. Non è possibile aggirare il round tra le due "istanze". L'hot spare non è male, si prende semplicemente l'altra app + db senza tante storie, si confronti con MySQL master-slave o active-passive dove c'è un intervento manuale che non è facile. La replica MySQL passa attorno a SQL, non solo diff come unison/rsync. Ma con unisono hai un maestro.

2

Lsyncd - Live Syncing (Mirror) Daemon può essere utile qui. Utilizza rsync per eseguire la replica continua a livello di file.

+0

Probabilmente non è una buona idea per i database di esecuzione live. Ciò potrebbe causare il danneggiamento del database slave se si replica durante una transazione. –

5

Ci sono 2 opzioni implementati all'interno dello strato DB:

litereplica (una replica direzione, in tempo reale backup incrementale)

{ Characteristics: [ 
    "replica db is binary equivalent of main db when synchronized", 
    "replica db is read-only", 
    "all the db is replicated" ], 
Split Brain: "not applicable, as it is single master", 
Additional Features: "Point-in-time recovery, encryption using ChaCha", 
Interface: "native SQLite. Existing wrappers for SQLite can be used", 
Notes: "does not support WAL", 
License: "commercial" } 

litesync (replica multi-master e sincronizzazione)

{ Characteristics: [ 
    "can write to the db even when it is off-line", 
    "fast (first write to local db, then synchronize using a worker thread)", 
    "avoids insert id collisions using modified rowids" ], 
Split Brain: "does not occur because it uses a star topology", 
Additional Features: "encryption using ChaCha", 
Interface: "native SQLite. Existing wrappers for SQLite can be used", 
Notes: "use attached db for replication of only some tables", 
License: "commercial" } 
+0

Grazie per la risposta. Ho letto il link che hai citato su litereplica e l'ho scaricato. Tuttavia, non ci sono abbastanza informazioni su come impostare lo slave master (onestamente, non l'ho mai fatto prima, quindi sono un po 'confuso). Avete qualche informazione in più o un collegamento ad un tutorial su di esso? Grazie – mOna

+0

Controlla il video sul sito web. – malhal

0

Fuori dalla scatola, no. ci sono un piccolo numero di opzioni di terze parti:

SQLite sincronizzazione: https://ampliapps.com/sqlite-sync/ Questo sembra interessante perché può replicare ad altri database e SQLite, e non modifica il motore SQLite. Non l'ho ancora provato.

Litereplica: http://litereplica.io/ Solo andata. Sembra essere stato un po 'in giro.

LiteSync: http://litesync.io/ Replica a due vie. Piuttosto nuovo, ma un'evoluzione di Litereplica quindi probabilmente più matura di quanto sembri.Ho provato questo un po 'e sembra funzionare senza problemi, con alcuni bug che lo sviluppatore sta guardando. Devi usare il motore SQLite modificato dello sviluppatore, che sembra una dipendenza preoccupante. Inoltre, non ottieni molto controllo, ad es. non puoi dire di replicare ora senza riaprire il database.