SaaS et Design de Bdd : une base par client ou une base pour tous les clients ?

WRInaute discret
Bonjour à tous,

Nous développons un logiciel SaaS, que nous personnalisons pour chacun de nos clients.

Pour plus de sécurité et de facilité de gestion (personnalisations des tables, backup & restaurations notamment) nous avons décidé d'avoir une base de données par client.

Nous avions un serveur dédié chez OVH auparavant, sans aucun soucis lié à mysql (pas de plantage, alors que nous avions environ 2000 bases de données).

Depuis peu nous faisons appel à une société d'infogérance qui s'est occupée de mettre en place entre autres une réplication du serveur SQL. Depuis que nous avons migré, nous avons quotidiennement des erreurs du type "Mysql Server has gone away", ou encore "Deadlock found when trying to get lock; try restarting transaction". Ce qui est hyper gênant pour nos clients. Cette société nous assure que c'est dû au nombre de base "élevé" (nous avons fait le ménage il en reste 160), et qu'il vaudrait mieux mettre tous les clients dans une seule base, et une seule table (par type de données bien entendu).

Je suis très surpris de ce type de préconisation, car j'ai dû mal à imaginer que les grands logiciels SaaS présents sur le marché fonctionnent avec une base unique pour l'ensemble de leurs clients ?!

Quel est votre avis sur le sujet ?

En vous remerciant !

Frédéric
 
WRInaute passionné
Re: SaaS & Design de Bdd : une base par client ou une base pour tous les clients ?

Bonsoir,

les deux solutions ont des avantages comme des inconvénients, après c'est du cas par cas, je me vois mal donner un avis tranché là dessus.

Par contre une chose est sûre pour moi, c'est que ni les erreurs de "mysql server has gone away" ni les erreurs de type "deadlock" sont liées au grand nombre de BDD. J'aurais même tendance à dire que réduire le nombre de BDD peut parfois augmenter la probabilité de "deadlocks", dans le cas de requêtes avec indexes peu efficaces.

Pour ce qui est du "mysql server has gone away", je vois 2 causes fréquentes :
- Crash du serveur MySQL. Évidemment à corriger !
- Timeout de la connexion client. S'il s'agit de longs traitements, vérifiez que la valeur du "wait_timeout" correspond à vos besoins ("show variables like 'wait_timeout'").

En dehors de ces 2 cas, un problème réseau peut également le provoquer... et peut-être aussi dans le cas où on dépasse le "max packet size" de la connexion, bien que normalement ce n'est pas le même code d'erreur.
 
WRInaute discret
Re: SaaS & Design de Bdd : une base par client ou une base pour tous les clients ?

Oui pour moi un mysql server has gone away me fait plus penser à un timeout... La variables que tu m'as indiqué contient 28800, ce qui correspond à 8h. Cette valeur de timeout n'est jamais atteinte , et il est quoi qu'il en soit causé par PHP (et / ou nginx) au bout de 10 minutes.

J'ai oublié d'indiquer, le serveur tourne avec nginx, mysql et l'ensemble des tables en innoDB.

Mon infogéreur m'indiquait que le problème venait du trop grand nombre de fichiers ouverts en simultané (à cause du nombre de tables et bases). Mais ce que j'ai du mal à comprendre, c'est que comme je vous disais sur mon ancien serveur j'avais au sens propre 10* plus de bases, et je n'ai jamais modifié le nombre de fichiers simultanés qui peuvent être ouverts...
 
WRInaute passionné
Re: SaaS & Design de Bdd : une base par client ou une base pour tous les clients ?

À ce niveau le plus simple c'est de vérifier : s'il s'agit d'un crash de MySQL, c'est très clairement indiqué dans les logs de mysqld.

NginX tout comme Apache n'ont absolument aucun impact là dessus. Là c'est uniquement une histoire entre le client MySQL (ici PHP), et le serveur MySQL.
 
Discussions similaires
Haut