Bonjour,
Depuis quelques temps j'avais des doutes, mais maintenant j'en suis certain, j'ai un problème *spécial* mais je n'arrive pas à en trouver l'origine. Je commence par ce forum car mon premier suspect est mon architecture virtualisée .
Le phénomène:
1. Soit un tâche cron exécutée 2 fois par jour sur un serveur DEBIAN sur une VM. A chaque exécution elle enregistre la tâche exécutée en base de données MySQL (sur un autre serveur), sur un serveur DEBIAN sur une VM.
2. Le cron avant de se lancer vérifie en BDD que la tâche qu'il doit exécuter n'a pas été enregistré en BDD.
3. Les deux serveurs sont sur deux ESX différents, et tapent dans deux stockages différents en SAN Iscsi. Un en RAID 10 (BDD), l'autre en RAID 5 (Application). Les deux ESX sont managés ensemble en haut disponibilité par VSphere.
4. Il arrive (log à l'appui) que la tâche soit "exécutée" deux fois dans le même intervalle de temps !!! Pour que ce soit possible il faut que l'une se lance, immédiatement après l'autre, de manière à ce que la première n'ait pas eu le temps d'enregistrer son travail en BDD ... ce qui aurait pour conséquence de bloquer l'autre qui ne ferait rien.
Pour résumé, le fait d'avoir le log de deux éxécutions successives signifie que la tâche se réalise DEUX FOIS CONSECUTIVEMENT DANS UN INTERVALLE DE TEMPS TRES COURT. Intervalle de temps de toutes façon supérieur à l'intervalle programmé dans la crontab.
5. Ce que j'ai constaté de manière très visible et très formelle pour cette tâche, je le vois dans d'autres circonstances par le biais d'erreurs d'insertion en BDD et de violation de clefs primaires... alors que dans le programme il y a un contrôle de la clef avant l'insert !! Comme si le programme s'était exécuté deux fois de manière très proche dans le temps...
J'ai plusieurs pistes à creuser:
1. Un truc bizarre dans la gestion du processeur par les VM, qui entrainerait une multiplication de certains process.
2. Un truc bizarre au niveau de la gestion des accès Iscsi gérés par SAN Melody avec une erreur de gestion au niveau du tampon en RAM.
3. Un truc bizarre au niveau de la BDD qui gérerait mal une montée en charge... ou une erreur de configuration exotique qui entrainerait quelques fois une double exécution des requêtes.
4. Un truc bizarre au niveau de la gestion des process sur le serveur d'application qui entrainerait quelques fois une double exécution des process (Apache 2, PHP 5).
J'ai bien entendu regarder mon code dans tous les sens avant de poster, et je suis catégorique, dans le cas que je cite en exemple il est RIGOUREUSEMENT IMPOSSIBLE que l'exécution se passe deux fois de suite car avant l'exécution il y a un contrôle que la tâche n'a pas déjà été réalisé. SAUF SI IL Y A UNE DOUBLE EXECUTION DANS UN INTERVALLE DE TEMPS TRES COURT....
Merci de vos commentaires, aides, et conseils... j'avoue que j'ai l'impression d'avoir rencontré un martien, je ne maitrise plus rien, et je panique pas mal ... parceque ce genre de problèmes peut avoir des conséquences très facheuses sur un serveur en production... ET JE N'AI AUCUNE IDEE DE SON ORIGINE ET DE LA MANIERE DE LE RESOUDRE .
Théolude.
Partager