Dal punto di vista dello sviluppatore, posso dire che quasi tutti i tradizionali motori di database tradizionali possono solo scalare e ridimensionare è un pensiero secondario.
Negli ultimi anni, con la necessità di una maggiore scalabilità e sistemi ad alta disponibilità, sono stati compiuti sforzi per ampliare i database esistenti. Ma poiché i progetti sono ostacolati da un codice legacy, è semplicemente bloccato piuttosto che fondamentale per il design. Incontrerai questo se provi a ridimensionare la maggior parte dei noti motori di database. L'aggiunta di server slave può essere piuttosto difficile da configurare e noterai che presenta limitazioni significative, alcune delle quali potrebbero richiedere il re-jigging delle tabelle del database.
Ad esempio, la maggior parte di essi sono progetti master / (multi-) slave piuttosto che multi-master. In altre parole, potresti avere un intero server semplicemente seduto lì e non in grado di elaborare le query. Alcuni lo fanno, ma con limitazioni ... ad esempio leggere solo il design multi-slave. Quindi potresti avere un server che accetta le scritture e tutti gli altri forniscono dati di sola lettura. Noterai che quando imposti questi sistemi non è sempre un processo semplice e difficile far funzionare bene. In molti casi sembra davvero un fulmine.
D'altra parte, ci sono alcuni motori di database più recenti sviluppati con concorrenza e design multi-master sin dall'inizio. NoSQL e NewSQL sono la nuova classe di progettazione.
Quindi sembrerebbe che il modo migliore per ottenere prestazioni migliori da un server SQL tradizionale sia scalare! Mentre con NOSQL e NewSQL è sia scalare che ridimensionare.
Il motivo per cui i sistemi RDBMS tradizionali sono strettamente accoppiati è perché tutti hanno bisogno di una visione coerente degli stessi dati. Quando hai più server che accettano aggiornamenti sugli stessi dati da client diversi, di quale ti fidi? Qualsiasi metodo che tenti di garantire la coerenza dei dati attraverso una sorta di meccanismo di blocco richiede la cooperazione di altri server che danneggiano le prestazioni o influiscono sulla qualità dei dati in quanto i dati letti da un client potrebbero non essere aggiornati. E i server devono decidere tra loro quali dati sono più recenti quando scrivono nello stesso record. Come puoi vedere, è un problema complesso reso più complesso dal fatto che il carico di lavoro è distribuito su più server e non solo tra processi o thread in cui l'accesso ai dati è ancora piuttosto veloce.