Warning: fopen(/homepages/30/d192847469/htdocs/evilprofessor.co.uk/public_html/wp-content/gt-cache/da/_da_page_2) [function.fopen]: failed to open stream: Disk quota exceeded in /homepages/30/d192847469/htdocs/evilprofessor.co.uk/public_html/wp-content/plugins/global-translator/translator.php on line 1183

Warning: flock() expects parameter 1 to be resource, boolean given in /homepages/30/d192847469/htdocs/evilprofessor.co.uk/public_html/wp-content/plugins/global-translator/translator.php on line 1184

Warning: fwrite(): supplied argument is not a valid stream resource in /homepages/30/d192847469/htdocs/evilprofessor.co.uk/public_html/wp-content/plugins/global-translator/translator.php on line 1188

Warning: fclose(): supplied argument is not a valid stream resource in /homepages/30/d192847469/htdocs/evilprofessor.co.uk/public_html/wp-content/plugins/global-translator/translator.php on line 1190
Evilprofessor.co.uk

Dynamisk tilføje sider til Zend_Navigation container ved runtime

Ved , Torsdag 7 Januar 2010 22:50

I en fortsættelse på mit sidste indlæg om Zend_Navigation og Route anmodninger om sitemap.xml til brugerdefinerede controller / handling , er dette indlæg om dymnamically tilføje sider til en Zend_Navigation container ved runtime / script udførelse.

Det alt sammen meget godt at angive dine sider i en ini-eller xml- fil, men på et tidspunkt du vil have skiftende sider på dit websted, du vil som en del af en menu, sitemap, eller til at blive inkluderet i din breadcrumb trail. Derfor, hvad vi skal gøre er at tilføje sider til vores Zend_Navigation beholder runtime. Eksempler på dette ville være i at tilføje nyheder, blogindlæg, eller side kommentarer osv.

Fortsæt læsning 'Dynamisk tilføje sider til Zend_Navigation beholder ved runtime' »

Rute anmodninger om sitemap.xml til custom controller / action

Ved , Onsdag d. 6. januar 2010 12:13 am

For at direkte anmodninger om / sitemap.xml til en brugerdefineret controller og handling i din Zend Framework ansøgning blot tilføje følgende i din application.ini eller alternative config file (fx jeg bruger navigation.ini):

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

Eksempel kode for udsende kan ses ved at skabe en handling i den relevante registeransvarlige (f.eks mit sitemap ligger i indekset controller, sitemap handling):

 < php
 klasse IndexController
     udvider Zend_Controller_Action
 {
     / **
      * Gør en oversigt baseret på Zend_Navigation opsætning
      * /
     offentlig funktion sitemapAction ()
     {
    	 echo $ this-> Vis-> navigation () -> oversigt ();
    	 $ This-> Vis-> layout () -> disableLayout ();
    	 $ This-> _helper-> viewRenderer-> setNoRender (true);
     }
 }

Sitemaps kan hurtigt og nemt kan genereres ved hjælp af Zend_Navigation , en stor hurtig tutorial (og generelt meget nyttigt for Zend Framework tutorials) er Zend afstøbninger - Dynamisk skabe en menu, et sitemap og rasp .

Zend Framework Per-modul baseret indstillinger

Ved , fredag ​​1 Januar 2010 22:40

Jeg har oprettet en opfølgning på dette indlæg, som kræver mindre konfiguration, se Modul baseret layout - Zend Framework .

Når du bruger Zend Framework med moduler, dets indlysende, at hvis du kører forskellige (sub) sites fra samme program, du ikke nødvendigvis have de samme layout scripts for hver del. Jeg besluttede at gå med følgende websted struktur:

  / Anvendelse
     / Controllere
         ...
     / Modeller
     / Moduler
         / Default
             / Controllere
             / Layout
                 / Scripts
             / Visninger
                 / Scripts
         / AnotherModule
             ...
     / Scripts

Problemet var at oprette layout scripts på en per-modul basis. Svaret kom igennem ved hjælp af en handlingsplan Helper. Opsætning af layout på en per-modul grundlag omfatter tre trin:

  1. Application.ini (eller lignende konfiguration setup):
      admin.resources.layout.layoutPath = APPLICATION_PATH "/ modules / admin / layout / scripts"
     default.resources.layout.layoutPath = APPLICATION_PATH "/ moduler / default / layout / scripts"
     member.resources.layout.layoutPath = APPLICATION_PATH "/ modules / Medlem / layout / scripts"
     affiliate.resources.layout.layoutPath = APPLICATION_PATH "/ modules / affiliate / layout / scripts" 
  2. Opret din handling Helper:
      <? Php
     / **
      * Indstiller layout sti på en per-modul grundlag
      *
      * @ Forfatter Lloyd Watkin <lloyd@evilprofessor.co.uk>
      * @ Siden 2010/01/01
      * /
     klasse Pro_Controller_Action_Helper_SetLayoutPath
         udvider Zend_Controller_Action_Helper_Abstract
     {
         / **
          * Angiver layout sti baseret på modulet
          * /
         offentlig funktion preDispatch ()
         {
        	 $ Modul = $ this-> GetRequest () -> getModuleName ();
    
    	     if ($ bootstrap = $ this-> getActionController ()
    	                        -> GetInvokeArg ('bootstrap')) {
    
    	         $ Config = $ bootstrap-> getOptions ();
    
    	         if (isset ($ config [$ modul] ['ressourcer'] ['layout'] ['layoutPath'])) {
    	             $ LayoutPath =
    	                  $ Config [$ modul] ['ressourcer'] ['layout'] ['layoutPath'];
    	             $ This-> getActionController ()
    	                  -> GetHelper ('Layout')
    	                  -> SetLayoutPath ($ layoutPath);
    	         }
        	 }
         }
     } 
  3. Og endelig boostrap handlingen hjælperen:
      ...
         / **
          * Indstiller layout scripts på en per-modul grundlag
          * /
         beskyttet funktion _initLayoutHelper ()
    	 {
    	     $ This-> Bootstrap ('frontController');
    	     $ Layout = Zend_Controller_Action_HelperBroker :: addHelper (
    	         nyt Pro_Controller_Action_Helper_SetLayoutPath ());
    	 }
     ... 

Lære: DATETIME standard NU ()

Ved , onsdag 30 december 2009 18:30

Jeg har kæmpet med at oprette en database skema for et nyt Zend Framework projekt. Jeg er hjælp forsøger at bruge Lære ORM til min database modeller. Jeg er nødt til at indstille skema, så det tillod mig at sætte en standard dato og tid til en `datetime` kolonnen, fx når du tilføjer en ny besked får jeg det aktuelle tidsstempel. Efter megen søgende og eksperimenterende jeg fundet løsningen, så jeg deler den.

I dit skema YAML -fil skal du blot gøre følgende:

 Besked:
   actAs:
     Timestampable:
       oprettet:
         navn: created_at
         type: tidsstempel
         format: Ymd H: i: s
       opdateret:
         navn: last_updated
         type: tidsstempel
         format: Ymd H: i: s
   kolonner:
     id:
       type: heltal
       primære: sandt
       autoincrement: sandt
     navn: string (255)
     e-mail: string (300)
     besked: string (2000)

Hvis på den anden side, du ikke ønsker en `updated_at` kolonnen, kan du bruge følgende:

 Besked: actAs: Timestampable: Oprettet: Navn: created_at type: timestamp format: Ymd H: i: s opdateret: handicappede: true kolonner: id: type: integer primære: sandt autoincrement: sande navn: string (255) email: string ( 300) besked: string (2000) 

PHP Design Patterns - Observer Mønster

Ved , tirsdag 29 december 2009 22:02

Jeg har læst Head First Design Patterns for nylig og har besluttet at skrive nogle af de mønstre, som PHP eksempler for min egen fordel. Den første, som jeg har besluttet at kode op, er Observer Pattern . Den formelle definition af Observer Mønster er:

Observatøren mønster (en delmængde af den asynkrone offentliggøre / abonnere mønster ) er en software- design mønster , hvor en genstand , der kaldes emnet, vedligeholder en liste over sine pårørende, kaldet observatører, og meddeler dem automatisk fra nogen stat ændringer, som regel ved at kalde en af deres metoder . Det er hovedsageligt anvendes til at implementere distribuerede hændelseshåndtering systemer.

Som systemer bliver mere løst koblet at sikre, at når en begivenhed sker, alle systemer, der kræver viden om disse opdateringer er informeret. For eksempel, en blog efter at have gemt et indlæg vi måske nødt til at opdatere en søgemaskine (fx Lucene), opdatere vores sitemap, tags, e-mail tegnet brugere osv. observatør mønster giver udviklere mulighed for at tilføje flere lyttere uden at redigere deres observerbare objekt . Ved at indsprøjte observatører (dvs. en søgemaskine opdatering observatør, en sitemap generator, osv.) i et emne (dvs. blogindlæg redigeringssystem) kan vi tillade det at udføre alle de nødvendige opdateringer uden ændringer.

Fortsæt læsning 'PHP Design Patterns - Observatør Mønster' »

Office Grid Computing ved hjælp af virtuelle miljøer - Del 4

Ved , fredag ​​4 december, 2009 11:59

Indledning

Jeg arbejder i en virksomhed, hvor vi kører mange batchjob forarbejdning af millioner af optegnelser over data hver dag, og jeg har tænkt for nylig om alle de maskiner, der sidder rundt om hver dag at gøre noget i flere timer. Ville det ikke være godt, hvis vi kunne bruge disse maskiner til at styrke regnekraft af vores systemer? I dette sæt af artikler jeg har tænkt mig at se på de potentielle fordele ved at ansætte et kontor gitter ved hjælp af virtualiserede miljøer.

I del 3 har vi skabt vores virtuelle forarbejdning maskine og oprette Windows-maskiner for at blive ledig-fuldtidsansatte.

Kørsel den seneste kode

Uundgåeligt efter oprettelsen af din arbejdere forretningslogik vil ændre sig, vil fejl blive fundet, vil hurtigere, mere effektiv kode, være produceret således at forlade dine medarbejdere sad omkring behandlingen af data ved hjælp af gamle ildelugtende koden . Hvordan så sikrer vi, at vi altid bruger den nyeste og bedste version af vores behandling scripts?

Der er et par meget nemme enkle måder, hvorpå vi kunne gøre dette, det trick er dog at reducere behandlingstiden magt og netværkstrafik i at opnå dette. Lad os starte med den enkleste af løsninger og forbedre den langsomt over et par iterationer.

Den første metode ville være simpelthen at oprette forbindelse til vores job-kontrol-server (via samba, FTP, eller lignende) og træk ned den nyeste version af koden. Ikke meget effektiv, men det vil gøre arbejdet. Lad os forbedre, at noget, hvordan om at skabe et rsync script og bruge, at hver gang i stedet? Alternativt hvad med at sætte vores nyeste behandling script til undergravende virksomhed tjekker koden i første omgang og så bare opdatere vores kode på hver kørsel ( svn update )?

I sidste ende kunne vi ende op med et bash script (kaldes af cron hver 10 minutter), der ser lige så simpelt som dette:

  #! / Bin / sh
 hvis ps ax | grep-v grep | grep php > / dev / null
 Derefter
     echo "Job i øjeblikket behandling, frakørsel"
 andet
     echo "Job kører ikke, skal du starte nu"
     cd / sti / til / arbejde / kopi
     svn update
     php yourJobProcessingScript.php
 fi 

Nu kan vi være sikre på, at med hver kørsel vi helt sikkert kører den seneste kode. Vi sikrer dette ved at opdatere vores kodebase hver gang vi udfører en løbetur og reducere netværkstrafikken ved kun at overføre filen forskelle på tværs af vores netværk.

I min demonstration setup, gjorde jeg præcis som ovenfor. Subversion blev installeret på mit arbejde behandling server, og jeg simpelthen trak den seneste kode fra en »arbejdstager« gren ved hjælp af 'svn update'. Jeg har også tilføjet en versionsnummer mærke til min behandling script, som blev returneret til databasen som en del af resultaterne afkast. På denne måde kunne jeg se, at min kode var ved at blive opdateret hver gang jeg kopieret min kuffert ind arbejdstageren gren, dvs at jeg absolut var kører den nyeste behandling scriptet.

Ved hjælp af de seneste data

Hvis dit job behandling gør brug af datakilder og derefter på et tidspunkt disse vil blive opdateret. Medmindre du kalder dine datakilder på en meget sjælden grundlag du vil oversvømme netværket med trafik, så snart dine medarbejdere begynde at køre bringe alting i stå. For min løsning, besluttede jeg, at jeg gerne vil flytte mine datakilder rundt med mine VM'er.

Hold du er heste der! Hvad hvis mine datakilder er enormt? Nå dette virkelig er tale om, hvor meget data vi taler? Det kan være mere omkostningseffektivt at installere en ekstra større harddisk i hver maskine end at købe en ekstra bearbejdning server. Dette er et spørgsmål om budget og er op til virksomheden at beslutte. Det måske, at dine datakilder er så store, at det bare umuligt at holde den mængde af data i dine arbejdstager maskiner. I så fald hvad ville du gøre? Nå vi kunne se på at kalde en lokal data server, men dette kan forårsage problemer med netværket. I dette tilfælde et gitter system som dette kan blive urealistisk at medtage i dit kontormiljø. Det kan også være, at du kan se på alternative kører strategier, for eksempel kun at ringe til dine medarbejdere fra 20:00 til 06:00 hver aften og / eller neddrosling datakilden anmodninger.

Flytning på lad os sige vores datakilder mængde til 100 GB data. Nå ja det er en hel del data for at bevæge sig rundt i netværket på en opdatering. Hvordan vil vi sikre, at vi har den seneste kopi af de data, i dette tilfælde? Rsync er en mulighed, men personligt synes jeg ved at køre dit seneste datakilde på dit job behandling server og sætte det op som en mester i replikation (med en dejlig lang bin log) kan være vejen at gå:

replikation Ved at sætte hver af dine medarbejdere op som en slave til de ledige styre serveren opdateringer til dine datakilder vil sive ned pænt til dine medarbejdere uden en enorm stigning i netværk, aktivitet (dvs. medmindre du udfører en kæmpe data opdatering og alle dine medarbejdere spark i på en gang). Dette har fordele i forhold til rsync i, ​​at du ikke ville få en lang pause før hvert job, som database opdateringer, mysql vil dæmonen på din arbejdstager løbende opdatere sine data, mens behandlingen fortsætter.

Dette er hvordan jeg oprette min demonstration server. For at opsætte replikation Jeg fulgte vejledningen på mySQL stedet ( Opsætning replikation ) og inden for 20 minutter havde jeg min inital arbejdstager kopiere jobbet kontrol servere datasæt. For hver ekstra arbejdstager for replikering indstillinger og processer arbejdede hver gang VM blev kopieret.

Oversigt

I dette afsnit af artiklen har vi set på, hvor nemt og smertefrit det er at holde din behandling koden ajour ved using rsync eller subverion (SVN) til at gøre arbejdet og reducere netværkstrafikken på samme time. Vi har også diskuteret, hvordan at holde dine oplysninger om datakilden up-to-date ved at lade den sive ned til hver af dine medarbejdere. Således kan vi område at sikre, at vi holder op med forretningslogik og information på vores kontor skinnesystem. Der vil naturligvis være utallige alternativer til at udføre disse opgaver, men her var to simple eksempler at vise, hvor let en løsning er at komme forbi.

Næste gang

I den sidste del af denne serie, rammende opkaldt kapitel 5 , vil vi drøfte implementering af dette system for. Jeg vil sammenfatte, hvad der er lært, og hvad jeg formåede at skabe.

Office Grid Computing ved hjælp af virtuelle miljøer - Del 3

Ved , fredag ​​4 december, 2009 23:37

Indledning

Jeg arbejder i en virksomhed, hvor vi kører mange batchjob forarbejdning af millioner af optegnelser over data hver dag, og jeg har tænkt for nylig om alle de maskiner, der sidder rundt om hver dag at gøre noget i flere timer. Ville det ikke være godt, hvis vi kunne bruge disse maskiner til at styrke regnekraft af vores systemer? I dette sæt af artikler jeg har tænkt mig at se på de potentielle fordele ved at ansætte et kontor gitter ved hjælp af virtualiserede miljøer.

I del 2 så vi på de job, en server vil køre, og hvordan opgaver skal konfigureres for at opnå størst mængde af behandling og samtidig sikre, at hvert job behandles uden at mislykkes.

Opsætning af arbejdstager - eller Limp server

Det næste skridt i processen er at oprette dine virtuelle medarbejdere. Til dette har jeg tænkt mig at bruge en installation af CentOS med VirtualBox. Jeg har tænkt mig at installere mySQL og PHP på serveren, også kendt som en Limp (Li Nux, m ySQL, P HP) Servera (jeg kan have gjort det navn op).

  • Installer VirtualBox på din Windows-maskine (følg link)
  • Hent og installer CentOS (nuværende version 5.3) inden for en oprettet virtuel maskine

Der er ingen mening mig komme til dette er der nok 1.000 's store tutorials derude (ok, her er en: Oprettelse og Managing CentOS virtuel maskine under VirtualBox ). Det vigtige punkt at bemærke Jeg formoder, er, at jeg ringede til min virtuelle maskine GridMachine.

For så vidt angår mine valg af virtualisering klient og operativsystem gå er der ikke stor overbevisende begrundelse for hvert valg. VirtualBox er noget, jeg bruger på min hjemme maskine og støttes af de tre store operativsystemer. Jeg valgte CentOS som det er en god stabil OS, og jeg bruger det på min egen webserver. Jeg er en stor tilhænger af de rigtige værktøjer til opgaven (selvom jeg anvender 'bruger den hurtigste og nemmeste for dig "-mentalitet her), så hvis operativsystem X kører din kode hurtigere og mere effektivt bruge det i stedet :)

Vigtigt at sikre, at din VM bruger DHCP, ellers for hver ny virtuel maskine vil skulle konfigureres separat, som er noget, vi ikke want.By bruger DHCP vi behøver ikke at konfigurere netværksindstillinger individuelt for arbejdstager maskiner, vil DHCP uddele ud IP'er for dig. Derfor kan du kopiere din virtuelle maskine om kontoret uden at bekymre sig om opsætning hver enkelt op (dette forbedrer skalerbarhed og reducerer arbejdstager administration).

Processen du bør sigte på at opnå ville være at få en ny fysisk maskine, installere VirtualBox, og derefter stort set anvende det virtuelle billede uden meget andet. Det kan være klogt at sætte alle dine medarbejdere på et andet subnet, så du i det mindste kan se, hvor mange maskiner kører. Du skal også oprette dine maskiner på en lang lejekontrakt eller ubegrænset leje DHCP.

Sådan køres job på arbejdstageren

Dette er et interessant område, og der er flere gyldige metoder til behandling af arbejdspladser på arbejdstageren. Her vil jeg blot diskutere de to mest oplagte:

  • Bestandigt at køre script: Et script, det være sig en shell script, eller et PHP script udføres en gang på arbejdstageren og kører som en del af en uendelig løkke. Jeg har diskonteret denne metode som et brag af manuskriptet og potentielt dine medarbejdere vil ophøre med at køre uden en eller anden form for intervention.
  • Cron baseret script udførelse: Hvert X minutter cron dæmonen starter et opkald til din script for at få tingene i gang. Uden en vis kontrol dette kan føre til mange mange kopier af din arbejdstager script løb.

Min beslutning var at gå med cron, som starter en shell script hver 10 minutes. Min shell script udfører følgende opgaver:

  1. Få en proces liste og grep dette for 'php'. Hvis den ikke findes derefter fortsætte.
  2. Ring til dit job kode, i mit tilfælde ville det være noget PHP baseret
  3. Worker script fuldfører run
  4. Klar til at gå igen på den næste relevante opkald

Min bash script ser noget i retning af følgende:

  #! / Bin / sh
 hvis ps ax | grep-v grep | grep php> / dev / null
 Derefter
     echo "Job i øjeblikket behandling, frakørsel"
 andet
     echo "Job kører ikke, skal du starte nu"
     php yourJobProcessingScript.php
 fi 

Bemærk: ECHO er næsten helt meningsløst, men kan hjælpe den næste person, der kommer sammen til at prøve og redigere dem.

Det konkluderer opsætningen af ​​arbejdstageren virtuelle maskine, hurtig, enkel og let at kopiere til hver ny stykke hardware, der er modtaget. Den 'dygtighed' af elnettet er virkelig ikke i visualiseret OS, det hele at gøre med den kode, der oprettes til at behandle job, jobbet konfiguration, og i at sikre, at jobbet kører når det er relevant (dvs. når værten er ledig ).

Opsætning af Windows for at initialisere Workers

Den første opgave er at arbejde ud kommando kræves for at køre den virtuelle maskine fra vinduerne kommandolinjen. Hvis du har installeret VirtualBox på standardplaceringen, og du har navngivet din arbejdstager GridMachine derefter kommandoen kræves for at indlæse din arbejdstager er:

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

Men at køre script i en "hovedløs" tilstand, som vi er nødt til at bruge:

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

Dette vil starte den virtuelle maskine uden GUI og gør det muligt at spare staten elegant. Det andet argument slukker RDP, så det ikke strider med Windows RDP, eller give dig en besked om at lytte på port 3389. Den virtuelle maskine navn er store og små bogstaver!

Dernæst vil vi nødt til at sætte vinduer på op til kick off vores arbejdstager VM, når maskinen har været inaktiv. For at gøre dette (på Windows XP) du nødt til at gå Start -> Alle Programmer -> Tilbehør -> Systemværktøjer -> Planlagte Opgaver som nedenfor:

planlagte opgaver

Klik derefter på 'Tilføj Scheduled Task' efterfulgt af søge at tilføje et brugerdefineret program. Naviger til din VBoxManage script og klik ok. Planlæg din opgave for nogen af ​​de muligheder (vi vil ændre dette i et minut), og fortsætter. Efter springe det næste skærmbillede vinduer vil spørge dig, hvem du vil køre denne opgave, ville jeg foreslå enten 'Administrator' eller oprette en ny privilegeret bruger. Husk at vi ikke ønsker at blande sig med den standard personalet konto på maskinen på noget tidspunkt. Klik på Næste, og kontroller viser avancerede indstillinger for denne opgave.

Til slutningen af kørslen tekstfeltet tilføje vores 'startvm GridMachine' streng og sikre, at køre først når du er logget på er tilbage unticked. Besøg tidsplanen opgaven næste og ændre tidsplanen falde ned til punktet 'når de er ledige ", vælge den mængde tid, du gerne vil maskinen til at være inaktiv, før man går videre til den næste fane.

Endelig fjern markeringen den mulighed, der hedder stoppe opgave, hvis den har kørt X mængden af ​​tid, men sætter kryds mulighed for at stoppe opgaven, hvis maskinen ikke længere er ledig.

planlægge

Det er det da for Windows host setup!

Oversigt

I denne del har vi oprettet en virtuel maskine til at fungere som en arbejdstager, såvel som den måde, hvorpå vi kalder og udføre vores job behandling scripts (for mig selv et PHP script). Herfra ser vi på, hvordan du opsætter vores kopier af Windows for at starte op den virtuelle maskine i hovedløs tilstand, når computeren bliver ledig, og gem den tilstand, når brugeren genoptager brugen af ​​maskinen. Forhåbentlig på dette punkt, du ser, hvor nemt det er at oprette et sådant system, og er kløe at få nogle eksperimenter i gang selv!

Næste gang

I del 4 vil vi se på ved hjælp af værktøjer til at sikre, at du kører den seneste version af kode og data kilder, så resultaterne altid er up-to-date med de nyeste forretningsoplysninger og logik.

Office Grid Computing ved hjælp af virtuelle miljøer - Del 1

Ved , fredag ​​4 december, 2009 11:23

Indledning

Jeg arbejder i en virksomhed, hvor vi kører mange batchjob forarbejdning af millioner af optegnelser over data hver dag, og jeg har tænkt for nylig om alle de maskiner, der sidder rundt om hver dag at gøre noget i flere timer. Ville det ikke være godt, hvis vi kunne bruge disse maskiner til at styrke regnekraft af vores systemer? I dette sæt af artikler jeg har tænkt mig at se på de potentielle fordele ved at ansætte et kontor gitter ved hjælp af virtualiserede miljøer.

Som en PHP udvikler jeg har tænkt mig at bruge værktøjer som jeg bruger hver dag, nemlig, Linux, MySQL , PHP, VirtualBox og undergravende virksomhed (SVN). Men jeg håber, at denne guide vil tilpasse sig andre sprog og teknologier lige så godt.

Løsningen jeg give vil være meget løst baseret på den type behandling, vi havde behov for at opnå men det kan ikke være rigtigt gennem hele artiklen, som jeg vil ændre tingene til enkelhed, eller til at producere mere interessante scenarier.

Disse virtualiserede miljøer vil køre på Windows maskiner, da dette er hvad de fleste kontorer køre. Behandlingen, at kontormaskiner gør bør ikke interferere med personalet ved hjælp af disse maskiner, bør kræve, ingen vedligeholdelse på maskinen, og være let indsættes til nye maskiner, som de bliver tilgængelige. Desuden bør nye virtuelle maskiner ikke kræver yderligere konfiguration, da dette reducerer skalerbarhed og brugervenlighed, hvor elnettet kan udvides.

Hvorfor installere en Office Computing Grid?

For det første, du kan tænke, hvorfor ikke bare bruge en cloud computing ressource såsom Amazons EC2-platform ? Nå grundene kunne være flere, for eksempel:

  • Du vil ikke overdrage visse data til en cloud computing miljø
  • Du kan ikke sætte bestemte data i en cloud computing miljø for juridiske årsager (f.eks data forlader landet), potentielt juridiske grunde, f.eks NHS optegnelser.
  • Du ønsker at holde dine behandlingsenheder tæt og have fuld kontrol over hardware også
  • Du behøver ikke projektmidlerne til at køre cloud-tilfælde
  • Dit kontor har ikke forbindelse til internettet, og derfor det er ikke muligt at bruge en sky ressource
  • Du kan ikke lide regn, skyer tyder regn, derfor skal du holde sig langt væk

Jeg er sikker på listen kunne fortsætte, men jeg tror, ​​det er nok for nu.

Fordele ved et Office Computing Grid

Nå, lad os gøre nogle matematik (og i ægte fysik stil lader foretage nogle fejende antagelser). Forestil dig at du har stor velnæret behandling server, der kører 100 arbejdspladser om dagen. I dit kontor du har 50 maskiner, som er inaktiv 16 timer i døgnet, hver af disse maskiner er 10% så stærk som din velnæret behandling sever. (Alle resultater her er afrundet til at undervurdere højere ydeevne).

Så 1 maskine * 10% strøm * 2/3 tid = 0,067 dvs 1 desktop behandling i tomgang tid kunne behandle 6 fulde opgaver per dag.

Hvis du nu skalere det op, det tager 15 ledige desktops til at behandle så mange arbejdspladser pr dag som din primære behandling server gør.

Så i vores foregive kontor på 50 maskiner, kunne vi øge vores processorkraft fra 1 server op til 4 fulde behandling servere, eller vi kunne behandle 400 arbejdspladser om dagen i stedet for 100.

Bemærk, for ingen investering i ny hardware din virksomhed har netop øget sin batchbehandling kapacitet 4 gange! Potentielt du vil øge din strømforbrug, men de fleste kontormiljøer jeg har været til maskiner generelt tilbage på natten alligevel, så man kunne se dette som en grøn initiativ.

Andre fordele også betyde, at investeringer i nye (eller opdateret) behandling servere kan blive forsinket, hvis dine kontormaskiner er tilstrækkelige, og at, som du forbedre styrken i dine kontormaskiner dit kontor nettet bliver mere kraftfuld automatisk.

Technologies

Hvad du har brug for? (Eller mere korrekt, hvad gjorde jeg bruger):

  • Idle kontormaskiner (i mit tilfælde et ekstra gamle Windows XP laptop)
  • VirtualBox (eller en anden virtualiserings-klient-software)
  • En virtuel maskine med PHP, MySQL running kører en skære ned OS, jeg ringer disse mine Limp servere :)
  • Jobs til at køre
  • Job server (kan være en anden virtuel maskine eller andet sted)

Typiske Jobs

De typer af job, at dette system er designet til at køre, er som følger:

  • System modtager en liste over data, som vi er nødt til at matche og returnere resultater
  • Matchende indebærer kontrol / søge flere (forholdsvis statisk) datakilder
  • Resultater fra datakilder kan kræve yderligere validering, sammenlægning, kontrol af yderligere datakilder i reaktion på resultaterne
  • Data returneres med matchende poster, fuldt valideret og bearbejdet
  • Hver post i et job er uafhængig af resten

Så dybest set vi ser på kører job, der kræver en blanding af database-opslag, og nogle talknusning, en ret typisk scenario i et erhvervsklima.

Grid løsninger er ikke blot fordelagtigt for behandling stillinger af denne type. Dybest set kan enhver proces, som kan opdeles i selvstændige enheder parallelt. Se Wikipedia for eksempler og yderligere information: Grid Computing , men et par berømte eksempler er SETI @ home og BIONC . Der er rammer for at drive it-net, og disse er værd at se på.

Hvad vil vi opnå?

Ved udgangen af ​​disse artikler håber jeg at vise, at indsætte et kontor net ikke behøver at være enormt dyrt eller tidskrævende. Jeg har tænkt mig at diskutere:

  • Opsætning jobbet kontrolsystem, job konfiguration
  • Oprettelse af en passende behandling virtuel maskine
  • Sådan opsætte systemet på en Windows-maskine
  • Sikrer, at du bruger den nyeste kode og data
  • Deployment og benchmarking
  • Ser fremad

Jeg vil være bygning (ok, jeg byggede, så skrev dette) et eksempel på program for at teste de koncepter på en lokal maskine med Windows XP og min 'GridMachine "virtuel maskine. Mit job kontrol server vil være min primære maskine, der kører Fedora 11 .

Dette er på ingen måde beregnet til at demonstrere en fuldt fungerende robust system, dets betød mere for en demonstration og diskutere viser, at disse ting kan opnås en rimelig kort tid og med små omkostninger. Du er velkommen til at sende mig eventuelle kommentarer, rettelser eller forbedringer, og jeg vil gøre mit bedste for at holde denne artikel opdateret til at passe.

Næste gang

I del 2 vil jeg starte med at se på jobbet styresystem, og se, hvordan job skal konfigureres for at opnå størst mængde af behandling og samtidig sikre, at hvert job behandles uden at mislykkes.

Office Grid Computing ved hjælp af virtuelle miljøer - Del 2

Ved , fredag ​​4 december, 2009 11:23

Indledning

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.

Hertil kommer, samtidig med at det viser, hvordan arbejdspladser kan vælges og styres fra en SQL-forespørgsel ramme, du bør virkelig være abstrahere dit job kontrol, så hvis du beslutter at skifte til ved hjælp af en webservice, en fil system, XML , eller enhver anden Antallet af systemer, vil det ikke påvirke den ovenstående kode det.

Job Konfiguration

Det næste aspekt at overveje, er opgavens omfang og konfiguration. Ved at spille med job konfiguration, vi kan skabe en god balance mellem hastighed, proces replikation og pålidelighed. Tag et par OFA scenarier:

  1. Jobs tage 1 dag hver til at køre: Det betyder, at dine medarbejdere skal 15 dage til at behandle hvert job (husk 10% af strømmen til 2/3rds af tiden). Dette er tydeligvis ikke en klog konfiguration, dit job størrelse er alt for stor! Det ville tage mindst dobbelt så lang tid at få et job behandles bør den initiale arbejdstager gå AWOL (tid til at samle op, at det ikke har returneret et resultat plus oparbejdning tid). I en ideel du gerne have mindst en fuld stillingsbeskrivelse let fjernes ved udgangen af hver langside inaktiv periode, den måde du holde job tikker over og i værste fald et job, ville tage to dage at processen bør det første forsvinder.
  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.

Oversigt

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 ved hjælp af virtuelle miljøer - Del 5

By , Friday 4th December 2009 11:03 pm

Indledning

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. Således,

  • 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 Theme by Themocracy

6 visitors online now
5 guests, 1 bots, 0 members
Max besøgende i dag: 12 kl 01:14 am UTC
I denne måned: 18 på 2012/07/05 04:35 UTC
Dette år: 69 kl 27-02-2012 09:56 am UTC
Al tid: 130 kl 28-03-2011 10:40 UTC