Úvod
Pracuji ve firmě, kde jsme se spustit mnoho dávkových úloh zpracování miliony záznamů dat každý den a já jsem nedávno přemýšlel o všech těch strojů, které se nacházejí kolem každého a každý den nic nedělat několik hodin. Nebylo by dobré, kdybychom mohli používat tyto stroje k posílení výpočetního výkonu našich systémů? V tomto souboru článků budu se dívat na potenciálních výhodách zaměstnávání kancelářskou síť pomocí virtualizované prostředí.
V části 1 Dal jsem přehled o systému a technologií budu používat, stejně jako projednala některé z možných důvodů, proč byste chtěli vytvořit kancelářské sítě.
Job Control
Pokud bude běžící úlohy potom budete potřebovat nějaký způsob, jak je řešit. Vaším úkolem řídící systém (na vašem pracovním serveru) musí být opravdu dobře promyšlený ještě předtím, než pokusem o spuštění aplikace systému Office mřížku. Tak za prvé, jaké jsou úkoly pro systém řízení práce:
- Rozdávat práci na žádost zaměstnance
- Řekněte pracovníků, jaký typ úlohy ke spuštění
- Sledování práce
- Ujistěte se, že úlohy jsou spustit pouze jednou
- Poskytnout pracovní dat pro pracovníky, nebo alespoň říct, kde jej získat
Systém musí být také rozšiřitelná řešení, které funguje zatím v jednom případě může být prodloužena spustit několik typů pracovních míst, jako je podnikání vidí hodnotu v mřížce řešení. Například, práce získat priority, více než jeden druh povolání mohou existovat (tj. několik kód základny), případně můžete dokonce spustit několik různých pracovníka stroje, které jsou optimalizovány pro každý typ zaměstnání (i když to se vzdálí od generikum pracovníka "nápad). Vždy se snažím přemýšlet o budoucnosti při vývoji systémů, může krátkodobě vést k vidění dlouhodobější frustraci a navýšení rozvojové čas.
Job Server
Budeme potřebovat někde kontrolovat naši práci od, mělo by to být jediný systém ve vaší síti, která má pevnou Resource Locator, je, že IP adresa, jméno počítače, URL (pomocí interní DNS), atd. Je to proto, pracovníci potřebují vědět, kde hledat práci, pracovníci musí najít zaměstnání kontrolní systém (není úkolem řídicí systém najít pracovníky).
Práce server sám o sobě není opravdu složitý úkol (v základním systému tak jako tak), je třeba uložit seznam míst, ruku pracovních míst, obdrží výsledky a následně je uložit pro pozdější použití. Jak jsou definovány tyto části (např. "ruku zaměstnanosti"), může být velmi jednoduchý. Později můžeme rozšířit systém zahrnuje administrační rozhraní přidávat, upravovat, mazat, pozastavit pracovních míst, ale to je nad rámec tohoto cvičení.
Neexistuje žádný důvod pak, že vaše práce serveru nemůže být virtuální stroj běží v rámci hlavního zpracování serveru, pokud není kanalizace příliš mnoho zdrojů, z ní. Práce serveru však není potřeba vysoké dostupnosti, pokud to jde dolů v pátek večer vy budete ztratit celý víkend zpracování, případně vás to stálo pár týdnů v hodnotě zpracování času (ve srovnání s hlavním zpracování samotného serveru) . Možná budete chtít, aby zvážila své pracovní server na zatížení vyvážené prostředí pro vysokou dostupnost.
Základní nastavení
Základní nastavení pro našeho serveru práce bude skládat z toho, co Volám jeden z mých Limp serverů (to je Li nux, m ySql, P HP). Kód běžící na pracovníky Thea bude skutečně fungovat, co práce to může běžet interakcí s databází s úřady práce řídicího systému. Později bychom mohli vytvořit webovou službu a skutečně vyplácejí pracovních míst spíše než mít pracovníci Těžkou práci sami, ale teď budeme pokračovat v používání principu KISS (Keep It Simple, Stupid!).
Takže, pojďme vytvořit tři MySQL tabulky se vypořádat s pracovními místy. Ty budou práce ``, `jobRecords` a `jobResults`.
Zde jsem pomocí SQL Buddy velký trochu alternativu k phpMyAdmin jen proto, že jeho snadnější instalaci na CentOS (pro ostatní viz: 10 Velké alternativy k phpMyAdmin )
Tato tabulka se skládá z 5 jednoduchých polí,
- id: Jedinečná identifikace práci
- Jméno: Může to být klient odkaz, nebo libovolný počet jiných identifikátorů
- Stav: Musíte vědět, kde práce je, např.
- 0: Nezahájeno
- 1: Vyzvedli jsme
- 2: Dokončeno
- started_by: Kdo začal dělat svou práci? To není úplně nutné, ale je hezké mít. Já bych navrhnout, sledování pracovníků podle jejich IP adresy v síti
- started_at: Kdy se pracovník zahájit práci? Sledováním práce, které nebyly dokončeny ve výši X dobu víme, že je třeba vyzvednout práci znovu a začít zpracování jiným pracovníkem. Pracovníci mohl zastavit zpracování / offline pro libovolný počet důvodů, výpadek proudu, havárie, ztráta sítě atd.
Je to snadné, jak by tato tabulka být prodloužena až na několik dalších oblastí, což umožňuje sledování statistik, což je cílový čas sloupce, jak dlouho trvalo práce, počítadlo, kolik pracovníků zvedl práci (zřejmě to potřebuje spíše 1), práce prioritou, lze seznam pokračovat dál a dál. Ve složitějších pracovních scénářů, že by bylo možné určit, kolik paměti pracovník bude potřebovat přístup k (a proto používejte vhodné pracovníky), nebo dokonce jaký typ pracovníka, by bylo zapotřebí.
Umožňuje přidat několik příkladů pracovních míst:
Následující tabulka je opět velmi jednoduchý na pochopení, to jsou naše pracovní záznamy. Ty jsou napojeny na hlavní nabídku tabulky sloupec `s jobs_id nepovinné. Tvoří z této tabulky velmi závisí na typu dat, které je třeba poskytnout svým pracovníkům, umožňuje dělat velmi jednoduchý příklad, kde máme čtyři sloupce:
- id: ID záznamu
- Jméno: Jméno
- adresa: Osoby adresa
- jobs_id: úkolem číslo, že tento záznam je spojena s
Třetí a poslední stůl se skládá z výsledků tabulky, má hodně stejný make up jako naše záznamy tabulky, a přidáním některých sloupců by mohla být součástí spisové tabulky:
- job_record_id: Odkaz výsledek na pracovní stůl
- Výsledek: Výsledné údaje
... A to je vše, co potřebujete pro vytváření pracovních kontrolou! (I když na velmi základní úrovni) V mém případě jsem ukázal jsem do jiné tabulky, kde byla moje data ke zpracování, ale to by mohlo právě jak snadno být soubor, parametry pro spouštění simulace kód, co si jen vzpomenete.
Výběr práce
Jak již bylo uvedeno, budou pracovníci dělat svou práci správu pro nás teď, tak všechno, co potřebujeme opravdu udělat, je najít si práci, která potřebuje zpracování a získat informace. Jak bychom to udělat? Well vybrat podle našich kritérií výběru povolání a hledají práci, v SQL jsem následující:
- Vezměte všechny úlohy, které nejsou označeny jako kompletní, ale z našeho pracovníka a resetovat (nahradit __ ME__ s identifikátorem, bude nejsnazší být IP adresa):
UPDATE `s` SET `pracovních míst stav` = 0 WHERE `stav` = 1 AND `started_by` = __ ME__;
- Pomocí našich kritérií výběru povolání, vyberte si práci a říct kontrolní systém, který tento pracovník se zabývá tím:
UPDATE `s` SET `pracovních míst stav` = 1, `started_by` = __ ME__, `started_at` = NOW () WHERE `stav` = 0 nebo
(`Status` = 1 AND `` started_at> DATE_SUB (NOW (), INTERVAL X HOUR)) ORDER BY `id` ASC;
Tím, že chytne pracovních míst, které nebyly vráceny výsledky v množství X době, kdy jsme se zajistilo, že všechny úlohy jsou spouštěny v případě pracovníka zřítilo nebo jít dezertoval.
- 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:
- 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.
- 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.
Shrnutí
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.
Příště
In part 3 we'll create our virtual processing machine and set up our windows machines to become idle-time workers.