2013-06-04 17 views
23

La nostra applicazione richiede 5 raccolte in un db. Quando aggiungiamo i clienti alla nostra applicazione vorremmo mantenere il db separato per ogni cliente. Ad esempio, se abbiamo 500 clienti, avremmo 500 db e 2500 collezioni (ogni db ha 5 collezioni). In questo modo possiamo separare i dati di ciascun cliente. La mia preoccupazione è, porterà a problemi di prestazioni?Prestazioni MongoDB - con più database

UPDATE: seguire anche questo google-group discussion.

+0

Su un numero elevato di clienti si potrebbe preferire invece cercare istanze isolate, ma ciò dipende da più di quello che è stato fornito da – Sammaye

+2

, che sono i frammenti per - sono ciascuno un'istanza mongod separata/set di repliche. questa è una configurazione estremamente comune per molti utenti di MongoDB che ospitano tenant multipli e DB separati è una risposta standard qui. –

risposta

30

La nostra applicazione ha bisogno di 5 collezioni in un db. Quando aggiungiamo i client a la nostra applicazione vorremmo mantenere il db separato per ogni cliente . Ad esempio, se disponiamo di 500 clienti, avremmo 500 000 db e 2500 raccolte (ogni db ha 5 raccolte). In questo modo possiamo separare ogni dato cliente.

Questa è una grande idea. Oltre alla separazione logica che questo ti fornirà, sarai anche in grado di utilizzare la sicurezza a livello di database in MongoDB per aiutare a prevenire l'accesso involontario ai dati di altri clienti.

La mia preoccupazione è, porterà a problemi di prestazioni?

No, e infatti vi aiuterà come con blocco a livello di database estremamente pesante conflitto di blocco per un cliente (se è possibile nel vostro scenario) non avrebbero influire sulle prestazioni di un altro cliente (ancora potrebbe se sono in competizione per la stessa larghezza di banda I/O ma se si utilizza l'opzione --directoryperdb allora si ha la possibilità di posizionare tali DB su dispositivi fisici separati

Sharding consentirà anche un ridimensionamento semplice in quanto non sarà nemmeno necessario suddividere le raccolte - puoi semplicemente ruotare i database su più frammenti per consentire la distribuzione del carico in cluster separati (se e quando raggiungi quel livello).

Contrariamente alla rivendicazione nell'altra risposta, il thread TTLMonitor NON carica i documenti nella RAM a meno che non vengano eliminati (e aggiunti all'elenco libero). Funzionano con gli indici TTL sia per indicare se i documenti devono essere scaduti, sia per localizzare direttamente il documento.

Consiglio vivamente contro il database una soluzione di molte raccolte in quanto non consente di partizionare il carico, né fornire sicurezza, né è più facile da gestire sul lato dell'applicazione.

+0

+1 Probabilmente hai molta più esperienza di me, anche se continuo a pensare che una risposta adeguata richieda maggiori informazioni sulla situazione. –

+0

Sono d'accordo - per la maggior parte, ma penso che ci siano abbastanza informazioni di base dato che una volta che ci sono molti più database possono essere suddivisi con meno complessità rispetto a quando devono dividere la raccolta su molti frammenti. In altre parole, il loro caso d'uso sarà facilmente scalabile orizzontalmente, il che renderà la suddivisione in db un'opzione sicura. –

+0

Penso che questo abbia senso nello scenario dell'OP, che credo sia pochi utenti ma un numero di documenti relativamente alto per utente, ma se l'OP dovesse scalare oltre un paio di migliaia di clienti (diciamo 1 milione) sarebbe ancora un buon approccio? – nick

Problemi correlati