11 votes

Planification de la base de données - Schémas multiples vs bases de données multiples vs grande base de données unique vs partitions

Nous concevons des sites web pour des sociétés immobilières. Les sites web sont utilisés uniquement pour afficher les informations et tous les sites web partagent un modèle commun. Nous avons environ 150 sites web pour différents clients. Des fournisseurs de données tiers nous fournissent toutes les mises à jour de chaque annonce sur le site Web toutes les heures. Les mises à jour pour chaque client se font à des heures différentes. En moyenne, nous avons 1000 inscriptions par site web. Et à chaque mise à jour horaire, 80 % des données sont modifiées ou mises à jour.

Actuellement, nous disposons d'une seule base de données dans Sql server 2008, pour tous les clients (conçue initialement pour gérer 10 à 20 sites web). Les tables de la base de données sont partagées par tous. Le problème est que chaque fois qu'une mise à jour a lieu, cela ralentit également les sites web des autres clients, qui ne sont pas du tout liés à la mise à jour. De même, la suppression des données d'un client ralentit tous les sites.

J'envisage de remodeler la base de données en créant un schéma distinct pour chaque client, mais je ne suis pas sûr que ce soit la meilleure façon de traiter notre problème. Le fait d'avoir une base de données séparée crée de nombreux problèmes de maintenance (sauvegardes, mise en miroir, etc.). Quelqu'un peut-il me suggérer une meilleure façon de gérer ce problème ? Je ne suis pas sûr de l'impact sur les performances si je crée un schéma séparé pour chaque client et si j'isole leurs tables des autres. Ou existe-t-il une meilleure solution ?

12voto

neokio Points 101

Personnellement, je préférerais des bases de données multiples, car cela vous permet de voir quelles bases de données utilisent le plus d'IO et de RAM, avec une variété de DMV - et cela vous permet de migrer facilement les bases de données les plus importantes vers d'autres endroits au fil du temps. De plus, il y a une séparation de sécurité, ce qui est toujours rassurant pour les clients.

Brent Ozar a abordé cette question dans un récent billet de blog - il vaut vraiment la peine de le lire car il est très bon : http://www.brentozar.com/archive/2011/06/how-design-multiclient-databases/

6voto

Rob Watkins Points 191

Je recommanderais probablement d'opter pour une base de données par client, mais si vous voulez vous en tenir à une seule base de données, il semble que les schémas conviendront à vos besoins.

Toutefois, en plus d'un schéma par client, je vous recommande de créer un groupe de fichiers par client, puis de placer tous les objets de la base de données pour chaque client dans ce groupe de fichiers. Cela présente plusieurs avantages :

  1. Meilleure disponibilité de la base de données. Si un fichier de données appartenant à un client est corrompu, il est toujours possible de mettre en ligne le reste de la base de données. Le fichier de données corrompu peut alors être restauré à partir d'une sauvegarde, même si d'autres transactions sont en cours.
  2. (Potentiellement) de meilleures performances. Au fur et à mesure que le système grandit, vous pouvez placer des groupes de fichiers sur différents périphériques de stockage et répartir vos E/S (bien sûr, vous pouvez faire quelque chose de similaire avec un groupe de fichiers et plusieurs fichiers, mais cela vous permettra de répartir les E/S par client).
  3. Facilité des sauvegardes. Les sauvegardes de la base de données peuvent se faire au niveau du groupe de fichiers, ce qui vous donne plus de flexibilité quant au moment de sauvegarder les tables de chaque client.
  4. Meilleure granularité de la restauration. Comme au point 1, lorsque vous restaurez la base de données à partir de zéro, une fois que le groupe de fichiers principal est en ligne, vous pouvez commencer à restaurer les groupes de fichiers individuellement, en commençant par votre client le plus important. Comme les restaurations ultérieures n'auront aucun impact sur les groupes de fichiers déjà restaurés, vous pouvez mettre votre base de données en ligne pièce par pièce plutôt qu'en une seule fois. C'est ce qu'on appelle une restauration en ligne au coup par coup et il s'agit d'une fonctionnalité réservée à l'édition entreprise (bien qu'il soit possible de faire quelque chose de similaire dans l'édition standard, mais cela nécessite que la base de données soit hors ligne).

Je crois que le nombre maximum de groupes de fichiers que vous pouvez avoir est d'environ 32 000, donc cette stratégie devrait durer jusqu'à ce que vous ayez vraiment besoin de penser à la séparation en différentes bases de données.

Pour plus d'informations, je recommande l'article de livres en ligne ' Architecture des fichiers et des groupes de fichiers et le livre blanc de SQLCAT sur la disponibilité partielle des bases de données : http://sqlcat.com/sqlcat/b/whitepapers/archive/2007/11/21/partial-database-availability.aspx

3voto

stevenrcfox Points 131

Si tous les clients partagent la même base de données et que tous les sites web utilisent le même modèle, il s'agit plutôt d'un système de gestion de contenu multi-locataires.

Je ne pense pas que le problème vienne des mises à jour d'un client qui affectent toutes les autres, mais plutôt d'un niveau inférieur de lenteur des mises à jour et des requêtes en général. En supposant que le matériel et la charge ne changent pas, 150 bases de données devraient fonctionner de la même manière que la solution à base de données unique (peut-être plus lentement dans certaines circonstances).

Je suppose que votre table principale est la table "listings" qui contient environ 150*1000 lignes vivantes (vraisemblablement + enregistrements historiques).

Il ne s'agit pas d'une quantité massive de données, loin s'en faut, et une machine raisonnablement équipée ne devrait pas rencontrer de problème.

Je m'assurerais que les enregistrements historiques sont déplacés vers leurs propres tables. Dans la requête de lecture, j'ajouterais "read uncommitted snapshot" (lecture d'instantanés non validés)

En ce qui concerne les mises à jour, il existe quelques solutions possibles pour résoudre ce problème 1. Utiliser une fusion plutôt que plusieurs déclarations de mise à jour 2. Utiliser un curseur pour éviter l'escamotage du verrou 3. Ajouter de nouveaux enregistrements pour les listes mises à jour, et simplement mettre à jour un indicateur de bit "est à jour" sur les anciens enregistrements.

Étant donné que cela s'est passé il y a deux ans, quelle a été la solution finale ?

1voto

Jason Cumberland Points 1559

Il semble que vous soyez plus préoccupé par le fait de tout conserver dans une seule base de données, quel qu'en soit le coût (bien que vous en ayez parlé), puisque le principal argument de Peter en faveur de la séparation en bases de données distinctes était lié aux performances et à la possibilité d'évoluer à long terme. Si c'est le cas, vous devriez soit diviser les tables en différents schémas pour les clients, soit passer à une licence Enterprise Edition pour pouvoir utiliser le partitionnement des tables et partitionner les tables partagées en fonction du nombre de clients.

1voto

DjangoUnchained Points 96

Je me suis posé la même question lorsque j'ai envisagé de restructurer mon infrastructure de base de données. Cet article m'a beaucoup aidé.

[ [https://msdn.microsoft.com/en-us/library/aa479086.aspx\]\[1\]](https://msdn.microsoft.com/en-us/library/aa479086.aspx][1])

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X