Question Cluster

WRInaute occasionnel
Bonjour,

je développe actuellement sur une machine local un projet Web nécessitant beaucoup de ressources et une utilisation précise de la fonction getmicrotime() de php.
J'ai de suite pensé à l'offre Cluster que OVH propose et qui résoudrait les problèmes de ressources. Mais quelques points restent en suspend quant à ce choix.

En effet, j'ai testé mon application (validée en local) sur un compte de type 60gp pour voir son fonctionnement sur un cluster. Là un problème survient, l'application ne fonctionne pas car il s'avère que le nombre de millisecondes retourné par la fonction getMicroTime dépend de l'heure du serveur sur lequel le script est executé, et je pense que les serveurs du cluster 60gp ne sont pas synchronisés. Il s'agit là d'une supposition, mais c'est la seule raison qui expliquerait les problèmes.

Ne m'y connaissant pas énormément en architecture serveur de ce type,
Seriez-vous en mesure de confirmer mes dires (ou de les démentir :D ) ?

Je crains que ce problème posé sur 60gp, soit aussi présent sur une Offre Cluster, or, c'est le pilier de mon projet.

Pouvez-vous me conseiller quand à la stratégie matérielle à adapter pour que la fonction getmicrotime soit spécifique au cluster (heure synchronisé de tous les serveurs) et non pas a chaque serveur.

Merci d'avance pour votre réponse.
 
Nouveau WRInaute
Si le problème vient du fait que ton horloge et la leur ne sont pas synchro, tu n'as qu'à synchroniser la tienne sur la leur. Il y a certainement moyen !

:wink:
 
WRInaute occasionnel
En fait non, c'est pas ça le probleme :D

Disons qu'en local, l'application ne tourne que sur une unique machine donc y'a pas de probleme, puisque getmicrotime est unique. En passant l'application totalement sur leur cluster (pas de liaison ac le local) getmicrotime dépend de l'heure du serveur sur lequel le script est éxécuté dans le cluster. Enfin je pense que ça vient de là ?

Est ce que j'arrive à me faire comprendre ? :roll:
 
Nouveau WRInaute
Oui, c'est ce que j'avais cru comprendre. Et c'est fort possible que ta fonction récupère "l'heure de leur serveur" (pas mal celle-là :D ). Mais comme je n'ai pas plus d'infos sur l'utilisation de cette commande (à quoi elle sert dans ton projet), je peux pas t'en dire plus.

Et j'ai du mal à comprendre ce qu'une désynchro pourrait provoquer comme problème : si ton temps de référence T0 et ton temps actuel Tx sont pris sur la même horloge, ton intervalle est toujours le même.
Sauf si tu fais quelque chose qui doit être synchronisé avec l'horloge d'une zone (France, ou autre), auquel cas tu peux peut-être resynchroniser avec ton code (vérifie la différence, et ajoute ou retranche la).

Je sais pas si je suis très clair, ni c'est très utile ...

:wink:
 
WRInaute occasionnel
Pour commencer, Merci pour ta réponse si rapide :wink:

On commence à se comprendre lol

Comme tu as di

si ton temps de référence T0 et ton temps actuel Tx sont pris sur la même horloge, ton intervalle est toujours le même.

ce cas est vrai en local puisque c'est toujours l'horloge de la même machine qui est sollicité.

En revanche, dans un cluster, le script est éxécuté par des serveurs différents, donc qui ont probablement des horloges différentes (et c'est là ou est ma question).

J'ai fait un dialogue en direct en flash php mysql, chaque message à un temps en milliseconde (fonction getmicrotime() ) comme attribut, qui servt à l'ordre et à la récupération des messages. Par exemple toutes les 10 secondes on récupère les messages qui ont été postés dans l'intervalle de temps entre le temps x et le temps x-10. Partant de là si on a des horloges désynchronisées, des messages se perdent en route, on ne les vois pas tous etc...

Je sens que ça vient... lol

:D

merci
 
WRInaute occasionnel
J'ai reçu une réponse du service commercial d'OVH

Bonjour,

C'est effectivement possible sur un cluster privé.
La diférence avec un offre mutualisée est que vous avez un accès total à tous les serveurs dédiés de votre cluster. Il vous est donc possible de contrôler que l'heure est bien synchronisée sur toutes les machines et même de mettre en place une synchronisation sur une horloge atomique toutes les heures.

donc en gros les serveurs des cluster 60gp ne sont pas synchro :)
 
WRInaute occasionnel
oliv63 a dit:
donc en gros les serveurs des cluster 60gp ne sont pas synchro :)

Je ne comprensd pas :( . Un cluster se fait avec des serveurs dédiés... Faire du clustering avec du mutualisé... C'est plutot hors nome dirons-nous ;).


Si tu as des problèmes de synchronisation entre tes différents serveurs dédiés. Tu fait des Cron toutes les heures pour recaler tous tes serveurs à l'heure atomique par exemple.

Mais bon jouer au Ms prêt, c'est un peu bizarre comme méthode de programmation surtout sur un environnement cluster "low-cost" et surtout sur un environement Web. Sache que le ping moyen en adsl est de 40 Ms ;) et 120Ms en 56k... Sans compter la latence sur le réseau interne de l'hébergeur qui est faible mais qui pourra jouer aussi...
 
WRInaute occasionnel
Autre piste, utilise now() de mysql plutôt que l'heure de la machine faisant tourner Apache. Parfois c'est mieux.
Bien entendu, si c'est une machine différente qui fait tourner mysql.
A défaut, il te faudrait créer ta fonction artificielle de synchronisation : tu identifies le serveur le plus ancien (temps T), et pour chaque serveur du cluster tu définis la valeur de la désynchro (T+k), ce qui te permet de recalculer une heure correcte pour tes messages, quelque soit le serveur l'ayant traité.
 
WRInaute occasionnel
Faire du clustering avec du mutualisé...

et pourtant si, c'est bien ce que fais OVH par exemple, selon ton ip et la charge tu es redirigé sur tel ou tel serveur du cluster...

Toutes la gestion du temps est locale, je m'explique :

Un mr X poste un message sur le serveur, ce message sera enregistré dans la bdd avec pour attribut le nombre de millisecondes écoulés depuis le 01/01/1970 et ce en appelant la fonction getmicrotime du serveur. On apelle cet instant "t".

Un mr Y consulte toutes les 10 secondes les messages grace à un script php sur le serveur. Ce script lance getmicrotime, la valeur récupérée est y, et récupère tout les messages dont l'attribut time (dont j'ai parlé précedemment) est compris entre l'instant y-10000 (10 secondes) et y.

Ceci me permet de ne perdre aucun message avec un chat PHP MYSQL Flash et fonctionne vraiment bien sur un serveur unique (puisqu'il est toujours synchro ac lui même :wink: ).

Avec plusieurs serveurs, ben il faut qu'ils soient synchro entre eux.

Mais est ce que synchroniser chaque serveur du cluster toutes les dix minutes sur une horloge atomique par exemple (voir la synchronisation ntp), ne vas pas provoquer des pertes de messages de temps en temps telle est la question...

A ton avis ? :roll:

Merci pr ta réponse Morph
 
WRInaute occasionnel
Merci pour ta réponse Digit

MySQL sera exécuté sur tous les serveurs du cluster car le goulot d'étranglement de l'application est SQL, car beaucoup de requête à traiter, c'est pourquoi MySQL ne sera pas sur une seule machine -> on en revient au même problème avec now :( .

N'étant pas un expert je vais m'orienter vers NTP. Apparement le défaut de celui-ci et de changer violemment l'heure du serveur si la commande n'est pas faite souvent. Mais peut être qu'avec un resynchro toutes les cinq minutes pour chaque serveur permet de ne pas avoir de décalage, je ne sais pas, je suis un peu perdu :oops:
 
Nouveau WRInaute
On se comprend :D

oliv63 a dit:
ement le défaut de celui-ci et de changer violemment l'heure du serveur si la commande n'est pas faite souvent. Mais peut être qu'avec un resynchro toutes les cinq minutes pour chaque serveur permet de ne pas avoir de décalage, je ne sais pas, je suis un peu perdu

Même si les horloges internes de nos machines ont un cadencement quasiment identique, tu riques quand même d'avoir des pertes en allant titiller les millèmes de secondes. La solution peut-être : resynchroniser à chaque requête, mais ça ne va peut-être pas plaire ) la machine qui doit gérer des synchronisations aussi fréquentes.

:wink:
 
WRInaute occasionnel
je vais faire des test sur ma bécane linux, voir combien une machine perd en 5, 10, 20 minutes...

sinon il existe clocktime qui est apparement étonnement précis pour ce genre d'application, puis en mem temps si y'a un message perdu tout les 10000 c'est pas trés grave, ce n'est qu'un chat public...
 
Haut