Inledning
Jag arbetar i ett företag där vi bedriver många batchjobb bearbetning miljontals poster av data varje dag och jag har tänkt nyligen om alla de maskiner som sitter runt varje och varje dag gör ingenting i flera timmar. Vore det inte bra om vi kunde använda dessa maskiner att stärka processorkraften i våra system? I denna uppsättning av artiklar jag kommer att titta på de potentiella fördelarna med att anställa ett kontor rutnät med hjälp av virtualiserade miljöer.
I del 1 gav jag en översikt över systemet och teknik jag kommer att använda samt diskuterat några av de potentiella anledningar till varför du skulle vilja skapa ett kontor rutnät.
Kontroll över arbetet
Om du kommer att vara igång jobb då du kommer att behöva något sätt att hantera dem. Ditt jobb styrsystem (på ditt jobb server) måste vara väldigt väl genomtänkt innan du ens försöker att driva ett kontor rutnät. Så det första, vad är de uppgifter för ett jobb styrsystem:
- Dela ut jobben på begäran från arbetare
- Berätta för arbetare vilken typ av jobb att köra
- Spår jobb
- Se till att jobb bara köras en gång
- Ge jobbdata för arbetstagare, eller åtminstone tala om för dem var att få det
Systemet behöver också utbyggbar, en lösning som fungerar för nu i ett enda fall kan utvidgas till att köra flera typer av jobb som branschen ser ett värde i ett rutnät lösning. Till exempel kan jobb vinna 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.
Job Server
Vi kommer att behöva någonstans att kontrollera våra jobb från bör detta vara det enda systemet i ditt nät som har en fast Resource Locator, vara så att en IP-adress, värdnamn, URL (med interna DNS), etc. Detta beror på arbetarna måste veta var man ska söka jobb, arbetare måste hitta systemet kontroll över arbetet (inte jobbet styrsystemet hitta arbetarna).
Jobbet servern själv inte riktigt har en komplicerad uppgift (i en grundläggande systemet i alla fall), behöver den för att lagra en lista med jobb, dela ut jobb, få resultat, och sedan lagra dem för senare hämtning. Hur dessa delar (till exempel "dela ut jobb") definieras kan vara väldigt grundläggande. Senare kan vi utvidga systemet till att omfatta ett administrationsgränssnitt för att lägga till, redigera, radera, avbryta jobb men detta är bortom denna övning.
Det finns ingen anledning då att ditt jobb servern inte kunde vara en virtuell maskin som körs i din huvudsakliga behandlingen servern förutsatt att det inte rinna för mycket resurser från det. Jobbet servern däremot behöver hög tillgänglighet, om det går ner på en fredag kväll du kommer att förlora en hel helg av behandling, eventuellt kostar dig ett par veckor till ett värde av handläggningstiden (jämfört med din huvudsakliga behandlingen servern ensam) . Du kanske vill överväga att sätta ditt jobb server på en lastbalanserade miljö för hög tillgänglighet.
Basic Setup
Den grundläggande inställningen för vårt jobb-servern kommer att bestå av vad jag kallar en av mina HALTA servrar (det vill säga Li Nux, m ySql, P hk). Koden körs på thea arbetstagarna faktiskt kommer att räkna ut vilka jobb det kan köras genom att interagera med med system jobbkontroll databaser. Senare kunde vi skapa en webbtjänst och faktiskt dela ut jobb snarare än att arbetarna 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 bord att ta itu med jobb. Dessa kommer att vara `jobb`, `jobRecords` och `jobResults`.
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 ser: 10 bra 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 på, t.ex.
- 0: Ej startat
- 1: Plockade upp
- 2: Genomförd
- started_by: Vem började göra jobbet? Detta är inte helt nödvändigt men är ett trevligt att ha. Jag skulle föreslå att spåra arbetstagarna genom deras IP-adress på ditt nätverk
- started_at: När började arbetaren börjar jobbet? Genom att spåra jobb som inte har avslutats inom X tid vi vet att vi behöver plocka upp jobbet igen och börja behandlas av en annan arbetare. Arbetare kunde stoppa bearbetning / gå offline för någon av flera skäl, strömavbrott, krasch, nätverk förlust, etc.
Det är lätt hur detta bord kan förlängas med några ytterligare fält för att möjliggöra 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 plockade upp jobbet (uppenbarligen detta måste tenderar att 1), jobb prioriteras, listan kan fortsätta och fortsätta. I mer komplexa jobb scenarion det skulle 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åt oss lägga till några exempel på arbeten:
Nästa bordet igen är ganska enkel att förstå, det är vårt jobb register. De är kopplade till de viktigaste jobben tabellen genom en kolumn `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 den post
- namn: personens namn
- adress: Person adress
- jobs_id: Jobbet ID som denna post är kopplad till
Den tredje och sista tabell består av ett resultat bord, har den ungefär samma utgör som våra register bord, och med tillägg av vissa kolumner kan vara en del av posterna 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 min data för att processen var beläget, men det kan lika gärna varit en fil, parametrar att köra simulering kod, you name it.
Välja ett jobb
Som nämnts tidigare, kommer arbetarna att göra vårt jobb ledningen för oss för nu, så allt vi behöver verkligen göra är att hitta ett jobb som behöver behandling och få information. Hur skulle vi göra detta? Tja plocka våra kriterier jobb urval och söka jobb, i SQL gjorde jag följande:
- Ta inga jobb som inte är märkta som kompletta men från våra arbetare och återställa dem (substitut __ME__ med en identifierare, skulle enklast kunna IP-adress):
UPDATE `jobb` SET `status` = 0 där `status` = 1 och `started_by` = __ME__;
- Använda våra kriterier jobb, markerar du ett jobb och talar om för styrsystemet att arbetstagaren har att göra med det:
UPDATE `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 gav resultat i X tid vi se till att alla jobb körs i händelse av en arbetare krascha eller gå AWOL.
- Nästa tag i jobb detaljer följt av journaler själva:
SELECT * FROM `jobb` där `started_by` = __ME__ LIMIT 1;
SELECT * FROM `job_records` WHERE `id` = __JOBID__;
Efter avslutad jobb vi sätter vårt resultat register och markera det jobb som fullständig. Tänk så jobb kan avbryta / återuppta som helst utrymme för en viss robusthet i skriptet. Det kan vara att uppgiften avbryter halvvägs uppdatera systemet kontroll över arbetet, så kontrollera antalet poster i ett jobb och antalet resultat sparas tillbaka till jobbet styrsystemet skulle vara ett klokt drag.
Dessutom, samtidigt som detta visar hur jobben kan väljas och hanteras från en SQL-query ram du egentligen borde abstrahera ditt jobb kontroll så att om du väljer att byta till att använda en webbtjänst, en fil baserat system, XML , eller någon annan antalet system de inte kommer att påverka koden ovanför.
Job konfiguration
Nästa aspekt att beakta är jobbets storlek och konfiguration. Genom att spela med jobbet konfiguration kan vi hitta en bra balans mellan fart-, process-replikering och tillförlitlighet. Ta en scenarier par OFA:
- Jobb tar en dag varje köra: Det innebär att dina anställda behöver 15 dagar för att behandla varje jobb (kom ihåg 10% av kraften för 2/3rds av tiden). Detta är uppenbarligen inte en klok konfiguration, är ditt jobb storleken alldeles för stor! Det skulle ta minst dubbelt så lång tid att få ett jobb bearbetas bör den initiala arbetstagaren gå AWOL (tid att plocka upp att det inte har återvänt ett resultat plus upparbetning tid). I en idealisk du skulle ha minst en fullt jobb lätt bort i slutet av varje lång inaktiv tid, så du behåller jobben tickar över 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: Det innebär att dina anställda tar ca 15 minuter att köra varje jobb. Även om detta initialt kan verka perfekt, du får extra arbete bearbetning vid lunchtid, kaffepauser, möten osv detta scenario sätter påfrestningar på andra områden i ditt system och introducerar sina egna problem. Till exempel, för det första din setup / handläggningstiden förhållandet kommer att gå rätt ner, därför förlorar systemet effektivitet. Ditt nätverk kommer att vara ständigt strömmande jobbinformation till de olika arbetarna frustrerande personal som dong deras dagliga arbete. Du kommer också att sätta större påfrestning på ditt jobb behandling servern som det har att dela ut massor av små bitar av arbete på en regelbunden basis. Slutligen, i denna situation om ditt jobb servern går ner du kommer att skapa en enorm baksida logg över slutfört arbete medan större arbeten kan en fortsatt bearbetning lyckligt ovetande att jobbet servern hade några svårigheter.
I verkligheten finns det ingen perfekt konfigurationen för din grid inställning, mycket beror på tillgängliga resurser, typer av jobb, extrajobb turnaround krav, nätverkskapacitet, och så vidare. Men några riktlinjer skulle vara:
- Storlek jobb så att varje arbetstagare kan ta sig igenom minst 3-4 jobb i en period av 15 timmar (den längsta sannolikt inaktiv tidsperiod)
- Spela med jobbet storlek så att ställtiderna blir ganska obetydlig jämfört med handläggningstiden (med tanke på ovanstående punkt).
- Om en arbetssökande inte komplett i dubbla mängden tid (kanske mindre) du förväntar att slutföra det anta att dess gått AWOL och börja bearbeta den med en annan arbetare. Detta innebär att du kan få vänta upp till tre gånger den normala längden på ett jobb för att slutföra (möjligen längre om det efterföljande arbetet misslyckas). Du kanske vill minska den här gången, men var noga med att inte minska det alltför mycket som du kan börja dubblera bearbetning uppgifter på en regelbunden basis.
- Jobb bör vara oberoende av externa krav 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 ha två negativa effekter så kommer ditt dagtid personal hittar med hjälp av nätverket frustrerande och problem kan upplevas med anslutningar timing ut ett problem som bara kommer bli värre när du skala ditt rutnät.
- Se till att jobb kan köras på dina arbetare. Om jobben blir för minneskrävande eller diskutrymme intensivt jobb börjar avbryta och det enda du märker är en nedgång i antalet arbetstillfällen bearbetas med någon egentlig anledning.
Inlämning Resultat av ett jobb
När du skickar resultatet av ett arbete är det viktigt att kontrollera att resultaten inte har lämnats in av en annan arbetare, särskilt om den aktuella arbetstagaren har varit vilande under en tid.
När resultaten lämnas säkerställa att antalet resultat motsvarar det antal poster inom jobb.
Som nämnts tidigare, och kan inte nog understrykas, bygga feltolerans i jobb hämtning och resultat underkastelse. Arbetarna kan (och förmodligen kommer) att gå in i viloläge på den mest obekväma tider och detta måste tillgodoses. Också en gång abstrahera bort dina resultat ansökan kommer att hjälpa tillgodose framtida förändringar av ditt jobb styrsystemet mycket lättare att hantera.
Sammanfattning
I denna section vi har tittat på vad ett jobb Control Server 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 för att få ut det mesta vårt för ditt kontor bärverk. För att avsluta, var ett stycke eller två om framläggning av tillbaka till jobbet styra servern presenteras.
- Ett jobb Control Server hanterar jobb och ser till att alla arbetsenheter är klara
- Genom att abstrahera jobbet välja / resultat underkastelse vi kan ändra tekniken för kontroll servern utan större problem
- Konfigurera jobb att se till att de kör snabbt och effektivt utan att för mycket press på ditt nätverk infrastruktur, och utan dubblering bearbetning uppgifter på en regelbunden basis.
- Se till att du bygger feltolerans och fel checking i dina rutiner, kan arbetstagare avbryta och återuppta och den mest obekväma gånger. Kom ihåg att kontrollera om resultaten har redan lämnats in av en annan arbetare.
Nästa gång
I del 3 ska vi skapa vår virtuella bearbetning maskin och sätta ihop våra Windows-maskiner för att bli sysslolös deltidsarbetande.