[SPIP Zone] Mutualisation et charge MySQL

Bonjour,

je vais mettre en place un site mutualisé qui devra pouvoir en accueillir 300 à terme.

La question que je pose à ceux qui ont des connaissances sur les serveurs MySQL :
- soit j'utilise la même base pour les 300 sites (soit 300 x 40 = 1200 tables dans la même base)
- soit je crée une base par site.
Dans le premier cas, est-ce que le fait d'avoir 1200 tables dans la même base risque de ralentir les requètes sur les tables MySQL ?
Ou est-ce que cela est aussi rapide pour les 2 solutions ?

Merci pour les éclairages de ceux qui ont déjà testé.

Cordialement,

2008/1/30 Olivier Gautier <olivier.gautier@ac-rouen.fr>:

Bonjour,

je vais mettre en place un site mutualisé qui devra pouvoir en
accueillir 300 à terme.

La question que je pose à ceux qui ont des connaissances sur les
serveurs MySQL :
- soit j'utilise la même base pour les 300 sites (soit 300 x 40 = 1200
tables dans la même base)
- soit je crée une base par site.
Dans le premier cas, est-ce que le fait d'avoir 1200 tables dans la même
base risque de ralentir les requètes sur les tables MySQL ?
Ou est-ce que cela est aussi rapide pour les 2 solutions ?

Merci pour les éclairages de ceux qui ont déjà testé.

pas de réponse toute faite ... je suppose que l'une et l'autre des solutions
a des avantages et inconvénient .

en tout cas à ce moment où j'ecris, http://grml.eu contient 2584
tables dans une
base et se porte bien (mais le trafic est quasi nul)

Salut !

Le 30/01/08, Olivier Gautier<olivier.gautier@ac-rouen.fr> a écrit :

La question que je pose à ceux qui ont des connaissances sur les
serveurs MySQL :
- soit j'utilise la même base pour les 300 sites (soit 300 x 40 = 1200
tables dans la même base)
- soit je crée une base par site.

Pour les perfs je ne sais pas

Une base par site me semble plus simple à gérer... Par exemple, cela
permettra éventuellement d'isoler les bases grosses consommatrices (ça
arrive !) sur un autre serveur si besoin... avec les tables ça va être
galère...

@+

--
MARNE Bertrand

Olivier Gautier wrote:

- soit j'utilise la même base pour les 300 sites (soit 300 x 40 = 1200 tables dans la même base)
- soit je crée une base par site.

comme il n'y aura pas mutualisation des *données* (pas de tables transversales), autant créer des bases séparées.

en terme de sécurité, si une base tombe, ce ne sera jamais que pour un site.

pour la maintenance (nettoyage, sauvegarde...), ton serveur travaillera en parallèle avec, pourquoi pas, des configurations différentes en fonction des utilisations : base trés souvent modifiée -> optimize régulier, dump quotidien..., base peu souvent modifiée -> intervalle de maintenance plus long.

à terme tu pourra aussi répartir les bases sur des serveurs différents.

Le 30/01/08, Olivier Gautier <olivier.gautier@ac-rouen.fr> a écrit :

Bonjour,

je vais mettre en place un site mutualisé qui devra pouvoir en
accueillir 300 à terme.

La question que je pose à ceux qui ont des connaissances sur les
serveurs MySQL :

  • soit j’utilise la même base pour les 300 sites (soit 300 x 40 = 1200
    tables dans la même base)
  • soit je crée une base par site.

actuellement on gère une 30 de spip plus ou moins gros (mais sans la mutualisation on n’est pas en svn , bientôt Ben , bientot , enfin j’espère , :wink: ) sur des tables distinctes ça me semble plus souple à gérer.
si tu as des scripts de maintenance il n’y a que le nom de la base qui va changer et pas un paramètre de préfixe à chaque table
en cas de pépin tu pourras couper ta base , l’isoler …
pour faire un dump tu n’a pas à lister les tables …
et puis ça me semble plus propre pour isoler les donner (les grants sont plus simples, les ficheirs de bases sont distincts)
pour de l’industrialisation je pense qu’il n’a pas photos

Pour les perfs je ne sais pas, je n’ai pas testé des gros sites sur une même base.

a+


Arnaud

Bonjour,

merci à tous pour vos réponses.

Je pense que le choix est assez clair : 1 base par site pour faciliter la maintenance.

Cordialement,
Olivier Gautier.

Arnaud Ventre a écrit :

Le 30/01/08, *Olivier Gautier* <olivier.gautier@ac-rouen.fr <mailto:olivier.gautier@ac-rouen.fr>> a écrit :

    Bonjour,

    je vais mettre en place un site mutualisé qui devra pouvoir en
    accueillir 300 à terme.

    La question que je pose à ceux qui ont des connaissances sur les
    serveurs MySQL :
    - soit j'utilise la même base pour les 300 sites (soit 300 x 40 = 1200
    tables dans la même base)
    - soit je crée une base par site.

actuellement on gère une 30 de spip plus ou moins gros (mais sans la mutualisation on n'est pas en svn , bientôt Ben , bientot , enfin j'espère , :wink: ) sur des tables distinctes ça me semble plus souple à gérer.
si tu as des scripts de maintenance il n'y a que le nom de la base qui va changer et pas un paramètre de préfixe à chaque table
en cas de pépin tu pourras couper ta base , l'isoler ...
pour faire un dump tu n'a pas à lister les tables ...
et puis ça me semble plus propre pour isoler les donner (les grants sont plus simples, les ficheirs de bases sont distincts)
pour de l'industrialisation je pense qu'il n'a pas photos

Pour les perfs je ne sais pas, je n'ai pas testé des gros sites sur une même base.

a+
--
Arnaud

Le 31 janv. 08 à 06:53, Olivier Gautier a écrit :

Bonjour,

merci à tous pour vos réponses.

Je pense que le choix est assez clair : 1 base par site pour faciliter la maintenance.

et par sécurité, c'est préférable, non ?

si je connais le préfix des tables d'un site voisin, j'accède aux données ?

<BOUCLE(TOTO_ARTICLES)...> ou mieux <BOUCLE(TOTO_MESSAGES)...> pour les messages privés, ça marcherait ?

--
James

James wrote:

si je connais le préfix des tables d'un site voisin, j'accède aux données ?

<BOUCLE(TOTO_ARTICLES)...> ou mieux <BOUCLE(TOTO_MESSAGES)...> pour les messages privés, ça marcherait ?

hmmm... pas sûr :
normalement ça fait un select sur base.préfixe_toto_messages
avec par défaut préfixe = spip

Bonjour,

Outre les aspects de facilité de maintenance et de performance privilégiant l'utilisation de x bases, l'aspect sécurité m'amène à penser que l'utilisation d'une seule base ne se justifie UNIQUEMENT lorsque les différents sites mutualisés appartiennent au même et unique propriétaire.

Sinon c'est la cata : un accès à phpMyAdmin ou quelques lignes de php dans un squelette permet de faire n'importe quoi sur les tables des différents sites.

A+
Philippe

denisb a écrit :

James wrote:
  

si je connais le préfix des tables d'un site voisin, j'accède aux données ?

<BOUCLE(TOTO_ARTICLES)...> ou mieux <BOUCLE(TOTO_MESSAGES)...> pour les messages privés, ça marcherait ?
    
hmmm... pas sûr :
normalement ça fait un select sur base.préfixe_toto_messages
avec par défaut préfixe = spip

_______________________________________________
spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

Philippe Drouot wrote:

Sinon c'est la cata : un accès à phpMyAdmin ou quelques lignes de php dans un squelette permet de faire n'importe quoi sur les tables des différents sites.

oui.
mais dans ce cas là (une seule base, plusieurs préfixes) tu attribues des droits spécifiques à tes utilisateurs en fonction des préfixes de table : GRANT SELECT ON site1_spip_auteurs TO admin_site1@...

Le 31/01/08, denisb <denisb@laposte.net> a écrit :

Philippe Drouot wrote:

Sinon c’est la cata : un accès à phpMyAdmin ou quelques lignes de php
dans un squelette permet de faire n’importe quoi sur les tables des
différents sites.

oui.
mais dans ce cas là (une seule base, plusieurs préfixes) tu attribues
des droits spécifiques à tes utilisateurs en fonction des préfixes de
table : GRANT SELECT ON site1_spip_auteurs TO admin_site1@…

Ce qui est fastidieux c’est que tu dois granter table par table et ça peux poser des problèmes quand tu as un plugin qui dois créer une nouvelle table par exemple , alors que si tu grantes la base en global tu n’a pas besoin de le gérer au fil de l’eau.

A+


Arnaud

Arnaud Ventre wrote:

Ce qui est fastidieux c'est que tu dois granter table par table

c'est rien de le dire...

James wrote:

si je connais le préfix des tables d'un site voisin, j'accède aux données ?

<BOUCLE(TOTO_ARTICLES)...> ou mieux <BOUCLE(TOTO_MESSAGES)...> pour les messages privés, ça marcherait ?

suite à une remarque de James, je corrige la réponse
que j'ai donnée à 08:50

je viens de tester.
dans ma base je crée une copie de spip_messages que je nomme toto_messages ;

la boucle
   <BOUCLE_estula(MESSAGES) {tout>
   #ID_MESSAGE - #TITRE<br>
   </BOUCLE_estula>
-> me renvoie sur ma 404.html
normal : la table n'est *pas* déclarée.

les boucles
   <BOUCLE_estula(TOTO_MESSAGES) {tout>
   #ID_MESSAGE - #TITRE<br>
   </BOUCLE_estula>
ou
   <BOUCLE_estula(SPIP_MESSAGES) {tout>
   #ID_MESSAGE - #TITRE<br>
   </BOUCLE_estula>
-> me renvoient les données.
normal : les tables sont *explicitement* appelées par les boucles.

je crée maintenant une copie de spip_auteurs que je nomme toto_auteurs ;
la boucle
   <BOUCLE_estula(AUTEURS) {tout>
   #ID_AUTEUR - #NOM<br>
   </BOUCLE_estula>
-> me renvoie les données de spip_auteurs.
normal : la table *est* déclarée *et* son préfixe est bien $table_prefix

la boucle
   <BOUCLE_estula(TOTO_AUTEURS) {tout>
   #ID_AUTEUR - #NOM<br>
   </BOUCLE_estula>
-> me renvoie les données de toto_auteurs.
normal : la table est *explicitement* appelée par la boucle.

donc :
sans limitation propre à mysql (droits grant), les tables de différents
sites appartenant à une *même* base sont consultables depuis l'un
quelconque de ces sites.