Você tem um projeto bastante interessante. Eu nunca vi diretamente alguém tentar implementar algo tão grande, pelo menos no SQL Server. Quanto mais eu leio sua postagem, mais perguntas surgem ...
No pior cenário, em termos de infraestrutura (que é o melhor cenário, em termos de negócios), você precisa de 10 mil bancos de dados vezes 2 mil usuários. São 20.000.000 de usuários. Você não terá êxito ao tentar gerenciar logons de 20 M do SQL Server. IMO. Apenas o número absoluto deles, lidando com a transferência de servidor para servidor, observando colisões de ID e IDs incompatíveis, além de não ter certeza de como o SQL Server se comportaria com linhas de 20 M em sys.server_principals. Além disso, seu aplicativo da web provavelmente desejará conectar-se como um número único ou muito baixo de usuários. O IIS não pode agrupar conexões, a menos que suas seqüências DSN sejam idênticas. Um dos atributos de uma sequência DSN é o nome do usuário. Usuários diferentes significa que não há pool.
Você precisará rolar seu próprio esquema de credenciais de usuário. Ele deve ser capaz de descobrir a que inquilino um usuário pertence e, em seguida, seu código da web precisará selecionar o banco de dados apropriado. Esses metadados do usuário são críticos, precisam ser armazenados em algum lugar, precisam ser agrupados ou espelhados, precisam ser rápidos e precisam ser bem protegidos (do ponto de vista da segurança. IOW, criptografá-lo.). Supondo que o SQL seja uma boa idéia aqui, eu manteria esse banco de dados longe das instâncias que o servidor inquilina. Isso ajuda do ponto de vista da segurança e do ponto de vista da carga, embora eu ache que, uma vez que os usuários sejam validados e o aplicativo Web seja direcionado para o banco de dados correto em outra instância, não haverá mais consultas sobre os metadados desse usuário relacionados a esse do utilizador.
Pergunta rápida: dois usuários diferentes, pertencentes a dois inquilinos diferentes, devem ter o mesmo nome de usuário?
Outra pergunta rápida: se eu lhe disser que trabalho na FuBar, Inc., como você sabe disso? O FuBar fornecerá uma lista de usuários e você fornecerá uma lista de nomes de usuários ou eles serão auto-fornecidos?
Você precisará executar várias instâncias. Se mesmo uma fração desses usuários decidir acessar o aplicativo de uma vez, uma única instância derreterá. Não haverá threads de trabalho suficientes para executar todas essas solicitações de uma só vez. Se apenas 1.000 usuários atingirem sua instância ao mesmo tempo, provavelmente ela ficará sem threads de trabalho e a solicitação começará a se acumular e aguardar. Eu já vi isso acontecer; o sintoma mais próximo é que novas conexões não poderão efetuar logon na instância porque não há threads de trabalho disponíveis para atendê-las. Se esse comportamento for de curta duração, seu aplicativo poderá sobreviver. Caso contrário, ou seu aplicativo é exigente, os usuários receberão erros.
Mesmo que você não tenha muitos inquilinos para iniciar, comece a pensar no futuro e na automação, porque quando perceber que o servidor está atolado e houver 10 novos inquilinos para colocar online, é muito tarde e seu serviço (e seus clientes e seus futuros ex-clientes) sofrerão até que você resolva o problema.
Você precisará de uma maneira de mover bancos de dados, de servidores sobrecarregados para servidores pouco carregados (ou novos). A obtenção ou não de uma janela de tempo de inatividade dependerá do seu SLA.
Você está fornecendo um aplicativo específico, como SalesForce, ou esses bancos de dados são apenas contêineres para o que seus inquilinos desejam incluir?
Qual o tamanho dos bancos de dados? Se eles não forem muito grandes, você poderá restaurar a partir de um arquivo de backup que fornece um modelo. (Isso não é muito diferente do que o banco de dados do modelo faz, mas não vejo ninguém realmente usar o modelo desde os meus dias com o SQL 6.5.) Depois que o modelo for restaurado para o novo nome do banco de dados, você poderá em seguida, personalize o novo banco de dados conforme necessário para um inquilino específico. Você não pode fazer a personalização antes de ter o inquilino, obviamente. Se o banco de dados for grande, você poderá seguir o mesmo procedimento básico, exceto a restauração antecipada, antes que qualquer novo inquilino precise do espaço. Você pode manter alguns desses bancos de dados por perto, talvez um por instância. Se você mantiver muitos por perto, isso forçará você a comprar mais hardware e / ou armazenamento do que o necessário,
Se esse for seu próprio aplicativo, como você lida com as atualizações dos esquemas? Como você manterá as versões do banco de dados alinhadas com as versões do código, se você estiver usando um único URL que acessa seu aplicativo Web?
Como você detecta e destrói bancos de dados que não estão mais em uso? Você espera até o seu grupo de contas a receber dizer que alguém não paga a conta há três meses?
Se os inquilinos estão gerenciando permissões, isso significa que eles têm alguma compreensão do funcionamento interno do aplicativo ou que seu aplicativo tem uma estrutura de funções muito simples. Usando algo como o Blogger como exemplo, os usuários podem (ler postagens), (ler postagens e fazer comentários), (... e criar postagens), (... e editar postagens de outras pessoas), (... e podem redefinir senhas de outros usuários) ou (... e o que for). Ter uma função para cada um desses diferentes conjuntos de direitos e atribuir um usuário a uma função ou outra não deve ser muito difícil, mas você não deseja que seu aplicativo execute instruções 'GRANT'. Cuidado com as funções que têm uma hierarquia e dependem da herança, pois pode ficar confuso. Se você estiver promovendo ou rebaixando um usuário, sugiro retirá-lo de todas as funções associadas e adicioná-lo novamente à única função necessária. Oh,
Eu acho que apenas arranhei a superfície aqui, e este post já é muito longo. O que você realmente precisa é de um livro, ou pelo menos de um whitepaper de alguém que fez isso. A maioria desses caras não fala, se eles vêem isso como uma vantagem competitiva.