Vous avez vous-même un projet assez intéressant. Je n'ai jamais vu directement quelqu'un essayer d'implémenter quelque chose d'aussi gros, du moins sur SQL Server. Plus je lis votre message, plus je pose de questions ...
Dans le pire des cas, en ce qui concerne l'infrastructure (qui est en fait le meilleur des cas, en termes commerciaux), vous avez besoin de 10 000 bases de données pour 2 000 utilisateurs. Cela représente 20 000 000 d'utilisateurs. Vous n'allez pas réussir à gérer 20 millions de connexions SQL Server. OMI. Juste le nombre d'entre eux, traitant de les déplacer d'un serveur à un autre, de surveiller les collisions d'ID et les ID incompatibles, et je ne sais pas comment SQL Server se comporterait avec 20 millions de lignes dans sys.server_principals. De plus, votre application Web voudra probablement se connecter en tant qu'utilisateur unique ou très faible. IIS ne peut pas regrouper les connexions à moins que leurs chaînes DSN soient identiques. L'un des attributs d'une chaîne DSN est le nom d'utilisateur. Différents utilisateurs signifie pas de mise en commun.
Vous devrez rouler votre propre schéma d'identification d'utilisateur. Il devra être en mesure de déterminer à quel locataire appartient un utilisateur, puis votre code Web devra sélectionner la base de données appropriée. Ces métadonnées utilisateur sont essentielles, elles devront être stockées quelque part, elles devront être regroupées ou mises en miroir, elles devront être rapides et elles devront être bien protégées (du point de vue de la sécurité. IOW, crypter.). En supposant que SQL est même une bonne idée ici, je garderais cette base de données à l'écart des instances des serveurs. Cela aide d'un point de vue de la sécurité et d'un point de vue de la charge, bien que je suppose qu'une fois qu'un utilisateur est validé et que l'application Web est dirigée vers la base de données correcte sur une autre instance, il n'y aura plus d'interrogation de ces métadonnées utilisateur liées à cela utilisateur.
Question rapide: deux utilisateurs différents, appartenant à deux locataires différents, devraient-ils avoir le même nom d'utilisateur?
Une autre question rapide: si je vous dis que je travaille pour FuBar, Inc., comment savez-vous cela? Est-ce que FuBar va vous donner une liste d'utilisateurs et vous leur rendrez une liste de noms d'utilisateurs, ou vont-ils s'auto-approvisionner?
Vous allez devoir passer à plusieurs instances. Si même une fraction de ces utilisateurs décident de lancer l'application en même temps, une seule instance fondra. Il n'aura pas suffisamment de threads de travail pour exécuter toutes ces demandes à la fois. Si seulement 1000 utilisateurs atteignent votre instance en même temps, il n'y aura probablement plus de threads de travail et la demande commencera à s'empiler et à attendre. J'ai vu cela arriver; le symptôme immédiat est que les nouvelles connexions ne pourront pas se connecter à l'instance car il n'y a pas de threads de travail disponibles pour les entretenir. S'il s'agit d'un comportement de très courte durée, votre application peut survivre. Sinon, ou si votre application est difficile, les utilisateurs obtiendront des erreurs.
Même si vous n'avez pas beaucoup de locataires à démarrer, vous devriez commencer à penser à l'avenir et à l'automatisation car lorsque vous voyez que votre serveur est enlisé et qu'il y a 10 nouveaux locataires à mettre en ligne, il est beaucoup trop tard et votre service (et vos clients et vos futurs ex-clients) souffriront jusqu'à ce que vous écriviez votre moyen de sortir du problème.
Vous allez avoir besoin d'un moyen de déplacer les bases de données, des serveurs surchargés aux serveurs légèrement chargés (ou nouveaux). Que vous puissiez ou non obtenir une fenêtre d'indisponibilité dépendra de votre SLA.
Fournissez-vous une application spécifique, comme SalesForce, ou ces bases de données sont-elles simplement des conteneurs pour tout ce que vos locataires veulent y mettre?
Quelle est la taille des bases de données? S'ils ne sont pas très gros, vous pouvez simplement restaurer à partir d'un fichier de sauvegarde qui fournit un modèle. (Ce n'est pas très différent de ce que fait la base de données de modèles, mais je n'ai vu personne vraiment utiliser le modèle dans le bon sens depuis mes jours avec SQL 6.5.) Une fois que le modèle a été restauré avec le nouveau nom de la base de données, vous pouvez puis personnalisez la nouvelle base de données selon les besoins d'un locataire particulier. Vous ne pouvez pas faire la personnalisation avant d'avoir le locataire, évidemment. Si la base de données est volumineuse, vous pouvez suivre la même procédure de base, sauf que vous effectuez la restauration à l'avance, avant qu'un nouveau locataire ait besoin de l'espace. Vous pouvez conserver quelques-unes de ces bases de données, peut-être une par instance. Si vous en gardez trop, cela vous obligera peut-être à acheter plus de matériel et / ou de stockage que vous n'en avez besoin,
S'il s'agit de votre propre application, comment allez-vous gérer les mises à jour des schémas? Comment allez-vous conserver les versions de la base de données directement avec les versions du code, si vous utilisez une seule URL qui accède à votre application Web?
Comment détecter et détruire les bases de données qui ne sont plus utilisées? Attendez-vous que votre groupe A / R dise que quelqu'un n'a pas payé sa facture depuis trois mois?
Si les locataires gèrent des autorisations, cela implique qu'ils ont une certaine compréhension du fonctionnement interne de l'application ou que votre application a une structure de rôle très simple. En utilisant un exemple comme Blogger, les utilisateurs peuvent (lire les articles), (lire les articles et faire des commentaires), (... et créer des articles), (... et modifier les articles des autres), (... et peuvent réinitialiser mots de passe des autres utilisateurs), ou (... et autre). Avoir un rôle pour chacun de ces différents ensembles de droits et affecter un utilisateur à un rôle ou à un autre ne devrait pas être trop difficile, mais vous ne voulez pas que votre application exécute des instructions 'GRANT'. Méfiez-vous des rôles qui ont une hiérarchie et dépendent de l'héritage, cela peut être déroutant. Si vous faites la promotion ou la rétrogradation d'un utilisateur, je dirais de le retirer de tous les rôles associés, puis de le rajouter au seul rôle dont il a besoin. Oh,
Je pense que je n'ai fait qu'effleurer la surface ici, et ce post est déjà trop long. Ce dont vous avez vraiment besoin, c'est d'un livre, ou du moins d'un livre blanc de quelqu'un qui l'a fait. La plupart de ces gars ne parleront pas s'ils considèrent cela comme un avantage concurrentiel.