Y a-t-il une limite au nombre de bases de données que vous pouvez mettre sur un serveur SQL?

43

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.

Shaul dit que je soutiens Monica
la source

Réponses:

80

J'ai travaillé sur des serveurs SQL avec 8 à 10 000 bases de données sur une seule instance. Ce n'est pas joli

Le redémarrage du serveur peut prendre une heure ou plus. Pensez au processus de récupération de 10 000 bases de données.

Vous ne pouvez pas utiliser SQL Server Management Studio pour localiser de manière fiable une base de données dans l'explorateur d'objets.

Les sauvegardes sont un cauchemar, car pour que les sauvegardes valent la peine, vous devez disposer d'une solution de récupération après sinistre en place. J'espère que votre équipe est capable de tout scripter .

Vous commencez à faire des choses comme nommer des bases de données avec des nombres, comme M01022, et T9945. Essayer de s’assurer que vous travaillez dans la bonne base de données, par exemple M001022au lieu de M01022, peut être exaspérant.

Allouer de la mémoire pour autant de bases de données peut être insupportable; SQL Server finit par faire beaucoup d'E / S, ce qui peut être un réel frein aux performances. Prenons un système qui enregistre les détails de l'utilisation du carbone dans 4 tableaux pour 10 000 entreprises. Si vous faites cela dans une base de données, vous n’avez besoin que de 4 tables; si vous faites cela dans 10 000 bases de données, vous avez tout à coup besoin de 40 000 tables en mémoire. La surcharge de ce nombre de tables en mémoire est considérable. Toute requête que vous concevez et qui sera exécutée sur ces tables nécessitera au moins 10 000 plans dans le cache de plans s'il y a 10 000 bases de données utilisées.

La liste ci-dessus ne représente qu'un échantillon des problèmes à planifier pour une telle opération.

Vous rencontrerez probablement des problèmes tels que le démarrage très lent du service SQL Server, ce qui peut provoquer des erreurs du contrôleur de service. Vous pouvez augmenter le temps de démarrage du service vous-même, créez l'entrée de registre suivante:

Sous-clé: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control
Nom: ServicesPipeTimeout
Type: REG_DWORD
Données: le nombre de millisecondes avant l'expiration du délai d'attente au démarrage du service

Par exemple, pour attendre 600 secondes (10 minutes) avant l'expiration du service, tapez 600000.


Depuis que j'ai écrit ma réponse, j'ai compris que la question portait sur Azure. Faire cela sur une base de données SQL n’est peut-être pas si problématique; c'est peut-être plus problématique. Personnellement, je concevrais probablement un système utilisant une base de données unique, peut-être partagée verticalement sur plusieurs serveurs, mais certainement pas avec une base de données par client.

Max Vernon
la source
3
Bon produit. L'affiche pourrait envisager une méthode d'utilisation de plusieurs bases de données, mais plusieurs clients par base de données afin qu'ils puissent limiter le nombre de bases de données, tout en pouvant évoluer vers plusieurs serveurs.
Tony Hinkle
5
Je gère actuellement une instance avec un nombre de bases de données parmi les 4 chiffres les plus élevés et je peux faire écho à peu près tout cela. Un autre problème qui se pose lors de l'utilisation de cette échelle est l'incapacité de mettre en cache les plans d'exécution pendant une longue période. Il en résulte de nombreux plans de requête de recompilation de gravure de processeur.
alroc
19

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 CompanyIDré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.

Zane
la source
17

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.

Tony Hinkle
la source
7

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.

Ivan McA
la source
7

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).

Darshan
la source
+1 - C'est l'un des très rares avantages hautement souhaitables d'une base de données par locataire.
Max Vernon
6

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

  • Le redémarrage du serveur prend beaucoup de temps: OK, mais en fonctionnement normal, nous n’avons pas l’intention de redémarrer les serveurs. Le système doit en fin de compte être en ligne 24h / 24 et 7j / 7. Par conséquent, si nous avons des temps morts, il devra être programmé de toute façon.
  • Sauvegardes / reprise après sinistre: Nous utilisons CloudBerry, qui automatise tout. Pas de problème.
  • Nommer des bases de données / les localiser dans SSMS: la convention de nommage est simple, il suffit de se baser sur le nom du client. Ajoutez des chiffres de série si les noms sont partagés.
  • Maintenance: Si chaque base de données est aussi petite que j'envisage, il ne devrait pas être nécessaire de reconstruire les index manuellement.
  • Déploiement de code: Nous utilisons Entity Framework, ainsi chaque modification de schéma sera automatiquement appliquée à chaque base de données avec les nouvelles versions. Il est vrai, cependant, que si nous découvrons un problème de performances en production qui peut être résolu avec un simple ajustement d’index, il n’est pas si facile de le résoudre. D'autre part, chaque base de données étant si petite, il est peu probable que des problèmes de performances spectaculaires se produiront sur les fragments de production. Et la base de données commune reste une base de données unique, à laquelle ces préoccupations ne s'appliquent pas.

Je serai heureux de recevoir vos commentaires dans les commentaires si vous pensez que quelque chose me manque!

Shaul dit que je soutiens Monica
la source
3
Si vous recherchez une disponibilité 24 heures sur 24 et 7 jours sur 7, vous devez alors envisager de regrouper vos bases de données. L'application de correctifs entraîne au moins un certain temps d'indisponibilité. Vous ne savez pas comment cela s’applique à des solutions basées sur le cloud comme Azure, j’espère que sa solution sera prise en charge pour vous.
Jay Zelos
Je crois qu'en utilisant la technologie de base de données d'aujourd'hui, presque toutes les raisons de «partage» ne sont plus valables. Je pense que vous le regretterez ou ne réaliserez peut-être même pas à quel point vous êtes mal comparé et ne le regretterez donc pas par ignorance. Je suis d'accord avec la réponse de Max et je ne pourrais pas l'expliquer mieux.
Joe