Hai un progetto abbastanza interessante. Non ho mai visto direttamente nessuno provare a implementare qualcosa di così grande, almeno su SQL Server. Più leggo il tuo post, più domande mi vengono in mente ...
Nel peggiore dei casi, dal punto di vista dell'infrastruttura (che in realtà è lo scenario migliore, dal punto di vista aziendale), sono necessari database 10K ogni 2k utenti. Sono 20.000.000 di utenti. Non riuscirai a provare a gestire accessi di 20 M SQL Server. IMO. Solo il loro numero assoluto, che si occupa di spostarli da un server all'altro, facendo attenzione alle collisioni tra ID e ID non corrispondenti, inoltre non sono sicuro di come SQL Server si comporterebbe con 20 M righe in sys.server_principals. Inoltre, la tua app web probabilmente vorrà connettersi come un numero singolo o molto basso di utenti. IIS non può raggruppare le connessioni a meno che le stringhe DSN non siano identiche. Uno degli attributi di una stringa DSN è il nome utente. Utenti diversi non significano pool.
Dovrai creare il tuo schema di credenziali utente. Dovrà essere in grado di capire a quale inquilino appartiene un utente e quindi il tuo codice web dovrà selezionare il database corretto. I metadati dell'utente sono fondamentali, dovranno essere archiviati da qualche parte, dovranno essere raggruppati o sottoposti a mirroring, dovranno essere veloci e dovranno essere ben protetti (dal punto di vista della sicurezza. IOW, crittografarlo.). Supponendo che SQL sia anche una buona idea qui, terrei questo database lontano dalle istanze che i tenant del server. Questo aiuta da un punto di vista della sicurezza e da un punto di vista del carico, anche se immagino che una volta che un utente è stato convalidato e l'app Web viene indirizzata al database corretto in un'altra istanza, non ci saranno più query su questi metadati dell'utente correlati a quello utente.
Domanda rapida: due utenti diversi, che appartengono a due inquilini diversi, dovrebbero avere lo stesso nome utente?
Un'altra domanda veloce: se ti dico che lavoro per FuBar, Inc., come lo sai? FuBar ti fornirà un elenco di utenti e tu restituirai loro un elenco di nomi utente o si autoalimenteranno?
Dovrai passare a più istanze. Se anche una minima parte di quegli utenti decide di colpire l'applicazione in una sola volta, si scioglierà una singola istanza. Non avrà abbastanza thread di lavoro per eseguire tutte quelle richieste contemporaneamente. Se solo 1000 utenti accedono contemporaneamente alla tua istanza, probabilmente si esauriranno i thread di lavoro e la richiesta inizierà ad accumularsi e attendere. L'ho visto accadere; il sintomo prossimo è che le nuove connessioni non saranno in grado di accedere all'istanza perché non ci sono thread di lavoro disponibili per servirle. Se si tratta di un comportamento di breve durata, l'app potrebbe sopravvivere. In caso contrario, o se l'app è pignola, gli utenti riceveranno errori.
Anche se non avrai molti inquilini da avviare, dovresti iniziare a pensare al futuro e all'automazione perché quando vedi che il tuo server è impantanato e ci sono 10 nuovi inquilini da portare online, è praticamente troppo tardi e il tuo servizio (e i tuoi clienti e i tuoi futuri ex clienti) soffriranno fino a quando non riuscirai a risolvere il problema.
Avrai bisogno di un modo per spostare i database, dai server sovraccaricati ai server leggermente caricati (o nuovi). La possibilità di ottenere o meno una finestra di inattività dipenderà dal tuo SLA.
Stai fornendo un'applicazione specifica, come SalesForce, o questi database sono solo contenitori per qualunque cosa i tuoi inquilini vogliano inserire?
Quanto sono grandi i database? Se non sono molto grandi, puoi semplicemente ripristinare da un file di backup che fornisce un modello. (Questo non è molto diverso da quello che fa il database dei modelli, ma non ho mai visto nessuno usare il modello in modo positivo dai miei giorni con SQL 6.5.) Una volta ripristinato il modello con il nuovo nome del database, potresti quindi personalizzare il nuovo database come necessario per un tenant specifico. Non è possibile eseguire la personalizzazione prima di avere l'inquilino, ovviamente. Se il database è di grandi dimensioni, è possibile seguire la stessa procedura di base, ad eccezione del ripristino anticipato, prima che qualsiasi nuovo tenant abbia bisogno di spazio. Potresti tenere un paio di questi database in giro, forse uno per istanza. Se ne conservi troppi, questo ti costringerà forse ad acquistare più hardware e / o spazio di archiviazione di cui hai bisogno,
Se questa è la tua app, come gestirai gli aggiornamenti degli schemi? Come manterrai le versioni del database diritte con le versioni del codice, se stai utilizzando un singolo URL che arriva alla tua app web?
Come si rilevano e distruggono i database che non sono più in uso? Aspetti che il tuo gruppo A / R dica che qualcuno non ha pagato il conto per tre mesi?
Se i tenant gestiscono le autorizzazioni, ciò implica che hanno una certa comprensione del funzionamento interno dell'app o che l'app ha una struttura di ruolo molto semplice. Usando qualcosa come Blogger come esempio approssimativo, gli utenti possono (leggere post), (leggere post e commentare), (... e creare post), (... e modificare post di altri), (... e ripristinare password di altri utenti) o (... e quant'altro). Avere un ruolo per ciascuno di questi diversi set di diritti e assegnare un utente a un ruolo o a un altro non dovrebbe essere troppo difficile, ma non vuoi che la tua app esegua le dichiarazioni "GRANT". Fai attenzione ai ruoli che hanno una gerarchia e dipendono dall'eredità, può creare confusione. Se stai promuovendo o degradando un utente, direi di estrarlo da tutti i ruoli associati e quindi di aggiungerli all'unico ruolo di cui hanno bisogno. Oh,
Penso di aver solo graffiato la superficie qui e questo post è già troppo lungo. Ciò di cui hai veramente bisogno è un libro, o almeno un white paper di qualcuno che lo ha fatto. Molti di questi ragazzi non parleranno, se lo vedono come un vantaggio competitivo.