Ajouter dynamiquement des pages à conteneurs Zend_Navigation à l'exécution

Par Steven Lloyd Watkin , Jeudi 7 Janvier 2010 22h50

Dans le prolongement de mon dernier message à propos Zend_Navigation, les demandes de route pour sitemap.xml au contrôleur personnalisé / action , ce poste est d'environ dymnamically l'ajout de pages dans un récipient Zend_Navigation à l'exécution / exécution du script.

Son très bien spécifier vos pages dans un ini ou xml fichier, mais à un moment donné, vous allez avoir changer pages de votre site que vous souhaitez dans le cadre d'un menu, plan du site, ou pour être inclus dans votre fil d'Ariane. Donc ce que nous devons faire est d'ajouter des pages à notre conteneur Zend_Navigation à l'exécution. Exemples pour cela être en ajoutant des nouvelles, blogs, ou page de commentaires, etc

Continue reading 'dynamique ajouter des pages à conteneurs Zend_Navigation à l'exécution »»

Acheminer les demandes d'sitemap.xml au contrôleur personnalisé / action

Par Steven Lloyd Watkin , Mercredi 6 Janvier 2010 00h13

Afin de demandes directes de / sitemap.xml à un contrôleur de la coutume et l'action dans votre Zend Framework d'application il suffit d'ajouter les éléments suivants dans votre fichier de configuration ou de application.ini alternatives (par exemple, j'utilise navigation.ini):

 resources.router.routes.sitemap.route = "sitemap.xml"
 resources.router.routes.sitemap.defaults.controller = indice
 resources.router.routes.sitemap.defaults.action = sitemap

Exemple de code pour la sortie peut être vu par la création d'une action dans le contrôleur approprié (par exemple, mon sitemap réside dans le contrôleur de l'indice, l'action sitemap):

 < php
 Classe IndexController
     étend Zend_Controller_Action
 {
     / **
      * Rend un plan du site basée sur la configuration Zend_Navigation
      * /
     sitemapAction fonction publique ()
     {
    	 echo $ this-> view-> Navigation () -> plan du site ();
    	 $ This-> view-> layout () -> disableLayout ();
    	 $ This-> _helper-> viewRenderer-> setNoRender (true);
     }
 }

Sitemaps peut rapidement et facilement être généré en utilisant Zend_Navigation , un bon tutoriel rapide (et généralement très utile pour les tutoriels Zend Framework) est Zend plâtres - créer dynamiquement un menu un sitemap et la chapelure .

Zend Framework par module les paramètres en fonction

Par Steven Lloyd Watkin , Vendredi 1er Janvier 2010 22h40

J'ai créé un suivi à ce poste qui nécessite moins de configuration, s'il vous plaît voir la disposition des modules base - le Zend Framework .

Lorsque vous utilisez le Zend Framework avec des modules, son évident que si vous utilisez différents (sous-) sites au large de la même application que vous ne voulez pas nécessairement les mêmes scripts configuration pour chaque partie. J'ai décidé d'aller avec la structure du site suivant:

  / Application
     / Contrôleurs
         ...
     / Modèles
     / Modules
         / Par défaut
             / Contrôleurs
             / Mise en page
                 / Scripts
             / Vues
                 / Scripts
         / AnotherModule
             ...
     / Scripts

Le problème a été mise en place des scripts de disposition sur une base par module. La réponse est venue grâce à l'aide d'une aide d'action. Mise en place les mises sur une base par module comprend trois étapes:

  1. Application.ini (ou procédure de configuration similaire):
      admin.resources.layout.layoutPath = APPLICATION_PATH "/ modules / admin / layouts / scripts"
     default.resources.layout.layoutPath = APPLICATION_PATH "/ modules / default / layouts / scripts"
     member.resources.layout.layoutPath = APPLICATION_PATH "/ modules / membres / layouts / scripts"
     affiliate.resources.layout.layoutPath = APPLICATION_PATH "/ modules / affilié / layouts / scripts" 
  2. Créez votre aide d'action:
      <? Php
     / **
      * Définit le chemin tracé sur une base par module
      *
      * @ Author Lloyd Watkin <lloyd@evilprofessor.co.uk>
      * @ Depuis 2010-01-01
      * /
     Classe Pro_Controller_Action_Helper_SetLayoutPath
         s'étend Zend_Controller_Action_Helper_Abstract
     {
         / **
          * Définit le chemin aménagement basé sur le module
          * /
         preDispatch fonction publique ()
         {
        	 $ Module = $ this-> getRequest () -> getModuleName ();
    
    	     if ($ bootstrap = $ this-> getActionController ()
    	                        -> GetInvokeArg («bootstrap»)) {
    
    	         $ Config = $ bootstrap-> getOptions ();
    
    	         if (isset ($ config [$ module] ['ressources'] ['layout'] ['layoutPath'])) {
    	             LayoutPath $ =
    	                  [Module $] $ config ['ressources'] ['layout'] ['layoutPath'];
    	             $ This-> getActionController ()
    	                  -> GetHelper ("layout")
    	                  -> SetLayoutPath (layoutPath $);
    	         }
        	 }
         }
     } 
  3. Et enfin boostrap l'aide d'action:
      ...
         / **
          * Met en place des scripts sur une mise en page par module
          * /
         protégée fonction _initLayoutHelper ()
    	 {
    	     $ This-> bootstrap ('frontController');
    	     $ Layout = Zend_Controller_Action_HelperBroker:: addHelper (
    	         nouvelle Pro_Controller_Action_Helper_SetLayoutPath ());
    	 }
     ... 

Doctrine: DATETIME défaut MAINTENANT ()

Par Steven Lloyd Watkin , Mercredi 30 Décembre 2009 18:30

J'ai été aux prises avec la mise en place un schéma de base pour un nouveau Zend Framework projet. Je suis utilisant d'essayer d'utiliser Doctrine ORM pour mes modèles de bases de données. J'ai besoin de mettre en place le schéma afin qu'il m'a permis de fixer une date et heure par défaut pour un `datetime` colonne, par exemple lorsque vous ajoutez un nouveau message je obtenir le timestamp courant. Après de longues recherches et d'expérimentation que j'ai trouvé la solution afin que je le partage.

Dans votre schéma YAML fichier simplement faire ce qui suit:

 Message:
   ActAs:
     Timestampable:
       créé:
         Nom: created_at
         Type: timestamp
         Format: Ymd H: i: s
       Mise à jour:
         Nom: LAST_UPDATED
         Type: timestamp
         Format: Ymd H: i: s
   colonnes:
     Identifiant:
       Type: entier
       primaires: vrai
       autoincrement: true
     Nom: string (255)
     courriel: string (300)
     message: String (2000)

Si d'autre part vous ne voulez pas une `updated_at` vous pouvez utiliser les éléments suivants:

 Message:
   ActAs:
     Timestampable:
       créé:
         Nom: created_at
         Type: timestamp
         Format: Ymd H: i: s
       Mise à jour:
         personnes handicapées: true
   colonnes:
     Identifiant:
       Type: entier
       primaires: vrai
       autoincrement: true
     Nom: string (255)
     courriel: string (300)
     message: String (2000)

Design Patterns PHP - Pattern Observateur

Par Steven Lloyd Watkin , Mardi 29 Décembre 2009 22:02

J'ai lu Head First Design Patterns récemment et ont décidé d'écrire quelques-uns des motifs comme des exemples de PHP pour mon propre bénéfice. Le premier que j'ai décidé de coder le modèle Observateur . La définition formelle du modèle Observateur est le suivant:

Le modèle d'observateur (un sous-ensemble de l'asynchrones publication / abonnement pattern ) est un logiciel de design pattern dans lequel un objet , appelé le sujet, maintient une liste de ses personnes à charge, a appelé les observateurs, et les informe automatiquement de tout changement d'État, généralement par téléphone un de leurs méthodes . Il est principalement utilisé pour mettre en œuvre des systèmes distribués de gestion des événements.

Comme les systèmes deviennent plus faiblement couplés en s'assurant que quand un événement se produit tous les systèmes qui exigent la connaissance de ces mises à jour sont informés. Par exemple, un billet de blog, après avoir enregistré un message nous pouvons avoir besoin de mettre à jour un moteur de recherche (par exemple, Lucene), mettre à jour notre plan du site, les tags, les utilisateurs de messagerie souscrit, etc Le modèle Observateur permet aux développeurs d'ajouter des écouteurs supplémentaires sans avoir à éditer leur objet observable . En injectant des observateurs (c'est à dire un moteur de recherche mise à jour observateur, un générateur de sitemap, etc) dans un sujet (ie blog post système de montage), nous pouvons permettre à la de s'acquitter de toutes les mises à jour nécessaires, sans aucune modification.

Continuer 'Design Patterns PHP - Pattern Observateur «la lecture»

Grid Computing Office en utilisant des environnements virtuels - Partie 4

Par Steven Lloyd Watkin , Vendredi 4 Décembre 2009 11:59

Introduction

Je travaille dans une entreprise où nous courons le traitement batch de nombreux millions d'enregistrements de données chaque jour et j'ai pensé récemment à propos de toutes les machines qui sont assis autour de chaque et tous les jours à ne rien faire pendant plusieurs heures. Ce ne serait pas bien si on pouvait utiliser ces machines pour renforcer la puissance de traitement de nos systèmes? Dans cette série d'articles que je vais regarder les avantages potentiels d'employer un bureau de grille en utilisant les environnements virtualisés.

Dans la partie 3 nous avons créé notre machine de traitement virtuel et mettre en place les machines Windows de devenir inactif travailleurs à temps.

Exécution du dernier code

Inévitablement, après la création de votre logique métier travailleurs vont changer, les bugs seront trouvés, le code plus rapide et plus efficace sera produite laissant ainsi vos travailleurs assis autour du traitement des données à l'aide ancien code malodorants . Comment alors pouvons-nous nous assurer que nous sommes toujours en utilisant la dernière version du plus grand et de nos scripts de traitement?

Il ya quelques très facile des moyens simples que nous pouvions faire cela, le truc, cependant, est de réduire la puissance de traitement et le trafic réseau pour y parvenir. Commençons par le plus simple des solutions et il s'améliorer lentement sur une couple d'itérations.

La première méthode serait de tout simplement se connecter à notre serveur de contrôle d'emplois (via Samba, FTP, ou similaire) et tirer vers le bas de la dernière version du code. Pas très efficace, mais il faudra faire le travail. Permet d'améliorer ce peu, que diriez-vous de créer un script rsync et en utilisant à chaque fois que la place? Alternativement ce sujet mettant notre script de traitement plus tard dans la subversion vérifiant le code d'abord et ensuite seulement mettre à jour notre code sur chaque run ( svn update )?

En fin de compte on pourrait se retrouver avec un script bash (appelé par cron toutes les 10 minutes) qui est aussi simple que cela:

  #! / Bin / sh
 si ps ax | grep-v grep | grep php > / dev / null
 puis
     echo "l'emploi est en cours de traitement, la sortie"
 d'autre
     echo "Job ne fonctionne pas, commencer dès maintenant»
     cd / chemin / vers / travailler / copie
     svn update
     php yourJobProcessingScript.php
 fi 

Maintenant, nous pouvons être sûr que, avec chaque exécution, nous sommes définitivement tourner la dernière de code. Nous veillons à ce que cela en mettant à jour notre base de code chaque fois que nous effectuons une course et en réduisant le trafic réseau en transférant uniquement les différences de fichier à travers notre réseau.

Dans ma configuration de démonstration, j'ai fait exactement comme ci-dessus. Subversion a été installé sur mon serveur de traitement d'emplois et j'ai simplement tiré le dernier code à partir d'un «travailleur» en utilisant la branche 'svn update'. J'ai aussi ajouté un tag numéro de version à mon script de traitement qui a été retourné à la base de données dans le cadre du retour des résultats. De cette façon, j'ai pu voir que mon code a été mis à jour chaque fois que j'ai copié ma malle dans la branche des travailleurs à savoir que je n'étais définitivement l'exécution du script de traitement plus tard.

En utilisant les dernières données

Si votre traitement des tâches rend l'utilisation de sources de données, puis à un certain point ceux-ci vont être mis à jour aussi. Sauf si vous appelez de vos sources de données sur une base très rares que vous allez inonder votre réseau avec un trafic dès que vos travailleurs commencer à courir apportant tout à un arrêt. Pour ma solution, j'ai décidé que je voudrais passer mes sources de données avec mes machines virtuelles.

Tenez vous êtes des chevaux là-bas! Que faire si mes sources de données sont ÉNORMES? Eh bien c'est vraiment un cas de combien de données parlons-nous? Il peut être plus rentable d'installer un disque dur plus spacieux supplémentaires dans chaque machine que d'acheter un serveur de traitement supplémentaire. C'est une question de budget et appartient à l'entreprise de décider. Il se peut que vos sources de données sont si grands que c'est juste impossible de garder cette quantité de données dans vos machines travailleur. Dans ce cas, que feriez-vous? Eh bien, nous pourrions envisager d'appeler un serveur de données locales, mais cela pourrait provoquer des problèmes avec le réseau. Dans ce cas, un système de grille comme celle-ci peut devenir réaliste d'inclure dans votre environnement de bureau. Il se peut également que vous pouvez regarder dans les stratégies alternatives course, par exemple seulement appeler vos travailleurs 20 heures-six heures chaque nuit et / ou la limitation de requêtes de données source.

Déplacement sur le disons de nos sources de données s'élèvent à 100 Go de données. Eh bien oui, c'est un peu de données pour déplacer le réseau sur une mise à jour. Comment pourrions-nous nous assurer que nous avons de la dernière copie des données dans ce cas? Rsync est une possibilité, mais personnellement, je pense en exécutant votre source dernières données sur votre serveur de traitement d'emplois et de mettre cela en place comme un maître dans la réplication (avec un journal poubelle à long Nice) pourrait être la voie à suivre:

réplication En fixant chacun de vos travailleurs comme un esclave pour les mises à jour d'emplois du contrôle serveur à vos sources de données sera retombée bien à vos travailleurs sans une énorme augmentation de l'activité du réseau (qui est moins que vous effectuez une mise à jour des données énormes et tous vos travailleurs coup de pied dans à la fois). Cela a des avantages sur rsync en ce que vous aurait pas une longue pause avant chaque emploi; que les mises à jour de bases de données, le mysql démon sur votre travailleur sera constamment mise à jour de ses données tandis que le traitement continue.

C'est ainsi que j'ai créé mon serveur de démonstration. Pour configurer la réplication, j'ai suivi le guide sur le site de MySQL ( Configuration de la réplication ) et dans les 20 minutes, j'ai eu mon agent inital reproduire le contrôle des tâches des serveurs jeu de données. Pour chaque travailleur supplémentaire les paramètres de réplication et de processus de travail chaque fois que la VM a été copié.

Résumé

Dans cette section de l'article, nous avons regardé comment facile et indolore, il est de garder votre code de traitement à jour par rsync using ou subverion (SVN) pour faire le travail et réduire le trafic réseau à la même time. Nous avons également discuté de la façon pour maintenir votre information de source de données mise à jour en lui permettant de couler vers le bas pour chacun de vos travailleurs. Ainsi, nous espace assurer que nous gardons avec la logique métier et de l'information dans notre système de quadrillage de bureau. Il y aura évidemment de multiples alternatives à la réalisation de ces tâches, mais voici deux exemples simples pour montrer avec quelle facilité une solution est à trouver.

Suivant le temps

Dans la dernière partie de cette série, bien nommé la partie 5 , nous allons discuter du déploiement de ce système pour. Je vais résumer ce qui a été appris et ce que j'ai réussi à créer.

Grid Computing Office en utilisant des environnements virtuels - Partie 3

Par Steven Lloyd Watkin , Vendredi 4 Décembre 2009 23:37

Introduction

Je travaille dans une entreprise où nous courons le traitement batch de nombreux millions d'enregistrements de données chaque jour et j'ai pensé récemment à propos de toutes les machines qui sont assis autour de chaque et tous les jours à ne rien faire pendant plusieurs heures. Ce ne serait pas bien si on pouvait utiliser ces machines pour renforcer la puissance de traitement de nos systèmes? Dans cette série d'articles que je vais regarder les avantages potentiels d'employer un bureau de grille en utilisant les environnements virtualisés.

Dans la partie 2 nous avons regardé les emplois d'un serveur sera exécuté, et comment les emplois doivent être configurés afin d'atteindre le plus grand nombre de traitements tout en veillant à ce que chaque tâche est traitée sans échec.

Configuration de votre travail - ou d'un serveur LIMP

La prochaine étape dans le processus est de mettre en place vos travailleurs virtuels. Pour cela, je vais utiliser une installation de CentOS en utilisant VirtualBox. Je vais installer mySQL et PHP sur le serveur, aussi connu comme une boiterie (nux ​​Li, m ySQL, P HP) Servera (j'ai pu faire jusqu'à ce nom).

  • Installer VirtualBox sur votre machine Windows (suivre le lien)
  • Télécharger et installer CentOS (version actuelle 5.3) dans une machine virtuelle créée

Il est inutile de me passe à ce qu'il ya probablement 1000 's de tutoriels grand là-bas (OK, en voici une: Création et Managing CentOS machine virtuelle sous VirtualBox ). Le point important à noter est que je suppose que j'ai appelé ma machine virtuelle GridMachine.

Quant à mon choix du client de virtualisation et de système d'exploitation va il n'ya aucune raison convaincante pour chaque grande choix. VirtualBox est une chose que j'utilise sur mon ordinateur à domicile et est soutenu par les trois principaux systèmes d'exploitation. J'ai choisi CentOS comme un OS stable, bonne, et je l'utilise sur mon propre serveur Web. Je suis un grand croyant dans les bons outils pour le travail (même si je suis d'appliquer «l'utilisation la plus rapide et plus facile pour vous« la mentalité ici), donc si X système d'exploitation exécute votre code rapidement et plus efficacement utiliser à la place:)

Il est important de s'assurer que votre VM utilise le DHCP, sinon pour chaque nouvelle machine virtuelle aurait besoin d'être configurés séparément, ce qui est quelque chose que nous ne want.By utilisant DHCP nous n'avons pas besoin de configurer les paramètres réseau individuellement pour les machines des travailleurs, DHCP main IP pour vous. Par conséquent, vous pouvez copier votre machine virtuelle sur le bureau sans se soucier de la mise en place de chacun (ce qui améliore l'évolutivité et réduit l'administration travailleur).

Le processus que vous devriez viser à atteindre serait d'obtenir une nouvelle machine physique, installez VirtualBox, puis à peu près le déploiement de l'image virtuelle, sans beaucoup d'autre. Il pourrait être sage d'installer tous vos ouvriers sur un sous-réseau différent de sorte que vous pouvez au moins voir combien de machines sont en marche. Vous aurez également besoin de configurer votre machine sur un bail de longue ou illimitée bail DHCP.

Comment exécuter des tâches sur le travailleur

C'est un domaine intéressant et il ya plusieurs méthodes valables pour le traitement des travaux sur le travailleur. Ici, je vais juste parler des deux plus évidentes:

  • Perpétuellement exécution de script: un script, que ce soit un script shell ou un script PHP est exécuté une fois sur le travailleur et s'exécute comme partie d'une boucle infinie. J'ai réduit cette méthode comme un accident du script et potentiellement vos travailleurs cesseront de courir sans une certaine forme d'intervention.
  • L'exécution du script Cron base: toutes les X minutes le daemon cron coup d'envoi d'un appel à votre script pour faire avancer les choses. Sans quelques vérifications cela pourrait conduire à de nombreuses copies de votre course script travailleur.

Ma décision était d'aller avec cron qui débutera un script shell toutes minutes. 10 Mon script shell effectue les tâches suivantes:

  1. Obtenez une liste des processus et grep ce pour 'php'. S'il n'est pas trouvé avant de continuer.
  2. Appelez votre code de travail, dans mon cas ce serait quelque chose en fonction PHP
  3. Script travailleur remplit sa course
  4. Prêt à partir à nouveau sur le prochain appel appropriée

Mon script bash ressemble à quelque chose comme ce qui suit:

  #! / Bin / sh
 si ps ax | grep-v grep | grep php> / dev / null
 puis
     echo "l'emploi est en cours de traitement, la sortie"
 d'autre
     echo "Job ne fonctionne pas, commencer dès maintenant»
     php yourJobProcessingScript.php
 fi 

Remarque: le fait écho sont presque complètement inutile, mais peut aider la prochaine personne qui vient le long d'essayer de les modifier.

Cela conclut la mise en place de la machine virtuelle travailleur, rapide, simple et facile à copier à chaque nouveau morceau de matériel qui est reçu. Le «intelligence» du système de grille n'est pas vraiment dans le visualisés OS, son tout à voir avec le code créé pour traiter les tâches, la configuration d'emplois, et à faire en sorte que le travail s'exécute, le cas échéant (c'est à dire lorsque l'hôte est inactif ).

Configuration de Windows pour initialiser les travailleurs

La première tâche est de travailler à la commande nécessaire pour faire fonctionner la machine virtuelle à partir de la ligne de commande Windows. Si vous avez installé VirtualBox dans l'emplacement par défaut et que vous avez appelé votre GridMachine travailleur alors la commande nécessaire pour charger votre travailleur est:

  "C: \ Program Files \ Sun \ VirtualBox \ VBoxManage.exe" startvm GridMachine 

Cependant, pour exécuter le script dans un «décapité» l'état, nous devons utiliser:

  "C: \ Program Files \ Sun \ VirtualBox \ VBoxHeadless.exe» startvm GridMachine - PRPPH = off 

Cela va démarrer la machine virtuelle sans l'interface graphique et lui permettre d'enregistrer l'état de grâce. Le second argument s'éteint RDP afin qu'il n'entre pas en conflit avec Windows RDP, ou vous donner un message à l'écoute sur le port 3389. Le nom de la machine virtuelle est sensible à la casse!

Ensuite, nous aurons besoin de mettre en place des fenêtres pour lancer notre VM travailleur une fois la machine a été ralenti. Pour ce faire (sous Windows XP), vous aurez besoin d'aller sur Démarrer -> Tous les programmes -> Accessoires -> Outils système -> Tâches planifiées comme suit:

les tâches planifiées

Ensuite cliquez sur "Ajouter une tâche planifiée" suivie sur Parcourir pour ajouter un programme personnalisé. Accédez à votre script VBoxManage et cliquez sur OK. Programmez votre tâche pour l'une des options (nous allons changer cela en une minute) et continuer. Après sauter l'écran suivant Windows vous demandera qui vous voulez exécuter cette tâche, je vous suggère soit «Administrator» ou la création d'un nouvel utilisateur privilégié. N'oubliez pas que nous ne voulons pas interférer avec le compte personnel du standard sur la machine à tout moment. Cliquez sur Suivant et cochez la case Afficher les options avancées de cette tâche.

Pour la fin de la zone de texte exécuté ajoutez notre chaîne 'startvm GridMachine »et s'assurer que courir que lorsque vous êtes connecté est laissé décochées. Visitez la tâche prochain horaire et le changement du calendrier déroulant de l'option "en cas d'inactivité", choisissez la quantité de temps vous souhaitez que la machine soit inactif avant de passer à l'onglet suivant.

Enfin décocher l'option qui stipule arrêter la tâche si elle a été exécutée montant X de temps, mais ne cochez l'option pour arrêter la tâche si la machine n'est plus ralenti.

calendrier

Ça y est alors pour la configuration d'hôte fenêtres!

Résumé

Dans cette partie, nous avons mis en place une machine virtuelle à agir en tant que travailleur, ainsi que la manière dont nous appeler et d'exécuter des scripts de traitement de notre travail (pour moi-même un script PHP). De là, nous regardons comment mettre en place nos copies de Windows pour démarrer la machine virtuelle en mode headless lorsque l'ordinateur est inactif, et enregistrer son état lorsque l'utilisateur reprend l'usage de la machine. Espérons à ce point que vous voyez combien il est simple à mettre en place un tel système et sont impatient de faire quelques expériences vous allez!

Suivant le temps

Dans la partie 4 , nous allons chercher à utiliser les outils pour s'assurer que vous utilisez la dernière version des sources de code et de données afin que les résultats obtenus sont toujours à jour avec les dernières informations d'affaires et de logique.

Grid Computing Office en utilisant des environnements virtuels - Partie 1

Par Steven Lloyd Watkin , Vendredi 4 Décembre 2009 23:23

Introduction

Je travaille dans une entreprise où nous courons le traitement batch de nombreux millions d'enregistrements de données chaque jour et j'ai pensé récemment à propos de toutes les machines qui sont assis autour de chaque et tous les jours à ne rien faire pendant plusieurs heures. Ce ne serait pas bien si on pouvait utiliser ces machines pour renforcer la puissance de traitement de nos systèmes? Dans cette série d'articles que je vais regarder les avantages potentiels d'employer un bureau de grille en utilisant les environnements virtualisés.

En PHP développeur, je vais utiliser les outils que j'utilise chaque jour à savoir, Linux, mySQL , PHP, VirtualBox et Subversion (SVN). Cependant j'espère que ce guide va s'adapter à d'autres langues et des technologies tout aussi bien.

La solution que je fournis seront très vaguement basé sur le type de traitement que nous avions besoin pour atteindre cependant ce ne peut être vrai dans l'article en entier que je vais changer les choses pour plus de simplicité, ou pour produire des scénarios d'utilisation les plus intéressants.

Ces environnements virtualisés va fonctionner sur des machines Windows puisque c'est ce que la majorité des bureaux courir. Le traitement que les machines de bureau ne devrait pas interférer avec le personnel utilisant ces machines, devrait ne nécessitent aucun entretien à la machine, et être facilement déployable à de nouvelles machines à mesure qu'ils deviennent disponibles. Aussi, de nouvelles machines virtuelles ne devraient pas nécessiter aucune configuration supplémentaire car cela réduit considérablement l'évolutivité et la facilité avec laquelle le système de grille peut être prolongé.

Pourquoi déployer une grille de calcul Office?

Tout d'abord, vous pensez peut-être, pourquoi ne pas simplement utiliser une ressource de cloud computing tels que la plate-forme Amazon EC2 ? Bien des raisons pourrait être plusieurs, par exemple:

  • Vous ne serez pas confier certaines données à un environnement de cloud computing
  • Vous ne pouvez pas mettre certaines données dans un environnement de cloud computing pour des raisons légales (par exemple les données de quitter le pays), potentiellement, pour des raisons juridiques, par exemple les dossiers du NHS.
  • Vous voulez garder vos unités de traitement à proximité et ont le plein contrôle sur le matériel trop
  • Vous n'avez pas les fonds du projet pour exécuter les instances nuage
  • Votre bureau n'a pas de connexion à l'internet et donc ce n'est pas possible d'utiliser une ressource nuage
  • Vous n'aimez pas la pluie, les nuages ​​de pluie suggèrent donc vous gardez bien à l'écart

Je suis sûr que la liste pourrait continuer, mais je pense que ça suffit pour aujourd'hui.

Avantages d'une grille de calcul Office

Eh bien, laisse faire un peu de maths (et dans un style vraie physique permet de faire quelques hypothèses de balayage). Imaginez que vous avez grand serveur de traitement costaud courir 100 emplois par jour. Dans votre bureau, vous avez 50 machines qui sont inactifs 16 heures par jour, chacune de ces machines est de 10% plus puissant que votre traitement de rompre les costauds. (Tous les résultats ici sont arrondies à sous-estimer augmenter les performances).

Ainsi, une alimentation de la machine * 10% * 2 / 3 du temps de traitement = 0,067 soit 1 bureau dans les temps d'inactivité pourrait traiter six emplois à plein par jour.

Si maintenant vous ampleur de cette place qu'il faut 15 ordinateurs de bureau inactif pour traiter autant d'emplois par jour en tant que votre serveur de traitement principal ne.

Ainsi, dans notre bureau de faire semblant de 50 machines nous pourrions accroître notre puissance de traitement du serveur 1 jusqu'à 4 serveurs de traitement complet, ou nous pourrions être le traitement de 400 emplois par jour au lieu de 100.

Notez, par aucun investissement dans du nouveau matériel de votre entreprise vient d'augmenter sa capacité de traitement par lots 4 fois! Potentiellement vous allez augmenter votre consommation d'énergie mais de la plupart des environnements de bureau que j'ai été à des machines sont généralement laissés sur la nuit de toute façon, on pouvait voir cela comme une initiative verte.

D'autres avantages aussi signifier que l'investissement dans de nouvelles (ou mise à jour) des serveurs de traitement peut être retardé si vos machines de bureau sont suffisantes et que vous améliorez la puissance de vos machines de bureau de votre grille de bureau devient plus puissant automatiquement.

Technologies

Qu'est-ce que vous avez besoin? (Ou plus exactement ce que j'ai utilisé):

  • Machines de bureau Idle (dans mon cas une pièce de rechange vieux Windows XP ordinateur portable)
  • VirtualBox (ou un autre logiciel client de virtualisation)
  • Une machine virtuelle avec PHP, mySQL running l'exécution d'un coupé OS, je vais appeler ces serveurs LIMP mon:)
  • Emplois à courir
  • Job Server (peut être une autre machine virtuelle, quelque part)

Emplois typiques

Les types d'emplois que ce système est conçu pour fonctionner comme suit:

  • Système reçoit une liste de données sur lesquelles nous avons besoin de match et le retour des résultats
  • Matching consiste à vérifier / chercher plusieurs (assez statique) sources de données
  • Résultats à partir de sources de données peuvent nécessiter une validation plus poussée, la fusion, la vérification des sources de données supplémentaires en réponse aux résultats
  • Les données sont retournés avec des enregistrements correspondants, entièrement validée et traitée
  • Chaque enregistrement dans un travail est indépendant du reste

Donc, fondamentalement, nous cherchons à faire tourner des tâches qui exigent un mélange de recherches en base et quelques calculs numéro, un scénario assez typique dans un environnement des affaires.

Grille des solutions sont non seulement avantageux pour le traitement des emplois de ce type. Fondamentalement, tout processus qui peut être divisé en unités indépendantes peuvent être exécutés en parallèle. Voir cette wikipedia pour des exemples et plus d'informations: Grid Computing , mais quelques exemples célèbres sont Seti @ Home et BIONC . Il ya des cadres pour faire fonctionner les grilles de calcul, et elles sont bien dignes d'intérêt.

Que ferons-nous atteindre?

À la fin de ces articles, j'espère que pour montrer que le déploiement d'un réseau de bureaux ne doivent pas être extrêmement coûteux ou consomment du temps. Je vais discuter:

  • Mise en place du système de contrôle des tâches de configuration d'emplois,
  • Créer une machine virtuelle appropriée de traitement
  • Comment installer le système sur une machine Windows
  • Assurer que vous utilisez le dernier code et les données
  • Le déploiement et l'analyse comparative
  • Pour l'avenir

Je serai bâtiment (ok, j'ai construit, puis écrit ce) un exemple d'application pour tester les concepts sur une machine locale sous Windows XP et mon «GridMachine« machine virtuelle. Mon serveur de contrôle des travaux sera ma machine principale qui va de Fedora 11 .

Ce n'est en aucune façon pour but de démontrer un système entièrement fonctionnel robuste, son signifié plus d'une démonstration et discussion montrant que ces choses peuvent être réalisées dans un espace de temps relativement court et à peu de frais. S'il vous plaît, n'hésitez pas à m'envoyer vos commentaires, corrections ou améliorations, et je ferai de mon mieux pour garder cet article mis à jour pour correspondre.

Suivant le temps

Dans la partie 2 je vais commencer par regarder le système de contrôle du travail, et examiner comment les emplois doivent être configurés afin d'atteindre le plus grand nombre de traitements tout en veillant à ce que chaque tâche est traitée sans échec.

Grid Computing Office en utilisant des environnements virtuels - Partie 2

Par Steven Lloyd Watkin , Vendredi 4 Décembre 2009 23:23

Introduction

Je travaille dans une entreprise où nous courons le traitement batch de nombreux millions d'enregistrements de données chaque jour et j'ai pensé récemment à propos de toutes les machines qui sont assis autour de chaque et tous les jours à ne rien faire pendant plusieurs heures. Ce ne serait pas bien si on pouvait utiliser ces machines pour renforcer la puissance de traitement de nos systèmes? Dans cette série d'articles que je vais regarder les avantages potentiels d'employer un bureau de grille en utilisant les environnements virtualisés.

Dans la partie 1 que j'ai donné un aperçu du système et des technologies, je vais utiliser aussi bien comme nous le verrons quelques-unes des raisons potentielles pour lesquelles vous voulez créer une grille de bureau.

Job Control

Si vous allez faire tourner les emplois, alors vous allez avoir besoin d'une certaine façon de les gérer. Votre système de contrôle du travail (sur votre serveur de travail) doit être vraiment bien pensé, avant même de tenter d'exécuter une grille de bureau. Donc premièrement, quelles sont les tâches d'un système de contrôle des tâches:

  • Emplois sur la main sur demande auprès de travailleurs
  • Dites travailleurs quel type d'emplois à courir
  • Emplois Track
  • Assurez-vous que les emplois ne sont exécutées une fois
  • Fournir des données d'emplois pour les travailleurs, ou tout au moins leur dire où se le procurer

Le système doit également être extensible, une solution qui fonctionne pour l'instant dans un seul cas peut être prolongée d'exécuter plusieurs types d'emplois que l'entreprise voit la valeur dans une solution de la grille. Par exemple, les emplois peuvent gagner des priorités, plus d'un type d'emploi peuvent exister (c'est à dire de plusieurs bases de code), vous finirez peut même exécuter plusieurs machines différentes des travailleurs qui sont optimisés pour chaque type d'emploi (bien que cela s'éloigner de l'ouvrier «génériques 'idée). Toujours essayer de penser à l'avenir lors de l'élaboration des systèmes, une vision à court terme peut conduire à la frustration à long terme et le temps de développement accru.

Job Server

Nous allons avoir besoin de quelque part pour contrôler nos offres d'emploi de ce devrait être le seul système dans votre grille qui a une ressource fixe localisateur, que ce soit une adresse IP, nom d'hôte, URL (en utilisant le 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 du travail (et non le système de contrôle d'emploi à trouver des travailleurs).

Le serveur poste lui-même n'a pas vraiment une tâche compliquée (dans un système de base de toute façon), il a besoin de stocker une liste d'emplois, la main sur l'emploi, de recevoir les résultats, et ensuite les stocker pour une utilisation ultérieure. Comment ces pièces (comme «la main sur des emplois») sont définis peuvent être très basiques. Plus tard, nous pouvons étendre le système pour inclure une interface d'administration pour ajouter, modifier, supprimer, suspendre emplois, mais c'est au-delà de cet exercice.

Il n'y a 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 principal à condition qu'il ne s'écoule pas trop de ressources d'elle. The job server however does need high availability, if it goes down on a Friday evening you're going to lose a whole weekend of processing, potentially costing you a couple of weeks worth of processing time (when compared to your main processing server alone). You may want to consider putting your job server on a load balanced environment for high availability.

Configuration de base

The basic setup for our job server will consist of what I'm calling one of my LiMP servers (that is Li nux, m ySql, P HP). The code running on the workers will actually work out what jobs it can run by interacting with with job control system databases. Later on we could create a web service and actually hand out jobs rather than having the workers do the hard work themselves, but for now we'll continue using the KISS principle (Keep it Simple, Stupid!).

So, lets create three mySQL tables to deal with jobs. These will be `jobs`, `jobRecords`, and `jobResults`.

jobs table Here I'm using SQL Buddy a great little alternative to phpMyAdmin just because its easier to install on centOS (for others see: 10 Great alternatives to phpMyAdmin )

This table consists of 5 simple fields,

  • id: Uniquely identify the job
  • name: Could be a client reference, or any number of other identifiers
  • Status: You need to know where the job is at, eg
    • 0: Not started
    • 1: Picked up
    • 2: Completed
  • started_by: Who's started doing the job? This isn't entirely required but is a nice to have. I'd suggest tracking workers by their IP address on your network
  • started_at: When did the worker start the job? By tracking jobs that have not completed within X amount of time we know we need to pick up the job once again and start processing by another worker. Workers could stop processing/go offline for any number of reasons, power failure, crash, network loss, etc.

It is easy how this table could be extended with a few additional fields to allow for statistics tracking, a finish time column to see how long the job took, a counter to see how many workers picked up the job (obviously this needs to tend to 1), job priority, the list can go on and on. In more complex job scenarios it would be possible to specify how much memory the worker would need access to (and therefore only use suitable workers), or even what type of worker would be required.

Lets add a few example jobs:

example jobs

The next table again is quite simple to understand, these are our job records. They are linked to the main jobs table by a column `jobs_id`. The make up of this table very much depends on the data that you need to supply to your workers, lets make a very simple example where we have four columns:

  • id: ID of the record
  • name: Person's name
  • address: Person's address
  • jobs_id: The job ID that this record is linked to

The third and final table consists of a results table, it has much the same make up as our records table, and with the addition of some columns could be part of the records table:

  • job_record_id: Link the result to the job table
  • result: The result data

…and that's all you need for job control! (albeit at a very basic level) In my case I'm pointed to another table where my data to process was located, but this could just as easily been a file, parameters to run simulation code, you name it.

Selecting a job

As stated previously, the workers will do our job management for us for now, so all we need to really do is find a job that needs processing and get the information. How would we do this? Well pick our job selection criteria and look for jobs, in SQL I did the following:

  1. Take any jobs that are not marked as complete but from our worker and reset them (substitute __ME__ with an identifier, easiest would be IP address):
     UPDATE `jobs` SET `status` = 0 WHERE `status` = 1 AND `started_by` = __ME__; 
  2. Using our job selection criteria, select a job and tell the control system that this worker is dealing with it:
     UPDATE `jobs` SET `status` = 1, `started_by` = __ME__, `started_at` = NOW() WHERE `status` = 0 OR
    (`status` = 1 AND `started_at` > DATE_SUB(NOW(), INTERVAL X HOUR)) ORDER BY `id` ASC; 

    By grabbing jobs that haven't returned results in X amount of time we ensure that all jobs are run in the event of a worker crashing or going AWOL.

  3. Next grab the jobs details followed by the records themselves:
     SELECT * FROM `jobs` WHERE `started_by` = __ME__ LIMIT 1;
    SELECT * FROM `job_records` WHERE `id` = __JOBID__; 

Upon completion of the job we insert our result records and mark the job as complete. Remember as jobs can suspend/resume at any time allow for some robustness in your script. It might be that the task suspends half way through updating the job control system, so checking the number of records in a job and the number of results saved back to the job control system would be a wise move.

In addition, whilst this demonstrates how jobs can be selected and managed from an SQL-query frame you should really be abstracting your job control so that if you decide to switch to using a web service, a file based system, XML , or any other number of systems it will not affect the code above it.

Job Configuration

The next aspect to consider is job size and configuration. By playing with job configuration we can strike an excellent balance between speed, process replication, and reliability. Take a couple of scenarios:

  1. Jobs take 1 day each to run: This means that your workers need 15 days to process each job (remember 10% of the power for 2/3rds of the time). This is clearly not a wise configuration, your job size is way too big! It would take at least double the time to get a job processed should the initial worker go AWOL (time to pick up that it hasn't returned a result plus reprocessing time). In an ideal you'd have at least one full job easily cleared by the end of each long idle period, that way you keep the jobs ticking over and at worst case a job would take two days to process should the first go missing.
  2. Jobs take 1 minute to run: This means that your workers take about 15 minutes to run each job. Whilst this may initially seem ideal, you gain additional work processing during lunch time, coffee breaks, meetings, etc this scenario puts strain on other areas of your system and introduces its own problems. For example, firstly your setup/processing time ratio is going to go right down, therefore losing system efficiency. Your network is going to be constantly streaming job information to the various workers frustrating staff who are dong their day to day work. 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. Lastly, in this situation if your job server goes down you're going to create a huge back log of uncompleted work whereas bigger jobs could of continued processing blissfully unaware that the job server was experiencing difficulties.

In reality there will be no one ideal configuration for your grid setup, much depends on the available resources, types of job, job turnaround time requirements, network capability, and so on. However some guidelines would be:

  • Size jobs so that each worker can get through at least 3-4 jobs in a period of 15 hours (the longest likely idle time period)
  • Play with the job size so that setup time becomes fairly insignificant compared to the processing time (bearing in mind the above point).
  • If a job doesn't complete in double the amount of time (maybe less) you expect it to complete it assume that its gone AWOL and start processing it with another worker. This means you may have to wait up to three times the normal length of a job for it to complete (possibly longer if the subsequent job fails). You may want to reduce this time, but be careful not to reduce it too much as you may start duplicating processing tasks on a regular basis.
  • Jobs should be independent of outside requirements as much as possible. The job server, for example, should only be contacted at the start and end of every job.
  • Don't saturate your network, this will have two negative effects, your daytime staff will find using the network frustrating and problems may be experienced with connections timing out a problem that will only get worse as you scale your grid.
  • Ensure jobs can run on your workers. If jobs become too memory intensive or disk space intensive jobs will start aborting and the only thing you'll notice is a drop in number of jobs processed with no real reason why.

Submitting Results of a Job

When submitting the results of a job it is important to check that results have not been submitted by another worker, especially if the current worker has been dormant for some time.

When results are submitted ensure that the number of results matches the number of records within the job.

As stated previously, and can not be over emphasised, build fault tolerance into job retrieval and results submission. The workers can (and most likely will) go into suspend mode at the most inconvenient of times and this needs to be catered for. Also once again abstracting away your results submission will help cater for future changes to your job control system much easier to deal with.

Résumé

In this section we have looked at what a job control server needs to do and how to get a very basic system set up. We discussed how to retrieve a job from the control system and how best to configure jobs to get the most our of your office grid system. To finish, a paragraph or two on submitting results back to the job control server was presented.

  • A job control server manages jobs and ensures that all work units are completed
  • By abstracting your job select/results submission we can change the technology of the control server without much problems
  • Configure your jobs to ensure that they are run quickly and efficiently without putting too much pressure on your network infrastructure, and without duplicating processing tasks on a regular basis.
  • Ensure that you build fault tolerance and error checking into your routines, workers can suspend and resume and the most inconvenient of times. Remember to check if results have already been submitted by another worker.

Suivant le temps

In part 3 we'll create our virtual processing machine and set up our windows machines to become idle-time workers.

Grid Computing Office en utilisant des environnements virtuels - Partie 5

By Steven Lloyd Watkin , Friday 4th December 2009 11:03 pm

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 4 we looked at using tools to ensure that we're running the latest version of the code and data sources so that obtained results are always up-to-date with the latest business information and logic.

Pre-Deployment

Before deploying your grid system if there's one thing you do and one thing alone it's benchmark your current system ! No matter what you tell colleagues about how much extra work your system is going to do unless you have numbers to back this up your guarantees are nothing. Ainsi,

  • how many records can you process currently? Per Day? Per Hour?
  • How long does it typically take to turn around a job?
  • How much more capacity do you have?

There's also additional questions:

  • If your processing server (or one of your processing servers) goes down how will this affect your capabilities, will you be crippled?
  • What advantages do you hope/expect to get from a grid system?
  • Are your office machines capable of running the jobs?
  • Are your (or can you jobs be converted) to wrok in this style of running?

The last major point is to take your time on any major change like this. Update your processing code to work using the new methodology, benchmark again. Possibly set up your processing server to run a virtual machine, after all your processing server will just be another worker (just a very powerful one relatively). Allow the new process to settle.

Déploiement

My suggestion would be to pop into the office one weekend perform all the installations and setup. Do this just before a fortnight's holiday and leave so other poor chap to deal with the consequences… maybe not…

Deployment for a system like this needs to be slow. Despite it being relatively simple to set up this system will affect your entire office infrastructure (well the digital one). Firstly, roll out to a couple of machines at a time, monitor network traffic, how the worker hosts perform on a day-to-day basis. You may need to alter your job configuration in response to your findings.

Once the system has settled with a few machines (lets say 10% of all office machines, ie 5) keep monitoring network traffic and host machine performance. Next benchmark again, you should now be processing 33% more jobs than your first benchmarks. Check this is so, or that you're at least in this ballpark. If not, investigate what is going on before moving on. Repeat this cycle until you happily have all office machines running without killing individual machine performance or grinding your network to a standstill.

At all times keep benchmarking, even after all deployments are made. Check how new code updates affect speed of your system, check all workers are reporting in and processing jobs. Slowly (very slowly) increment your job configuration to get the best from your workers and network.

Stop!

What if you want to stop your workers from running at some time? They are all out there running, regenerating, and trying their best to process data like hungry insects. The answer may seem obvious but its worth adding just in case its overlooked. Simply edit your processing script with an exit(0) or die() or some other statement to kill your processing job. An important reason why we always try to update to the latest processing script before any run!

Demonstration System

In order to write this set of short articles I created a very small grid to demonstrate the technologies and methodologies. I read lots of articles, tutorials, and used various tools to setup and monitor what was going on. By no means have I gone out and saturated a whole office with traffic and nor have I had access to a regular staff members PC to see how host performance was affected.

My demonstration system was very humble indeed. I used my regular desktop set up as a job control server. On this I had installed mySQL server installed set up as a master in replication, PHP , and SVN linked through apache (for access via worker VM).

I then created a centOS worker machine on VirtualBox on a 6 year old windows XP laptop. I setup scheduled tasks as specified after copying the VM onto the machine and let it go.

The virtual machine was set up with PHP, subversion, and mySQL. I checked out a branch named 'worker' from my job control servers repository and made sure it could be updated using 'svn update'. Next I setup mySQL as a slave and checked that data was replicating from mySQL on the job control server down to the worker VM. After all this I setup the bash script and the cron job.

My processing script basically went along the lines of this (very simple stuff):

  • Read in the name field
  • Counted the number of similar names in a table from the data source held on the VM
  • Counted the number of names as above but splitting the name by spaces (ie forename, middle, surname)
  • Repeated this process 1,000 times

Each job took approximately 20 minutes to run. At one point I opened several copies of the worker VM on the windows laptop and watched the jobs be checked off by each of the worker IP addresses. At this point I also confirmed that replication automatically restarted.

Leaving the laptop to idle resulted in a worker starting to process jobs from the job control server. When resuming laptop usage there was a delay of about 30-60 seconds, this is a fair amount of time and staff would need to be made aware that their machine may pause for a short while when returning to the machine. Newer machines may not have a pause of this long. The benefit of the amount of processing performed by these machines during idle periods would more that outweigh staff members having to wait a short period (say 1 minute) on arriving at their machines of a morning (I frequently wait longer that this for a Windows Defender update to take place) provided they were made aware of this (useful time to grab a morning coffee!).

Overall I feel confident that I have demonstrated the technologies that could be used to create such a system. I have shown that such a system does work on a (very) small scale and with some more experimenting could be scaled up utilise the resources of an office's machines. If I don't get to the point of doing this I would be very interested to know/see when someone else does.

Conclusions / Evaluation

The next obvious step would be to actually get a real world example and start to deploy a system such as this within an office environment and see what happens. Asking a business to commit to this without a trail blazing company to prove the technology and effectiveness may be a little difficult. Grid/Distributed computing is very popular is some circles and has some large applications (BIONC, SETI@Home, Folding@Home, etc). I did not, however, find a smaller scale and simple system like this in my searches that could be rolled out within an office environment.

I created a basically free system using mostly open source software and tools available in almost any office. The technologies were basically demonstrated and show to perform and work as expected. Hopefully I have show that with not much work and with a very simple setup you can deploy an office grid computing system that is powerful, cheap, and scalable all at the same time.

Once a system is up and running there is almost no end to the amount of customisation and improvements you can make. For example statistics / benchmarking can easily be added showing the worth of such a system every day. New machines can be added quickly and easily as and when they arrive with upgrades to existing hardware bolstering your processing power.

I hope you've enjoyed reading this series of articles and its given you food for thought on running an office grid system. The solution presented here won't necessarily work in all situations but should be adaptable to allow you to get your data processing done using your own solution.

Please feel free to send me any comments, corrections, or improvements and I'll do my best to keep this article updated to match.













Thème Panorama par Themocracy

6 visiteurs en ligne aujourd'hui
2 guests, 4 bots, 0 members
Max visitors today: 12 at 06:16 am UTC
Ce mois-ci: 22 à 00h30 UTC 06/08/2011
This year: 130 at 28-03-2011 10:40 pm UTC
Tout le temps: 130 à 28-03-2011 22:40 UTC