Införandet
Jag arbetar i ett företag där vi köra många batchjobb behandla miljontals skivor av data varje dag och jag har funderat nyligen om alla de maskiner som sitter runt varje dag gör ingenting i flera timmar. Skulle det inte vara bra om vi kunde använda dessa maskiner för att stärka processorkraften i våra system? I denna uppsättning artiklar jag kommer att titta på de potentiella fördelarna med att anställa ett kontor galler med virtualiserade miljöer.
I del 1 gav jag en översikt av systemet och teknik jag kommer att använda, liksom diskuterat några av de potentiella orsakerna till varför du skulle vilja skapa ett kontor nätet.
Job Kontroll
Om du ska vara igång jobb då du kommer att behöva något sätt att hantera dem. Ditt jobb styrsystem (på jobbet server) måste vara riktigt väl genomtänkt innan man ens försöker köra ett Office-nätet. Så det första, vad är uppgifter för ett jobb styrsystem:
- Dela ut jobb på begäran från arbetare
- Berätta arbetare vilken typ av jobb för att köra
- Spår jobb
- Se till att jobb bara körs en gång
- Ge jobbdata för arbetstagare, eller åtminstone berätta för dem var att få det
Systemet måste också vara töjbar, en lösning som fungerar för nu i ett enda fall får förlängas för att köra flera olika typer av jobb som verksamheten ser värdet i ett rutnät lösning. Till exempel kan jobb få prioriteringar, mer än ett jobb typ kan finnas (dvs. flera kod baser), så småningom kan du även köra flera olika arbetsdatorer som är optimerade för varje typ av jobb (även om det rör sig bort från de "generiska arbetaren "idé). Försök alltid att tänka på framtiden vid utveckling av system kan ett kortsiktigt visionen att leda till längre sikt frustration och ökad utvecklingstid.
Jobb server
Vi kommer att behöva någonstans att kontrollera våra jobb från bör detta vara det enda i ditt nät som har en fast Resource Locator, vara att en IP-adress, värdnamn, URL (med intern DNS), etc. Detta beror på att arbetarna måste veta var du ska leta efter jobb, arbetare måste hitta system kontroll över arbetet (inte jobbet styrsystemet hitta arbetstagare).
Jobbet själva servern inte riktigt har en komplicerad uppgift (i ett bassystem ändå), måste den lagra en lista med jobb, dela ut jobb, få resultat, och därefter lagra dem för senare hämtning. Hur dessa delar (till exempel "dela ut jobb") definieras kan vara mycket minimalt. Senare kan vi utvidga systemet till att omfatta ett administrationsgränssnitt för att lägga till, redigera, radera, avbryta jobb men det är bortom denna övning.
Det finns ingen anledning som helst så att ditt jobb servern inte kunde vara en virtuell maskin som körs i din huvudsakliga behandlingen servern förutsatt att det inte tömmer för mycket resurser från den. Jobbet server men behöver hög tillgänglighet, om det går ner på en fredag kväll du kommer att förlora en hel helg med behandling, eventuellt kostar dig ett par veckor till ett värde av handläggningstiden (jämfört med din huvudsakliga behandlingen server ensam) . Du kanske vill överväga att sätta ditt jobb-servern på en last balanserad miljö för hög tillgänglighet.
Basic Setup
Den grundläggande inställning för vårt jobb servern kommer att bestå av vad jag kallar en av mina Limp servrar (det vill säga Li Nux, m ySql, P HP). Koden körs på Thea arbetstagarna faktiskt kommer att räkna ut vilka jobb man kan köra genom att interagera med med jobb kontrollsystem databaser. Senare kunde vi skapa en webbtjänst och faktiskt dela ut jobb snarare än att de anställda gör det hårda arbetet själva, men nu ska vi fortsätta att använda KISS principen (Keep it Simple, Stupid!).
Så kan skapa tre mySQL tabeller för att ta itu med jobb. Dessa kommer att vara `jobb`, `jobRecords` och `jobResults kallade.
Här Jag använder SQL Buddy en stor liten alternativ till phpMyAdmin bara för att det är lättare att installera på CentOS (för andra se: 10 Great alternativ till phpMyAdmin )
Denna tabell består av 5 enkla fält,
- id: identifiera jobbet
- namn: Kan vara en kundreferens, eller valfritt antal av andra identifieringsuppgifter
- Status: Du måste veta var jobbet är, t.ex.
- 0: Inte startat
- 1: Hämtade
- 2: Genomförd
- started_by: Vem började göra jobbet? Detta är inte helt nödvändigt men är en trevlig att ha. Jag skulle föreslå spårning arbetare genom deras IP-adress på ditt nätverk
- started_at: När började arbetaren starta jobbet? Genom att spåra jobb som inte har slutföras inom X tid vi vet att vi behöver plocka upp jobbet igen och starta behandling av en annan arbetstagare. Arbetare kunde stoppa behandlingen / go offline för ett antal skäl, strömavbrott, krasch, nätverk förlust, etc.
Det är lätt hur denna tabell kan utökas med ytterligare några områden för att möjliggöra för statistik spårning, en sluttid kolumnen för att se hur lång tid jobbet tog, en räknare för att se hur många arbetare tog upp jobbet (naturligtvis detta behöver tenderar att 1), jobb prioritet, listan kan fortsätta och fortsätta. I mer komplexa jobb scenarier skulle det vara möjligt att ange hur mycket minne arbetstagaren skulle behöva tillgång till (och därför bara använda lämpliga arbetstagare), eller ens vilken typ av arbetstagare skulle krävas.
Låter lägga till några exempel jobb:
Nästa bordet igen är ganska enkel att förstå, dessa är våra jobb register. De är kopplade till den främsta arbeten tabellen genom en kolonn 'jobs_id'. Den utgör i denna tabell beror mycket på de data som du behöver för att leverera till dina anställda, kan göra ett mycket enkelt exempel där vi har fyra kolumner:
- id: ID för posten
- Namn: Person namn
- adress: Person adress
- jobs_id: Jobbet ID som denna post är kopplad till
Den tredje och sista tabell består av en resultattavla, har det mycket samma märke upp som våra register bord, och med tillägg av vissa kolumner kan vara en del av journaler tabellen:
- job_record_id: Länk resultatet till jobbet bordet
- Resultat: Resultatet uppgifter
... Och det är allt du behöver för jobbet kontroll! (Om än på en mycket grundläggande nivå) I mitt fall jag pekade på ett annat bord där mina data till processen ligger, men det kan lika gärna varit en fil, parametrar för att köra simulering kod, you name it.
Välja ett jobb
Som nämnts tidigare kommer de anställda att göra vårt jobb ledningen för oss nu, så allt vi behöver för att verkligen göra är att hitta ett jobb som kräver behandling och få information. Hur skulle vi göra detta? Väl välja våra kriterier jobb urval och söka jobb i SQL gjorde jag följande:
- Vidta de jobb som inte är märkta som fullständig, men från vår arbetstagaren och återställa dem (ersätt __ ME__ med en identifierare skulle enklast IP-adress):
UPPDATERING kallade jobb `SET` status `= 0 där` status `= 1 OCH` started_by `= __ ME__;
- Med våra kriterier jobb, markerar du ett jobb och tala om för styrsystemet att arbetstagaren handlägger:
UPPDATERING kallade jobb `SET` status `= 1,` started_by `= __ ME__,` started_at `= NU () där` status `= 0 eller
(`Status` = 1 OCH `started_at`> DATE_SUB (NU (), INTERVALL X HOUR)) ORDER BY `id` ASC;
Genom att ta tag jobb som inte har återvänt resultat i X tid vi se till att alla jobb körs i händelse av en arbetstagares krascha eller gå AWOL.
- Nästa ta de arbetstillfällen detaljerna följt av posterna själva:
SELECT * FROM `jobb` WHERE `started_by` = __ ME__ GRÄNS 1;
SELECT * FROM `job_records` WHERE `id` = __ JOBID__;
Efter avslutad jobbet vi in våra resultat register och markera jobbet som fullständig. Minns jobb kan avbryta / återuppta som helst utrymme för en viss robusthet i skriptet. Det kan vara att uppgiften skjuter halvvägs genom att uppdatera systemet kontroll över arbetet, så kontrollera antalet poster i ett jobb och antalet resultat sparade tillbaka till jobbet styrsystemet skulle vara ett klokt drag.
Dessutom, medan det visar hur jobb kan väljas och hanteras från en SQL-query ram du borde verkligen vara abstrahera jobbet kontroll så att om du väljer att byta till en webbtjänst, en fil system, XML , eller någon annan antal system kommer det inte att påverka den kod ovanför den.
Job konfiguration
Nästa aspekt att beakta är jobbets storlek och konfiguration. Genom att leka med uppgift konfiguration kan vi hitta en utmärkt balans mellan fart, process replikering och tillförlitlighet. Ta en scenarier par OFA:
- Jobb tar 1 dag i båda för att köra: Detta innebär att dina anställda behöver 15 dagar för att behandla varje jobb (kom ihåg 10% av strömmen till 2/3rds av tiden). Detta är uppenbarligen inte en klok konfiguration är ditt jobb storlek alldeles för stor! Det skulle ta minst dubbelt så lång tid att få ett jobb bearbetas bör den initiala arbetstagaren går AWOL (tid att plocka upp att det inte har återvänt ett resultat plus upparbetning tid). I en idealisk du skulle ha minst en hel jobb lätt bort i slutet av varje lång viloperiod, så du håller jobben tomgång och i värsta fall ett jobb skulle ta två dagar att processen bör den första go saknas.
- Jobb tar 1 minut att köra: Detta innebär att dina anställda tar ungefär 15 minuter att köra varje jobb. Även om detta från början kan verka perfekt får du ytterligare arbete bearbetning under lunchtid, kaffe raster, möten, etc. Detta scenario sätter belastning på andra delar av ditt system och introducerar sina egna problem. Till exempel, för det första din setup / handläggningstiden förhållandet kommer att gå rakt ner, alltså att förlora systemets effektivitet. Nätverket kommer att vara ständigt streaming jobbinformation till de olika arbetarna frustrerande personal som är dong sin dag till dag arbetet. Du kommer också att lägga mer belastning på ditt jobb behandling servern som den har att dela ut massor av små bitar av arbete på regelbunden basis. Slutligen, i denna situation, om ditt jobb servern går ner du kommer att skapa en enorm baksida logg över oavslutat arbete, medan större arbeten kan av fortsatt behandling lyckligt ovetande om att jobbet servern svårigheter.
I verkligheten blir det ingen perfekt konfigurationen för din grid inställning, beror mycket på de tillgängliga resurserna, typ av jobb, jobb handläggningstider krav tid, nätverkskapacitet och så vidare. Men vissa riktlinjer skulle vara:
- Storlek jobb så att varje arbetstagare kan ta sig igenom åtminstone 3-4 jobb i en period av 15 timmar (den längsta sannolikt inaktiv tid)
- Spela med jobbet storlek så att ställtiderna blir ganska obetydlig jämfört med behandlingstiden (med tanke på ovanstående punkt).
- Om en arbetssökande inte komplett i dubbelt så lång tid (kanske mindre) du förväntar att slutföra det anta att gått AWOL och börja bearbeta den med en annan arbetstagare. Det innebär att du kan få vänta upp till tre gånger den normala längden av ett arbete för att slutföra (möjligen längre om den efterföljande arbetet misslyckas). Du kanske vill minska den här gången, men var noga med att inte minska den alltför mycket eftersom du kan börja dubblera bearbetning uppgifter på en regelbunden basis.
- Jobb ska vara oberoende av utomstående krav på så mycket som möjligt. Jobbet server, till exempel, bör endast kontaktas i början och slutet av varje jobb.
- Inte mätta ditt nätverk, kommer detta att få två negativa effekter, kommer din dagtid medarbetare hittar med hjälp av nätet frustrerande och problem kan upplevas med anslutningar tajma ut ett problem som bara kommer bli värre när du skala ditt rutnät.
- Se till jobb kan köras på dina arbetare. Om jobb blir för minneskrävande eller diskutrymme intensiva jobb börjar avbryta och det enda du kommer att märka är en droppe i antal arbetstillfällen som bearbetats med någon riktig anledning.
Lämnar Resultat av ett jobb
När du skickar resultaten från ett jobb är det viktigt att kontrollera att resultaten inte har lämnats in av en annan arbetstagare, särskilt om den aktuella arbetstagaren har varit vilande under en tid.
När resultaten lämnas se till att antalet resultat motsvarar det antal poster i jobbet.
Som nämnts tidigare och kan inte nog betonas, bygga feltolerans i jobbet hämtning och resultat underkastelse. Arbetarna kan (och sannolikt kommer) gå in vänteläge på den mest obekväma gånger och detta måste tillgodoses. Även en gång abstrahera bort din resultaten ansökan kommer att hjälpa tillgodose framtida ändringar ditt jobb styrsystemet mycket lättare att hantera.
Sammanfattning
I denna section har vi tittat på vad ett jobb styrserver behöver göra och hur man får en mycket grundläggande system som inrättats. Vi diskuterade hur man hämtar ett jobb från styrsystemet och hur du bäst konfigurerar jobb att få ut mesta vår i ditt kontor bärverk. Till slut blev ett stycke eller två på skicka resultatet tillbaka till jobbet styrservern presenteras.
- Ett jobb styrserver hanterar jobb och ser till att alla arbetsenheter är klara
- Genom att abstrahera ditt jobb väljer / resultat lämnas vi kan ändra tekniken för kontroll servern utan mycket problem
- Konfigurera dina jobb så att de drivs snabbt och effektivt utan att alltför mycket press på din nätverksinfrastruktur, och utan att duplicera bearbetning uppgifter på en regelbunden basis.
- Se till att du bygger feltolerans och fel checking i dina rutiner, kan de anställda avbryta och återuppta och den mest obekväma gånger. Kom ihåg att kontrollera om resultat har redan lämnats in av en annan arbetstagare.
Nästa gång
I del 3 ska vi skapa vår virtuella maskin och sätta ihop våra Windows-maskiner för att bli idle deltidsarbetande.