Il mirroring richiesto per il tuo scopo deve essere un mirroring sincrono.
Questo tipo di strategia di replica viene generalmente ottenuta tramite meccanismo che implica transazioni ACID . Implica sempre una certa latenza quando si esegue un'operazione su una qualsiasi delle macchine.
Tipicamente, questo funzionerebbe in qualche modo come questo (semplificato):
- La macchina A esegue un'operazione che richiede l'aggiornamento della mappa.
- La macchina A imposta un blocco sulla sua mappa
- Macchina A chiedi a B di impostare un blocco sulla sua mappa
- La macchina A aggiorna la sua mappa
- La macchina A informa B dell'aggiornamento richiesto
- La macchina B aggiorna la sua mappa
- La macchina B informa A che è finita e rilascia il blocco
- La macchina A rilascia il lucchetto.
Questo approccio è decentralizzato. Nessun maestro Ma questo modo di procedere è molto pesante se ci sono molte scritture su entrambe le macchine: la tua mappa diventerà rapidamente un collo di bottiglia. Ed è estremamente complesso: devi affrontare tutto ciò che può andare storto, per esempio, sul nodo che si blocca mentre blocca il tavolo.
Un altro approccio potrebbe essere quello di rendere una macchina il master per questa tabella e replicare le modifiche all'altra. Così facendo si sostituisce il meccanismo di blocco e si aumenta la tolleranza di errore su ogni macchina, ma il master. In termini di prestazioni, avrai gli stessi svantaggi dell'approccio iniziale.
È possibile superare questi problemi di replica adottando una strategia partizionamento (ogni macchina è responsabile per una parte dei dati, da definire se il partizionamento orizzontale o verticale).
Un altro approccio, ancora più scalabile, è la sincronizzazione asincrona: ogni database è indipendente e di volta in volta si sincronizzano. Questo può funzionare insieme in modo efficiente se utilizzato in combinazione con il partizionamento orizzontale.