Dynamisch pagina's toevoegen aan Zend_Navigation container tijdens runtime

Door , donderdag 7 januari 2010 22:50

In een vervolg op mijn vorige post over Zend_Navigation, Route verzoeken om sitemap.xml om aangepaste controller / actie , dit bericht gaat over dymnamically het toevoegen van pagina's naar een Zend_Navigation container op runtime / script uitvoering.

Zijn allemaal goed en wel met vermelding van uw pagina's in een ini-of xml -bestand, maar op een gegeven moment zul je moeten veranderen van pagina's in uw site die u wilt als onderdeel van een menu, sitemap, of worden opgenomen in uw breadcrumb trail. Daarom wat we moeten doen is pagina's toevoegen aan onze Zend_Navigation container tijdens runtime. Voorbeelden hiervan zou zijn het toevoegen van nieuws, blog posts, of pagina opmerkingen, etc.

Continue reading 'dynamische pagina's toe te voegen aan Zend_Navigation container tijdens runtime' »

Route verzoeken om sitemap.xml om aangepaste controller / actie

Door , woensdag 06 januari 2010 0:13

Met het oog op rechtstreekse verzoeken om / sitemap.xml om een aangepaste controller en actie in uw Zend Framework applicatie eenvoudig toe te voegen het volgende in uw application.ini of alternatieve config-bestand (bijv. ik gebruik navigation.ini):

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

Voorbeeld code voor het uitvoeren van kan worden gezien door het creëren van een actie in de juiste controller (bv. mijn sitemap ligt in de index controller, sitemap actie):

 < php
 klasse IndexController
     breidt Zend_Controller_Action
 {
     / **
      * Renders een sitemap op basis van Zend_Navigation setup
      * /
     publieke functie sitemapAction ()
     {
    	 echo $ this-> view-> navigatie () -> sitemap ();
    	 $ This-> view-> lay-out () -> disableLayout ();
    	 $ This-> _helper-> viewRenderer-> setNoRender (true);
     }
 }

Sitemaps kunnen snel en eenvoudig worden gegenereerd met behulp van Zend_Navigation , een geweldig snelle tutorial (en over het algemeen zeer nuttig voor het Zend Framework tutorials) is Zend Afgietsels - dynamisch maken van een menu een sitemap en paneermeel .

Zend Framework Per-module op basis van de instellingen

Door , vrijdag 1 januari 2010 22:40

Ik heb een follow-up op dit bericht die minder configuratie vereist gemaakt, zie Module Based Layout - Zend Framework .

Bij gebruik van de Zend Framework met modules, haar duidelijk dat als u gebruik maakt van diverse (sub-) sites buiten de dezelfde toepassing die u niet per se hetzelfde willen lay-out scripts voor elk onderdeel. Ik besloot om te gaan met de volgende site structuur:

  / Toepassing
     / Controllers
         ...
     / Modellen
     / Modules
         / Default
             / Controllers
             / Lay-out
                 / Scripts
             / Uitzicht
                 / Scripts
         / AnotherModule
             ...
     / Scripts

Het probleem was het opzetten van de lay-out scripts op een per-module basis. Het antwoord kwam door het gebruik van een Action Helper. Het instellen van de lay-outs op een per-module basis bestaat uit drie stappen:

  1. Application.ini (of soortgelijke configuratie setup):
     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 / member / layouts / scripts "affiliate.resources.layout.layoutPath = APPLICATION_PATH" / modules / affiliate / layouts / scripts " 
  2. Maak je Actie Helper:
      <? Php
     / **
      * Stelt de lay-out pad op een per-module basis
      *
      * @ Author Lloyd Watkin <lloyd@evilprofessor.co.uk>
      * @ Sinds 2010-01-01
      * /
     klasse Pro_Controller_Action_Helper_SetLayoutPath
         breidt Zend_Controller_Action_Helper_Abstract
     {
         / **
          * Stelt lay-out pad op basis van module
          * /
         publieke functie preDispatch ()
         {
        	 Module = $ $ this-> GetRequest () -> getModuleName ();
    
    	     if ($ bootstrap = $ this-> getActionController ()
    	                        -> GetInvokeArg ('bootstrap')) {
    
    	         $ Config = $ bootstrap-> getOptions ();
    
    	         if (isset ($ config [$ module] ['resources'] ['layout'] ['layoutPath'])) {
    	             $ LayoutPath =
    	                  $ Config [$ module] ['resources'] ['layout'] ['layoutPath'];
    	             $ This-> getActionController ()
    	                  -> GetHelper ('lay-out')
    	                  -> SetLayoutPath ($ layoutPath);
    	         }
        	 }
         }
     } 
  3. En tot slot boostrap de actie helper:
      ...
         / **
          * Stelt lay-out scripts op een per-module basis
          * /
         beschermde functie _initLayoutHelper ()
    	 {
    	     $ This-> bootstrap ('frontController');
    	     $ Layout = Zend_Controller_Action_HelperBroker:: addHelper (
    	         nieuw Pro_Controller_Action_Helper_SetLayoutPath ());
    	 }
     ... 

Doctrine: DATETIME default NOW ()

Door , woensdag 30 december 2009 18:30

Ik heb moeite met het opzetten van een database schema voor een nieuw Zend Framework project. Ik ben gebruik probeert te gebruiken Doctrine ORM voor mijn database modellen. Ik moet het opzetten van het schema, zodat het me toegestaan ​​om een ​​standaard datum en tijd instellen voor een `datetime` kolom, bijvoorbeeld bij het toevoegen van een nieuw bericht krijg ik de huidige tijd. Na veel zoeken en experimenteren vond ik de oplossing dus ik ben te delen.

In je schema YAML bestand gewoon het volgende doen:

 Bericht:
   actAs:
     Timestampable:
       gemaakt:
         naam: created_at
         type: timestamp
         formaat: JMD H: i: s
       bijgewerkt:
         naam: last_updated
         type: timestamp
         formaat: JMD H: i: s
   kolommen:
     id:
       type: integer
       primair: true
       autoincrement: true
     Naam: string (255)
     e-mail: string (300)
     bericht: string (2000)

Als aan de andere kant heb je niet wilt dat een `updated_at` kolom kunt u gebruik maken van de volgende:

 Bericht:
   actAs:
     Timestampable:
       gemaakt:
         naam: created_at
         type: timestamp
         formaat: JMD H: i: s
       bijgewerkt:
         met een handicap: true
   kolommen:
     id:
       type: integer
       primair: true
       autoincrement: true
     Naam: string (255)
     e-mail: string (300)
     bericht: string (2000)

PHP Design Patterns - Observer Pattern

Door , dinsdag 29 december 2009 22:02

Ik heb het lezen van Head First Design Patterns onlangs hebben besloten om een ​​aantal van de patronen te schrijven als PHP voorbeelden voor mijn eigen voordeel. Het eerste dat ik heb besloten tot code is het Observer Pattern . De formele definitie van het Observer Pattern is:

De waarnemer patroon (een subset van de asynchrone publish / subscribe patroon ) is een software ontwerp patroon waarin een object , genaamd het onderwerp, houdt een lijst bij van de personen ten laste, genaamd waarnemers, en waarschuwt ze automatisch van een staat veranderingen, meestal door te bellen naar een van hun methoden . Het wordt voornamelijk gebruikt om gedistribueerde event handling systemen te implementeren.

Als systemen steeds meer losjes gekoppelde ervoor te zorgen dat wanneer een gebeurtenis die alle systemen vereisen kennis van deze updates op de hoogte gebeurt. Bijvoorbeeld, een blog post, na het opslaan van een post we kan nodig zijn om een ​​zoekmachine update (bv. Lucene), werken onze sitemap, tags, e-mail ingeschreven gebruikers, enz. De waarnemer patroon stelt ontwikkelaars in staat om extra luisteraars toe te voegen zonder het bewerken van hun waarneembare object . Door het injecteren van waarnemers (dat wil zeggen een search engine-update waarnemer, een sitemap generator, etc) in een onderwerp (dat wil zeggen blog post editing systeem) kunnen we toestaan ​​dat de aan alle noodzakelijke updates uit te voeren zonder wijzigingen.

Continue reading 'PHP Design Patterns - Observer Pattern' »

Kantoor Grid Computing met behulp van virtuele omgevingen - Deel 4

Door , vrijdag 04 december 2009 23:59

Introductie

Ik werk in een bedrijf waar lopen we een groot aantal batch-taken die worden verwerkt miljoenen records van de gegevens elke dag en ik heb onlangs na te denken over alle machines die zitten elke dag niets doen voor meerdere uren. Zou het niet goed zijn als we zouden kunnen gebruiken die machines voor de verwerking kracht van onze systemen te versterken? In deze reeks artikelen ga ik kijken naar de potentiële voordelen van het gebruik van een kantoor rooster met behulp van gevirtualiseerde omgevingen.

In deel 3 hebben we onze virtuele machine en het opzetten van Windows-machines te worden idle-time werknemers.

Het uitvoeren van de laatste code

Het is onvermijdelijk dat na het maken van uw werknemers business logica zal veranderen, bugs worden gevonden, zal sneller meer efficiënte code te produceren waardoor het verlaten van uw werknemers zat rond de verwerking van gegevens met behulp van oude stinkende code . Hoe kunnen we ervoor zorgen dat wij altijd de nieuwste en beste versie van onze verwerking van scripts gebruiken?

Er zijn een paar zeer eenvoudig eenvoudige manieren kunnen we dit doen, de truc is echter om de verwerking van de macht en het netwerkverkeer te verminderen om dit te bereiken. Laten we beginnen met de eenvoudigste oplossingen en langzaam het over een paar iteraties te verbeteren.

De eerste methode zou zijn om gewoon verbinding te maken met ons werk Control Server (via samba, FTP, of iets dergelijks) en trek de laatste versie van de code. Niet erg efficiënt, maar het zal de klus te klaren. Laten we verbeteren dat enigszins, wat over het creëren van een rsync script en het gebruik van dat elke keer dat in plaats daarvan? Als alternatief hoe zit het zetten onze nieuwste verwerking script tot subversie het controleren van de code in eerste instantie en dan gewoon updaten van onze code op elke run ( svn update )?

Op het einde konden we eindigen met een bash script (geroepen door cron elke 10 minuten), die ziet er zo simpel als dit:

  #! / Bin / sh
 Als ps ax | grep-v grep | grep php > / dev / null
 dan
     echo "Job is op dit moment verwerkt, afslag"
 anders
     echo "Job niet wordt uitgevoerd, nu beginnen"
     cd / pad / naar / werken / copy
     svn update
     php yourJobProcessingScript.php
 fi 

Nu kunnen we er zeker van zijn dat met elke run we zeker zijn de laatste code die wordt uitgevoerd. We zijn ervoor zorgt dat dit door een aanpassing van onze code base elke keer voeren we een run en het verminderen van het netwerkverkeer door alleen de overdracht van het bestand verschillen tussen ons netwerk.

In mijn demonstratie setup, ik deed precies zoals hierboven beschreven. Subversion is geïnstalleerd op mijn werk de verwerking van de server en ik gewoon trok de laatste code van een "werknemer" tak met behulp van 'svn update'. Ik heb ook nog een versie nummer tag op mijn verwerking script dat de database terug als deel van de resultaten terug te keren. Op deze manier kon ik zien dat mijn code werd elke keer als ik mijn koffer gekopieerd naar de werknemer tak dat wil zeggen dat ik zeker was de laatste verwerking script draait bijgewerkt.

Met behulp van de meest recente gegevens

Als uw baan verwerking maakt gebruik van gegevensbronnen dan op een bepaald moment deze zullen ook worden bijgewerkt. Tenzij u contact op met uw gegevensbronnen op een zeer onregelmatige basis je gaat om uw netwerk te overspoelen met het verkeer zo snel uw werknemers beginnen te lopen om alles tot stilstand. Voor mijn oplossing die ik besloten dat ik zou willen om te bewegen mijn gegevensbronnen met mijn VM's.

Houd je paard er! Wat gebeurt er als mijn gegevens bronnen HUGE? Nou dit is echt een kwestie van hoeveel data hebben we het? Het kan meer rendabel om een extra grotere harde schijf te installeren in elke machine dan om een extra verwerking server kopen. Dit is een kwestie van budget en is aan het bedrijf om te beslissen. Het misschien dat uw gegevens bronnen zijn zo groot dat het is gewoon ondoenlijk om die hoeveelheid gegevens bij te houden in uw werknemer machines. In dat geval wat zou je doen? Wel kunnen we kijken naar het bellen van een lokale data server, maar dit kan leiden tot problemen met het netwerk. In dit geval is een grid-systeem zoals dit kan worden onrealistisch te nemen in uw kantooromgeving. Het kan ook zijn dat je kunt kijken naar alternatieve lopen strategieën, bijvoorbeeld alleen het roepen van uw werknemers tussen twintig en 6 uur per nacht en / of smoren gegevensbron verzoeken.

Moving on laten we zeggen onze bronnen oplopen tot 100 GB aan gegevens. Nou ja dat is nogal wat data om rond het netwerk te bewegen op een update. Hoe zouden we ervoor zorgen dat we de laatste kopie van de gegevens zijn in dit geval? Rsync is een mogelijkheid, maar persoonlijk vind ik door het uitvoeren van uw meest recente gegevens de bron op uw werk de verwerking van de server en het instellen van deze zich als een meester in het replicatie (met een mooie lange bak loggen) kan de weg te gaan zijn:

replicatie Door elk van uw werknemers als een slaaf van de job control server updates voor uw gegevensbronnen zal mooi trickle down om uw werknemers zonder een enorme toename in netwerk-activiteit (dat wil zeggen, tenzij u een enorme data-update en al je medewerkers kick in in een keer). Dit heeft voordelen ten opzichte van rsync in dat u niet een lange pauze voor elke job, gelijk als de database-updates, de mysql daemon op uw werknemer zal voortdurend geactualiseerd zijn gegevens tijdens de verwerking doorgaat.

Dit is hoe ik mijn demonstratie-server. Voor het instellen van de replicatie volgde ik de gids op de MySQL site ( Het opzetten van replicatie ) en binnen 20 minuten had ik mijn inital werknemer repliceren van de job control servers dataset. Voor elke extra werknemer van de replicatie-instellingen en het proces werkte elke keer wanneer de VM werd gekopieerd.

Overzicht

In dit gedeelte van het artikel hebben we gekeken naar hoe gemakkelijk en pijnloos het is om uw code voor het verwerken up-to-date door using rsync of subverion (SVN) om het werk te doen en het netwerkverkeer te verminderen in dezelfde time. We hebben ook besproken hoe om uw gegevensbron informatie up-to-date te houden door het te laten doorsijpelen aan elk van uw werknemers. Zo kunnen we ruimte ervoor te zorgen dat we gelijke tred houden met business logica en informatie in ons kantoor draagconstructie. Er zullen uiteraard tal van alternatieven voor het uitvoeren van deze taken, maar hier waren twee simpele voorbeelden om te laten zien hoe makkelijk een oplossing te komen.

Volgende keer

In het laatste deel van deze serie, toepasselijke naam deel 5 , bespreken we de implementatie van dit systeem. Ik zal een samenvatting van wat er is geleerd en wat ik wist te creëren.

Kantoor Grid Computing met behulp van virtuele omgevingen - Deel 3

Door , vrijdag 04 december 2009 23:37

Introductie

Ik werk in een bedrijf waar lopen we een groot aantal batch-taken die worden verwerkt miljoenen records van de gegevens elke dag en ik heb onlangs na te denken over alle machines die zitten elke dag niets doen voor meerdere uren. Zou het niet goed zijn als we zouden kunnen gebruiken die machines voor de verwerking kracht van onze systemen te versterken? In deze reeks artikelen ga ik kijken naar de potentiële voordelen van het gebruik van een kantoor rooster met behulp van gevirtualiseerde omgevingen.

In deel 2 hebben we gekeken naar de banen een server draait, en hoe banen moet worden geconfigureerd om de grootste hoeveelheid van de verwerking te bereiken tegelijkertijd voor te zorgen dat elke opdracht wordt verwerkt zonder mankeren.

Het opzetten van uw werknemer - of slap server

De volgende stap in het proces is het opzetten van uw virtuele werknemers. Voor deze ga ik een installatie van CentOS met behulp van VirtualBox te gebruiken. Ik ga installeren MySQL en PHP op de server, ook wel bekend als een slappe (Li nux, m ySQL, P HP) Servera (ik heb die naam up).

  • Installeer VirtualBox op uw Windows-machine (volg link)
  • Download en CentOS (huidige versie 5.3) te installeren in een virtuele machine gemaakt

Het heeft geen zin me gaan dit is er waarschijnlijk 1000 's van de grote tutorials die er zijn (ok, hier is een: maken en Managing CentOS virtuele machine onder virtualbox ). Het belangrijkste punt om op te merken Ik neem aan dat ik belde mijn virtuele machine GridMachine.

Wat als mijn keuzes van virtualisatie client-en besturingssysteem te gaan is er geen grote dwingende reden voor elke keuze. VirtualBox is iets wat ik gebruik op mijn home machine en wordt ondersteund door de drie grote besturingssystemen. Ik heb gekozen voor CentOS als een goede stabiele OS en ik gebruik het op mijn eigen webserver. Ik ben een groot voorstander van de juiste tools voor het werk (hoewel ik het toepassen van hier 'de snelste en eenvoudigste te gebruiken voor je' mentaliteit), dus als besturingssysteem X draait je code sneller en efficiënter gebruik dat in plaats daarvan:)

Belangrijk is ervoor te zorgen dat uw VM DHCP gebruikt anders, voor elke nieuwe virtuele machine zou moeten apart geconfigureerd worden dat is iets wat we niet want.By gebruik van DHCP we hoeven niet individueel te configureren netwerkinstellingen voor werknemers machines, zal DHCP de hand uit IP's voor je. Daarom kunt u kopieert uw virtuele machine over het kantoor zonder zorgen te maken over het instellen van een ieder op (dit verbetert de schaalbaarheid en vermindert de werknemer administratie).

Het proces dat je moet streven te bereiken zou zijn om een ​​nieuwe fysieke machine te verkrijgen, VirtualBox installeren, en vervolgens vrij veel het virtuele beeld te zetten zonder veel anders. Het kan verstandig zijn om al uw werknemers setup op een ander subnet, zodat u kunt in ieder geval zien hoeveel machines draaien. U moet ook het instellen van uw machines op een erfpacht of een onbeperkte lease DHCP.

Hoe te Jobs draaien op de werknemer

Dit is een interessant gebied en er zijn verschillende valide methoden voor de verwerking van banen op de werknemer. Hier heb ik maar gewoon bespreken de twee meest voor de hand liggende:

  • Voortdurend draaien script: Een script, zij het een shell script, of een PHP-script wordt eenmalig uitgevoerd op de werknemer en loopt als onderdeel van een oneindige lus. Ik heb scherp geprijsde deze methode als een crash van het script en mogelijk uw werknemers zal ophouden te draaien zonder enige vorm van interventie.
  • Cron op basis van script execution: Elke x minuten de cron daemon start een oproep om je script om dingen te gaan. Zonder enige controle dit kan leiden tot heel veel kopieën van uw werknemer script draait.

Mijn besluit was om te gaan met cron, die start een shell script iedere 10 minutes. Mijn shell script voert de volgende taken:

  1. Hier krijg je een lijst met processen en grep dit voor 'php'. Indien niet gevonden ga dan verder.
  2. Bel uw job-code, in mijn geval zou dit op basis van wat PHP
  3. Werknemer script voltooid zijn run
  4. Klaar om weer op de eerstvolgende oproep

Mijn bash script ziet er ongeveer als volgt uit:

  #! / Bin / sh
 Als ps ax | grep-v grep | grep php> / dev / null
 dan
     echo "Job is op dit moment verwerkt, afslag"
 anders
     echo "Job niet wordt uitgevoerd, nu beginnen"
     php yourJobProcessingScript.php
 fi 

Let op: de echo's zijn bijna volledig zinloos, maar kan de volgende persoon, die komt langs om te proberen en te bewerken hen te helpen.

Dat concludeert de opzet van de werknemer virtuele machine, snel, eenvoudig en gemakkelijk te kopiëren naar elk nieuw stuk hardware die wordt ontvangen. De 'slimheid' van het net is niet echt in de gevisualiseerde OS, zijn alle te maken met de code het leven geroepen om banen, de baan configuratie, en in ervoor te zorgen dat het werk wordt uitgevoerd indien van toepassing (dwz wanneer de host is niet actief proces ).

Het instellen van Windows voor werknemers initialiseren

De eerste taak is om samen de opdracht uit die nodig om de virtuele machine te lopen vanaf de windows command line. Als u hebt geïnstalleerd VirtualBox in de standaard locatie en je hebt de naam van uw werknemer GridMachine vervolgens de opdracht nodig is om te laden van uw werknemer:

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

Maar om het script uit te voeren in een 'headless' staat moeten we gebruiken:

  "C: \ Program Files \ zon \ VirtualBox \ VBoxHeadless.exe"-startvm GridMachine - vrdp = off 

Dit start de virtuele machine zonder dat de GUI en laat het elegant op te slaan staat. Het tweede argument gaat uit RDP, zodat het niet in strijd is met ramen RDP, of geven u een bericht over het luisteren op poort 3389. De virtuele machine is hoofdlettergevoelig!

Vervolgens moeten we naar windows opgezet om kick-off onze werknemer VM nadat de machine is inactief is. Om dit te doen (op Windows XP) je nodig hebt om te gaan Start -> Alle Programma's -> Bureau-accessoires -> Systeemwerkset -> Geplande taken, zoals hieronder:

geplande taken

Klik vervolgens op 'nieuwe taak toevoegen', gevolgd door bladeren naar een aangepast programma toe te voegen. Navigeer naar uw VBoxManage script en klik op ok. Plan uw taak voor een van de opties (we zullen deze verandering in een minuut) en ga verder. Na het overslaan van het volgende scherm zal Windows je vragen wie je deze taak wilt uitvoeren, zou ik stel voor ofwel 'Administrator' of het creëren van een nieuwe bevoorrechte gebruiker. Denk eraan dat we willen niet met de standaard personeel account op de machine interfereren op elk gewenst moment. Klik op Volgende en controle blijkt geavanceerde opties voor deze taak.

Naar het einde van de run tekstvak toe te voegen onze 'startvm GridMachine' string en zorg ervoor dat alleen wordt uitgevoerd wanneer ingelogd wordt gelaten uitgevinkt. Bezoek de planning taak volgende en verander het schema naar beneden vallen om de optie 'als idle', kies de hoeveelheid tijd die u wilt dat de machine inactief worden voordat u naar het volgende tabblad.

Eindelijk de optie uitvinken waarin staat stoppen met de taak als deze is het draaien van X hoeveelheid tijd, maar de optie om de taak te stoppen vinkje als de machine is niet meer actief.

rooster

Dat is het dan voor de Windows host setup!

Overzicht

In dit deel hebben we het opzetten van een virtuele machine op te treden als een werknemer, alsook de manier waarop we bellen en uit te voeren onze taak de verwerking van scripts (voor mezelf een PHP-script). Vanaf hier kijken we hoe het opzetten van onze kopieën van Windows op te starten van de virtuele machine in headless modus wanneer de computer inactief, en sla de staat wanneer de gebruiker hervat gebruik van de machine. Hopelijk op dit punt ben je zien hoe eenvoudig het is om een ​​dergelijk systeem en staan ​​te popelen om nog wat experimenten gaan zelf!

Volgende keer

In deel 4 zullen we kijken naar het gebruik van gereedschap om ervoor te zorgen dat u de meest recente versie van de code en gegevensbronnen draaien zodat de verkregen resultaten zijn altijd up-to-date met de nieuwste zakelijke informatie en logica.

Kantoor Grid Computing met behulp van virtuele omgevingen - Deel 1

Door , vrijdag 04 december 2009 23:23

Introductie

Ik werk in een bedrijf waar lopen we een groot aantal batch-taken die worden verwerkt miljoenen records van de gegevens elke dag en ik heb onlangs na te denken over alle machines die zitten elke dag niets doen voor meerdere uren. Zou het niet goed zijn als we zouden kunnen gebruiken die machines voor de verwerking kracht van onze systemen te versterken? In deze reeks artikelen ga ik kijken naar de potentiële voordelen van het gebruik van een kantoor rooster met behulp van gevirtualiseerde omgevingen.

Als PHP developer ga ik tools die ik gebruik elke dag, namelijk, Linux, gebruik mySQL , PHP, VirtualBox en Subversion (SVN). Maar ik hoop dat deze gids zal aanpassen aan andere talen en technologieën net zo goed.

De oplossing die ik te bieden zal zeer losjes gebaseerd op het type van de verwerking zouden we moeten er echter te bereiken dit kan niet waar zijn door de hele artikel als ik dingen veranderen voor eenvoud, of om meer interessante gebruiksscenario's te produceren.

Deze gevirtualiseerde omgevingen zal draaien op Windows-machines, omdat dit is wat de meerderheid van de kantoren uit te voeren. De verwerking dat de kantoormachines niet mag bemoeien met de medewerkers met behulp van die machines, zou vergen geen onderhoud aan de machine, en gemakkelijk inzetbaar om nieuwe machines als ze beschikbaar zijn. Ook mag nieuwe virtuele machines vereisen geen extra configuratie, omdat dit sterk de schaalbaarheid en het gemak waarmee de grid systeem kan uitgebreid worden vermindert.

Daarom implementeren een Office-Computing Grid?

Ten eerste denk je misschien, waarom niet gewoon gebruik maken van een cloud computing resources, zoals Amazon's EC2-platform ? Nou, de redenen kunnen zijn meerdere, bijvoorbeeld:

  • Je zal niet toevertrouwen bepaalde gegevens aan een cloud computing-omgeving
  • Je kunt niet stellen bepaalde gegevens in een cloud computing omgeving voor juridische redenen (bijvoorbeeld gegevens het verlaten van het land), mogelijk om juridische redenen, bijvoorbeeld NHS records.
  • U wilt bewaren uw processing units te dicht bij en hebben volledige controle over de hardware
  • U niet beschikt over het project middelen om cloud instances draaien
  • Uw kantoor heeft geen verbinding met het internet en dus haar niet mogelijk om een ​​wolk het gebruik van hulpbronnen
  • Je houdt niet van regen, wolken suggereren regen, dus je blijft uit de buurt

Ik weet zeker dat de lijst zou kunnen doorgaan, maar ik denk dat dat genoeg is voor nu.

Voordelen van een Office-Computing Grid

Nou, laat sommige wiskunde (en in echte fysica stijl kunt maken wat vegen aannames). Stel je hebt grote vlezige verwerking server 100 opdrachten per dag draaien. In uw kantoor heb je 50 machines die zijn inactieve 16 uur per dag, elk van deze machines is 10% zo krachtig als je stevige verwerking verbreken. (Alle resultaten zijn hier afgerond op de prestaties te verhogen onderschatten).

Ja, een machine * 10% vermogen * 2 / 3 keer = 0,067 wil zeggen een desktop verwerking in idle time proces 6 volledige banen per dag.

Als u nu schaal dit tot het duurt 15 idle desktops om zoveel mogelijk banen per dag proces als uw belangrijkste verwerking server doet.

Dus in ons alsof kantoor van 50 machines die wij kunnen verhogen onze processing power van een server tot en met 4 volledige verwerking van servers, of we kunnen de verwerking van 400 arbeidsplaatsen per dag in plaats van 100.

Merk op, want geen investeringen in nieuwe hardware van uw bedrijf heeft zojuist verhoogde zijn batch processing capaciteit 4 keer! Potentieel je gaat om uw stroomverbruik te verhogen, maar de meeste kantooromgevingen Ik ben al naar machines zijn over het algemeen links op 's nachts toch, dus je kon zien dit als een groen initiatief.

Andere voordelen ook betekenen dat de investeringen in nieuwe (of aangepast) verwerking servers kan worden vertraagd als je kantoormachines toereikend zijn en dat als je het verbeteren van de kracht van uw kantoormachines uw kantoor net wordt krachtiger automatisch.

Technologieën

Wat u nodig hebt? (Of beter gezegd wat heb ik gebruik):

  • Idle kantoormachines (in mijn geval een reserve oude Windows XP laptop)
  • VirtualBox (of een andere virtualisatie client-software)
  • Een virtuele machine met PHP, MySQL running het runnen van een gekapt OS, ik bel mijn slappe deze servers:)
  • Jobs te lopen
  • Job server (kan een andere virtuele machine ergens)

Typische Jobs

De aard van de jobs die dit systeem is ontworpen om te draaien is als volgt:

  • Systeem ontvangt een lijst met gegevens waarop we nodig hebben om match en terug te keren resultaten
  • Matching houdt in het controleren van / zoeken verschillende (vrij statisch) gegevensbronnen
  • Resultaten van gegevensbronnen kan verdere validatie, samenvoegen, de controle van aanvullende gegevens bronnen in reactie op de resultaten
  • Data is terug met overeenkomende records, volledig gevalideerd en verwerkt
  • Elke record in een baan is onafhankelijk van de rest

Dus eigenlijk zijn we op zoek bij het runnen van banen die een mengsel van database lookups en sommige aantal het kraken, een vrij typisch scenario in een zakelijke omgeving vereisen.

Grid-oplossingen zijn niet alleen voordelig zijn voor de verwerking van banen van dit type. In principe kan iedere methode die kan worden opgesplitst in zelfstandige eenheden worden uitgevoerd in parallel. Zie deze wikipedia voor voorbeelden en meer informatie: Grid Computing , maar een paar van de bekendste voorbeelden zijn Seti @ Home en BIONC . Er zijn kaders voor het uitvoeren van computer-grids, en deze zijn zeker de moeite waard op zoek naar.

Wat gaan we bereiken?

Tegen het einde van deze artikelen hoop ik aan te tonen dat de implementatie van een kantoor netwerk niet hoeft te worden enorm duur of tijdrovend. Ik ga om te bespreken:

  • Het opzetten van de baan controlesysteem, job configuratie
  • Het creëren van een juiste verwerking ervan virtuele machine
  • Hoe het systeem instellen op een windows machine
  • Zorgen voor je de laatste code en de gegevens met behulp van
  • Implementatie en benchmarking
  • Vooruit te kijken

Ik zal bouwen (ok ik gebouwd, toen schreef), een voorbeeld aanvraag in bij de concepten testen op een lokale machine met Windows XP en mijn 'GridMachine' virtuele machine. Mijn job control server zal mijn grootste machine die draait worden Fedora 11 .

Dit is op geen enkele manier bedoeld om een ​​volledig werkend robuust systeem te tonen, zijn betekende meer van een demonstratie en het bespreken waaruit blijkt dat deze dingen kunnen worden bereikt in een redelijk korte tijd en tegen weinig kosten. Aarzel niet om mij eventuele opmerkingen, correcties of verbeteringen en ik zal mijn best doen om dit artikel aan te passen bijgewerkt te houden.

Volgende keer

In deel 2 zal ik beginnen door te kijken naar het werk controlesysteem, en kijk hoe banen moeten worden geconfigureerd om de grootste hoeveelheid van de verwerking te bereiken tegelijkertijd voor te zorgen dat elke opdracht wordt verwerkt zonder mankeren.

Kantoor Grid Computing met behulp van virtuele omgevingen - Deel 2

Door , vrijdag 04 december 2009 23:23

Introductie

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

If you're going to be running jobs then you're going to need some way to manage them. Your job control system (on your job server) needs to be really well thought out before even attempting to run an office grid. So firstly, what are the tasks for a job control system:

  • Hand out jobs upon request from workers
  • 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

The system also needs to be extensible, a solution that works for now in a single case may be extended to run several types of jobs as the business sees the worth in a grid solution. 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

We're going to need somewhere to control our jobs from, this should be the only system in your grid that has a fixed resource locator, be that an IP address, host name, URL (using internal DNS), etc. This is because the workers need to know where to look for jobs, workers need to find the job control system (not the job control system find the workers).

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. How these parts (such as 'hand out jobs') are defined can be very basic. Later on we can extend the system to include an administration interface to add, edit, delete, suspend jobs but this is beyond this exercise.

There is no reason whatsoever then that your job server could not be a virtual machine running within your main processing server provided it doesn't drain too many resources from it. 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.

Basic Setup

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 werkelijkheid zal er geen een ideale configuratie voor uw netwerk setup, veel hangt af van de beschikbare middelen, soorten werk, job doorlooptijd vereisten, netwerk mogelijkheden, en zo verder. Maar een aantal richtlijnen zou zijn:

  • Grootte opdrachten zo, dat elke werknemer kan krijgen door minimaal 3-4 banen in een periode van 15 uur (de langste waarschijnlijk idle time periode)
  • Speel met de opdracht grootte zodat setup-tijd wordt relatief onbelangrijk vergeleken met de verwerkingstijd (rekening houdend met het vorige punt).
  • Als een opdracht niet volledig in het dubbele van de hoeveelheid tijd (misschien minder) je verwachten dat het voltooien ervan uitgaan dat haar verdwenen AWOL en begint de verwerking van het met een andere werknemer. Dit betekent dat u moet wachten tot drie keer de normale lengte van een baan voor het in te vullen (eventueel langer indien de latere job mislukt). U kunt deze tijd te verminderen, maar wees voorzichtig niet te verminderen te veel als je kan beginnen dupliceren de verwerking van taken op een regelmatige basis te zijn.
  • Jobs moet onafhankelijk zijn van externe eisen zo veel mogelijk. De baan server, bijvoorbeeld, mogen alleen worden gecontacteerd aan het begin en einde van elke baan.
  • Niet verzadigen uw netwerk, dit zal twee negatieve gevolgen zal hebben, zal je overdag personeel te vinden met behulp van het netwerk frustrerend en problemen kunnen worden ervaren met aansluitingen time-out een probleem dat alleen maar erger wordt als je schaal van je raster.
  • Zorg ervoor dat taken kunnen uitvoeren op uw werknemers. Als taken worden te geheugen intensieve of schijfruimte intensieve taken start afbreken en het enige wat je zal opvallen is een daling in het aantal banen verwerkt met geen echte reden waarom.

Overleggen van de resultaten van een baan

Bij het indienen van de resultaten van een baan is het belangrijk om te controleren of geen resultaten zijn ingediend door een andere werknemer, zeker als de huidige werknemer slapende al enige tijd.

Wanneer de resultaten worden ingediend ervoor te zorgen dat het aantal resultaten van het aantal records wedstrijden binnen de baan.

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.

Overzicht

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.

Next time

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

Office Grid Computing using Virtual environments – Part 5

By , Friday 4th December 2009 11:03 pm

Introductie

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. So,

  • 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.

Deployment

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.













Panorama Thema door Themocracy

13 visitors online now
9 guests, 4 bots, 0 members
Max bezoekers vandaag: 13 om 0:22 GMT
Deze maand: 35 op 09-07-2011 04:27 GMT
Dit jaar: 130 op 28-03-2011 22:40 GMT
All time: 130 op 28-03-2011 22:40 GMT