Je suis en train de mettre en place un système SaaS, où nous prévoyons de donner à chaque client sa propre base de données. Le système est déjà configuré pour pouvoir facilement passer à d’autres serveurs si la charge devient trop lourde; nous espérons avoir des milliers, voire des dizaines de milliers de clients.
Des questions
- Existe-t-il une limite pratique au nombre de micro-bases de données que vous pouvez / devriez avoir sur un serveur SQL?
- Peut-il affecter les performances du serveur?
- Est-il préférable d'avoir 10 000 bases de données de 100 Mo chacune ou une base de données de 1 To?
Information additionnelle
Lorsque je parle de "micro-bases de données", je ne parle pas vraiment de "micro"; Je veux juste dire que nous visons des milliers de clients, donc chaque base de données ne représente qu'un millième ou moins du stockage total des données. En réalité, chaque base de données se situerait autour de 100 Mo, en fonction de l’utilisation qu’elle en obtiendrait.
La principale raison d'utiliser 10 000 bases de données est son évolutivité. Le fait est que V1 du système ne possède qu'une base de données, et nous avons eu des moments inconfortables lorsque la base de données était à rude épreuve.
Cela mettait à rude épreuve le processeur, la mémoire, les E / S - tout ce qui précède. Même si nous avons résolu ces problèmes, ils nous ont fait comprendre qu'à un moment donné, même avec la meilleure indexation au monde, si nous réussissons aussi bien que nous l'espérons, nous ne pouvons tout simplement pas mettre toutes nos données dans le même panier. ' base de données. Donc, pour la version 2, nous partageons afin de pouvoir répartir la charge entre plusieurs serveurs de base de données.
J'ai passé l'année dernière à développer cette solution fragmentée. C'est une licence par serveur, mais de toute façon, cela est pris en charge puisque nous utilisons des machines virtuelles sur Azure. La raison pour laquelle la question se pose maintenant est qu’auparavant, nous n’offrions que nous-mêmes à de grandes institutions. Notre prochain ordre de travail est un modèle de libre service dans lequel toute personne disposant d’un navigateur peut s’inscrire et créer sa propre base de données. Leurs bases de données seront beaucoup plus petites et beaucoup plus nombreuses que les grandes institutions.
Nous avons essayé Azure SQL Database Elastic Pools . Les performances étaient très décevantes, nous sommes donc revenus aux machines virtuelles classiques.
la source
Il y a donc des avantages et des inconvénients aux deux méthodes. Sans en savoir plus sur votre application ou sur les services que vous souhaitez fournir, je ne pourrai pas vous donner de réponse définitive, mais je vais exposer certaines de mes réflexions à ce sujet.
Mon cas pour pourquoi vous devriez utiliser 1 base de données pour tous les clients.
Avantages
Entretien facile. Le fait d'avoir une seule base de données signifie que vous ne devez effectuer votre tâche de maintenance que sur plusieurs sites. Imaginez le cauchemar de gérer 1 000 bases de données différentes à sauvegarder. Que diriez-vous de mettre à jour les statistiques sur 1000 DB ou de reconstruire des index ou
DBCC CHECKDB
?Déploiement de code. Supposons que vous rencontriez un problème avec une procédure stockée dans votre code d'application ou dans vos rapports. Vous devez effectuer un changement rapide ... Vous devez maintenant déployer ce changement sur plus de 1 000 bases de données. Non, merci, je préférerais pas.
Visibilité facile. Imaginez simplement SSMS essayant d'ouvrir plus de 1000 bases de données (frisson) . Cela rendrait pratiquement le problème inutile et prendrait une quantité de temps surprenante pour simplement ouvrir et rendre SSMS. N'oubliez pas que si vous parvenez à une convention de nommage décente.
Les inconvénients
Sécurité. Il serait plus facile d'empêcher les gens de consulter les données d'autres clients si vous les aviez sous forme de bases de données distinctes. Cependant, il existe des mesures très simples à prendre pour empêcher que cela ne se produise.
Performance. On pourrait faire valoir que limiter cette base de données à un seul client signifie que SQL Server devra analyser moins de données pour obtenir les informations que vous interrogez. Cependant, avec une structure de données appropriée et une bonne indexation (et un partitionnement possible), vous pouvez probablement éliminer cela en tant que problème si tout est fait soigneusement. Je recommanderais de donner à chaque table contenant des données spécifiques au client un moyen de
CompanyID
réduire ce surcoût.En fin de compte, je pense que votre meilleur choix est d’avoir une seule base de données pour votre application et de simplement séparer les données client au sein même de la base de données. Les problèmes que cela vous causera ne seront rien en comparaison du cauchemar de la gestion de plus de 1000 bases de données.
la source
Capacité maximale spécifiée pour SQL Server indique une limite de 32 767.
Pour ce qui est de savoir si cela affectera les performances, la réponse est oui, mais la manière dont cela affectera les performances, et si elle sera substantielle, dépendra d'une multitude de facteurs.
Je choisirais une base de données à moins qu'il n'y ait une bonne raison de la scinder en 10 000 bases de données. Une sauvegarde ou 10 000 sauvegardes? Un contrôle d'intégrité, ou 10 000? Il y a peut-être une bonne raison d'utiliser 10 000 petites bases de données, mais vous n'avez pas donné suffisamment de détails pour le déterminer. La question que vous avez posée est assez large et il n’ya tout simplement pas assez d’informations pour permettre à quiconque de savoir quelle est la meilleure réponse.
la source
Ce dont vous parlez ici est une architecture multi-locataires ou multi-instances . Je ne fais que mentionner ces termes, car vous ne les utilisez pas dans votre question, mais voici ce que vous discutez, et si vous branchez simplement "l'architecture à plusieurs locataires" dans Google, vous trouverez une mine de ressources et de discussions. des livres entiers ont été écrits dessus.
Quelques bonnes ressources concernant SQL Server spécifiquement ici:
https://msdn.microsoft.com/en-us/library/ff966499.aspx
https://docs.microsoft.com/en-us/azure/sql-database/sql-database-design-patterns-multi-tenancy-saas-applications
Je serais avec d'autres réponses, en ce sens que je serais fortement en faveur du multi-locataire par défaut, à moins que vous n'ayez des raisons impérieuses de privilégier le multi-instance.
Vous n'avez pas besoin de vous séparer en milliers de bases de données clientes individuelles pour vous adapter, il existe de nombreuses autres façons de le faire, qui sont probablement préférables. Comme la mise en cluster, la réplication, le partage, le partitionnement, etc. Ne réinventez pas la roue. Il n'y a rien d'inhérent qui indique que vous devez séparer vous-même vous-même manuellement au niveau d'un client individuel. En effet, cela risque d'augmenter considérablement les coûts liés à l'ajout de chaque nouveau client.
Vous parlez de "millions" de clients, pensez à tout logiciel basé sur le cloud à grande échelle en tant que service, Gmail, peu importe, vous pensez à peine qu'ils créent une base de données entièrement nouvelle pour chaque nouvelle inscription, n'est-ce pas?
Il peut y avoir des raisons pour lesquelles vous souhaitez faciliter cela, par exemple, si vous vendez votre produit à un client qui DOIT l’avoir hébergé en interne sur sa propre infrastructure. Mais en règle générale, utilisez une architecture SAA à plusieurs locataires.
la source
L'un des inconvénients de la suggestion relative à une seule base de données concerne la restauration des données. Si vous avez une base de données par client hébergé, vous pouvez restaurer les données de chaque client indépendamment (et à un moment donné). S'ils sont tous dans une base de données, cela devient beaucoup plus difficile (et beaucoup plus sujet aux erreurs car cela devrait probablement être fait via les instructions INSERT / UPDATE / DELETE).
la source
Merci à tous ceux qui ont répondu - appréciez vraiment les points que vous m'avez permis de réfléchir. L’opinion générale que j’ai eue est qu’une seule base de données est préférable, mais j’aimerais ajouter quelques arguments contrebalancés en faveur de l’architecture fragmentée et répondre aux préoccupations exprimées par d’autres personnes.
Motivation pour le sharding
Comme mentionné dans la question (mise à jour), nous visons des ventes massives dans le monde entier, avec littéralement des millions d'utilisateurs. Avec le meilleur matériel et la meilleure indexation au monde, un seul serveur de base de données ne prendra pas la charge, nous devons donc pouvoir distribuer sur plusieurs serveurs. Et une fois que vous devez rechercher le serveur sur lequel les données de chaque client sont stockées, il n’est plus beaucoup de travail de leur donner une base de données dédiée, ce qui simplifie les choses en termes de séparation claire des données des personnes.
Réponse aux préoccupations
Je serai heureux de recevoir vos commentaires dans les commentaires si vous pensez que quelque chose me manque!
la source