Introduction
I work in a company where we run many batch jobs processing millions of records of data each day and I've been thinking recently about all the machines that sit around each and every day doing nothing for several hours. Wouldn't it be good if we could use those machines to bolster the processing power of our systems? In this set of articles I'm going to look at the potential benefits of employing an office grid using virtualised environments.
In Part 1 I gave an overview of the system and technologies I will be using as well as discussed some of the potential reasons why you would want to create an office grid.
Job Control
Si vous allez à l'exécution des travaux, alors vous allez avoir besoin d'une certaine façon de les gérer. Your job control system (on your job server) needs to be really well thought out before even attempting to run an office grid. Alors tout d'abord, quelles sont les tâches d'un système de contrôle de l'emploi:
- Distribuez des emplois à la demande de travailleurs
- Tell workers what type of jobs to run
- Track jobs
- Ensure that jobs are only run once
- Provide job data to workers, or at least tell them where to get it
Le système doit également être extensible, une solution qui fonctionne pour l'instant dans un seul cas peut être étendu à exécuter plusieurs types d'emplois que l'entreprise voit la valeur dans une solution de la grille. For example, jobs may gain priorities, more than one job type may exist (ie several code bases), eventually you may even run several different worker machines that are optimised for each type of job (although that does move away from the 'generic worker' idea). Always try to think about the future when developing systems, a short term vision can lead to longer term frustration and increased development time.
Job Server
Nous allons avoir besoin de quelque part pour contrôler nos offres d'emploi de, cela devrait être le seul système dans votre réseau qui a un localisateur de ressources fixes, que ce soit une adresse IP, nom d'hôte, URL (en utilisant DNS interne), etc C'est parce que les travailleurs ont besoin de savoir où chercher un emploi, les travailleurs ont besoin de trouver le système de contrôle de l'emploi (pas le système de contrôle d'emploi à trouver des travailleurs).
The job server itself doesn't really have a complicated task (in a basic system anyhow), it needs to store a list of jobs, hand out jobs, receive results, and subsequently store them for later retrieval. Comment ces pièces (telles que «la main à l'emploi») sont définis peut être très simple. Later on we can extend the system to include an administration interface to add, edit, delete, suspend jobs but this is beyond this exercise.
Il n'ya aucune raison que ce soit, alors que votre serveur de travail ne pouvait pas être une machine virtuelle fonctionnant au sein de votre serveur de traitement principale à condition qu'il ne s'écoule pas trop de ressources à partir de lui. Le serveur d'emploi ne doivent cependant la disponibilité élevée, si elle descend sur un vendredi soir, vous allez perdre un week-end de la transformation, ce qui pourrait vous coûter une couple de semaines de temps de traitement (par rapport à votre serveur de traitement principal seul) . You may want to consider putting your job server on a load balanced environment for high availability.
Configuration de base
La configuration de base pour notre serveur de travail sera composé de ce que j'appelle un de mes serveurs souples (qui est nux Li, ySQL m, P HP). Le code s'exécutant sur les travailleurs théâtres vont effectivement travailler sur les emplois qu'il peut fonctionner en interaction avec des bases de données d'emplois de contrôle du système. Plus tard, nous pourrions créer un service web et fait part des emplois plutôt que d'avoir les travailleurs ne le dur travail eux-mêmes, mais pour l'instant nous allons continuer à utiliser le principe KISS (Keep It Simple, Stupid!).
Donc, permet de créer trois mySQL tables pour faire face à l'emploi. Ceux-ci seront «emplois», «jobRecords` et `jobResults».
Ici, je suis en utilisant SQL Buddy un peu excellente alternative à phpMyAdmin juste parce que c'est plus facile à installer sur CentOS (pour les autres, voir: 10 alternatives à la Grande phpMyAdmin )
Ce tableau se compose de 5 champs simples,
- Identifiant: l'identification unique des emplois
- Nom: Peut-être une référence client, ou n'importe quel nombre de désignations autres
- Situation: Vous avez besoin de savoir où le travail est moins, par exemple
- 0: Non commencé
- 1: Ramassé
- 2: Terminé
- started_by: Qui a commencé à faire le travail? Ce n'est pas tout à fait nécessaire, mais est un bon d'avoir. Je vous suggère de suivi des travailleurs par leur adresse IP sur votre réseau
- started_at: Quand le travailleur commencer le travail? En faisant le suivi des emplois qui n'ont pas terminé dans le montant de X de temps, nous savons que nous devons prendre le travail une fois de plus et de commencer le traitement par un autre travailleur. Les travailleurs peuvent arrêter le traitement / hors ligne pour un certain nombre de raisons, une panne de courant, crash, le réseau de perte, etc
Il est facile de faire ce tableau peut être étendue avec quelques champs supplémentaires pour permettre le suivi des statistiques, une colonne de temps d'arrivée pour voir combien de temps le travail a pris, un compteur pour savoir combien de travailleurs repris le travail (évidemment cela doit tendance à 1), la priorité d'emploi, la liste peut continuer encore et encore. Dans des scénarios plus complexes d'emploi, il serait possible de spécifier la quantité de mémoire que le travailleur aurait besoin d'accéder à (et donc que l'utilisation appropriée des travailleurs), ou même ce type de travailleurs serait nécessaire.
Permet d'ajouter un peu d'emplois par exemple:
Le tableau suivant est à nouveau assez simple à comprendre, ce sont nos dossiers d'emploi. Elles sont liées à la table principale des emplois par une colonne `jobs_id». La composition de ce tableau dépend en grande partie les données que vous devez fournir à vos travailleurs, permet de faire un exemple très simple où nous avons quatre colonnes:
- id: ID de l'enregistrement
- nom: Nom de la personne
- Adresse: Adresse de la personne
- jobs_id: L'ID d'emplois que ce dossier est lié à
Le tableau troisième et dernière se compose d'un tableau des résultats, il a peu près le même représenter jusqu'à notre table les dossiers, et avec l'ajout de certaines colonnes pourrait faire partie de la table des dossiers:
- job_record_id: Link le résultat à la table de travail
- Résultat: Les données de résultat
... Et c'est tout ce dont vous avez besoin pour le contrôle de l'emploi! (Quoique à un niveau très basique) Dans mon cas, je suis fait à une autre table où mes données à traiter a été localisé, mais cela pourrait tout aussi bien être un fichier, les paramètres d'exécuter du code de simulation, vous l'appelez.
Sélection d'un emploi
Comme indiqué précédemment, les travailleurs ferons de notre gestion de l'emploi pour nous pour l'instant, tout ce que nous devons vraiment faire, c'est de trouver un emploi que les besoins de traitement et obtenir l'information. Comment ferions-nous cela? Eh bien choisir nos critères de sélection d'emploi et chercher un emploi, en SQL, je ne les suivantes:
- Prenez n'importe quel emploi qui ne sont pas marquées comme terminées, mais de nos travailleurs et de réinitialiser les (__ME__ remplacer par un identifiant plus simple, serait d'adresse IP):
UPDATE `SET` emplois `status` = 0 WHERE `status` = 1 ET »started_by` = __ME__;
- En utilisant nos critères de sélection d'emploi, sélectionnez un emploi et dire au système de contrôle que ce travailleur a affaire avec elle:
UPDATE `SET` emplois `status` = 1, «started_by` = __ME__, «started_at` = MAINTENANT () WHERE `status` = 0 ou
(`Status` = 1 ET »started_at`> DATE_SUB (NOW (), INTERVAL X heure)) ORDER BY `id` ASC;
En saisissant les emplois qui n'ont pas retourné les résultats dans le montant de X de temps nous nous assurons que tous les emplois sont gérés dans le cas d'un travailleur ou d'aller s'écraser AWOL.
- Suivant saisir les détails d'emplois suivies par les documents eux-mêmes:
SELECT * FROM `emplois` WHERE `started_by` = __ME__ LIMIT 1;
SELECT * FROM `job_records` WHERE `id` = __JOBID__;
À la fin de l'emploi nous insérons nos dossiers résultat et indiquer que le travail le plus complet. Rappelez-vous que l'emploi peut suspendre / reprendre à tout moment pour permettre une certaine robustesse dans votre script. Il se pourrait que la tâche suspend à mi-chemin à travers la mise à jour le système de contrôle des tâches, de sorte vérifier le nombre d'enregistrements dans un emploi et le nombre de résultats enregistrées sur le système de contrôle du travail serait une sage décision.
En outre, tout cela démontre combien d'emplois peuvent être sélectionnés et gérés à partir d'une requête-cadre SQL, vous devriez vraiment être résumés de votre contrôle sur le travail de telle sorte que si vous décidez de passer à l'aide d'un service web, une base de système de fichiers, XML , ou de toute autre nombre de systèmes de cela n'affectera pas le code au-dessus.
Configuration d'emploi
Un autre aspect à considérer est la taille d'emploi et de la configuration. En jouant avec la configuration de travail que nous pouvons trouver un excellent équilibre entre vitesse, processus de réplication, et la fiabilité. Prenez un couple d 'A scénarios:
- Offres d'emploi de prendre un jour de chaque lancer: Cela signifie que vos employés ont besoin de 15 jours pour traiter chaque emploi (souvenez-vous de 10% de la puissance pour 2/3rds du temps). Ce n'est clairement pas une configuration sage, la taille de votre travail est beaucoup trop grand! Il faudrait au moins doubler le temps de trouver un emploi traitées si le travailleur initiale go AWOL (temps de ramasser qu'il n'a pas retourné un résultat plus le temps de retraitement). Dans l'idéal il faudrait au moins un emploi à plein facilement dégagé par la fin de chaque ralenti longue période, de cette façon vous conserver les emplois et à retardement sur le pire des cas un emploi faudrait deux jours pour traiter les cas où la première disparaissent.
- Emplois prendre 1 minute pour exécuter: Cela signifie que vos employés prennent environ 15 minutes pour exécuter chaque tâche. Bien que cela puisse sembler au départ idéal, vous gagnez le traitement du travail supplémentaire pendant l'heure du déjeuner, les pauses café, les réunions, etc ce scénario met à rude épreuve dans d'autres domaines de votre système et introduit ses propres problèmes. Par exemple, d'une part la configuration de votre ratio temps de traitement va aller droit vers le bas, donc de perdre l'efficacité du système. Votre réseau va être constamment streaming information sur l'emploi aux travailleurs divers membres du personnel qui sont frustrant dong leur travail quotidien. You're also going to put more strain on your job processing server as it has to dish out lots and lots of small pieces of work on a regular basis. Enfin, dans cette situation si votre serveur tombe en panne d'emplois que vous allez créer un journal grand retour de l'inachèvement des travaux alors que les gros travaux de poursuite de la procédure pourrait parfaitement inconscients que le serveur d'emploi connaît des difficultés.
En réalité, il n'y aura pas de configuration idéale pour une configuration de votre réseau, tout dépend des ressources disponibles, les types d'emplois, les exigences du poste délais d'exécution, la capacité du réseau, et ainsi de suite. Cependant, certaines lignes directrices seraient:
- Taille des emplois de sorte que chaque travailleur peut passer au moins 3-4 emplois dans une période de 15 heures (la plus longue période sans doute temps d'inactivité)
- Jouez avec le volume de travail de sorte que le temps d'installation devient assez insignifiant par rapport aux temps de traitement (en gardant à l'esprit le point ci-dessus).
- Si un travail ne se termine pas dans le double de la quantité de temps (peut-être moins) que vous prévoyez de mener à bien l'assumer que son parti AWOL et commencer le traitement avec un autre travailleur. Cela signifie que vous pourriez avoir à attendre jusqu'à trois fois la durée normale d'un emploi pour qu'elle se termine (peut-être plus si le travail s'avère impossible). Vous pouvez réduire ce temps, mais attention de ne pas réduire trop que vous pouvez démarrer la copie des tâches de traitement sur une base régulière.
- Les emplois devraient être indépendantes des besoins à l'extérieur autant que possible. Le serveur d'emploi, par exemple, ne devraient être contactés au début et à la fin de chaque travail.
- Ne pas saturer votre réseau, ce qui aura deux effets négatifs, le personnel de jour se trouve en utilisant le réseau frustrant et des problèmes peuvent être rencontrés avec les connexions de synchronisation à un problème qui ne fera que s'aggraver à mesure que vous réduisez votre grille.
- Assurer des emplois peut fonctionner sur votre travailleurs. Si les emplois deviennent trop de mémoire emplois espace intensive ou intensive du disque va commencer avorter et la seule chose que vous remarquerez est une baisse du nombre de tâches traitées sans véritable raison.
La remise des résultats d'un emploi
Lors de la présentation des résultats d'un travail, il est important de vérifier que les résultats n'ont pas été soumis par un autre travailleur, en particulier si le travailleur en cours a été inactif pendant un certain temps.
Lorsque les résultats sont présentés en sorte que le nombre de résultats correspondant au nombre de dossiers dans le travail.
Comme indiqué précédemment, et ne peut pas être surestimée, de construire la tolérance aux pannes en recherche d'emploi et la présentation des résultats. Les travailleurs peuvent (et très probablement) aller en mode veille à l'inconvénient le plus de fois et cela doit être pris en compte. En outre une fois de plus s'abstraire de votre soumission résultats aideront répondre aux changements à venir à votre système de contrôle du travail beaucoup plus facile à traiter.
Sommaire
Dans ce section nous avons regardé ce que un serveur de contrôle d'emplois doit faire et comment obtenir un système de base mis en place. Nous avons discuté de la façon de récupérer un travail à partir du système de contrôle et de la meilleure façon de configurer des travaux à tirer le meilleur parti de notre système de quadrillage de votre bureau. Pour finir, un paragraphe ou deux sur la présentation des résultats sur le serveur de contrôle des travaux a été présenté.
- Un serveur de contrôle de l'emploi gère les tâches et veille à ce que toutes les unités de travail sont terminés
- En faisant abstraction de votre sélection de travail / présentation des résultats, nous pouvons changer la technologie du serveur de contrôle, sans beaucoup de problèmes
- Configurez votre emploi afin de s'assurer qu'ils sont exécutés rapidement et efficacement sans mettre trop de pression sur votre infrastructure réseau, et sans empiéter sur les tâches de traitement sur une base régulière.
- Veiller à ce que vous construisez la tolérance aux pannes et checking d'erreur dans votre routine, les travailleurs peuvent suspendre et reprendre et l'inconvénient le plus de fois. N'oubliez pas de vérifier si les résultats ont déjà été soumis par un autre travailleur.
La prochaine fois
Dans la partie 3 , nous allons créer notre traitement de la machine virtuelle et mettre en place nos machines Windows à devenir les travailleurs à temps ralenti.