Įvadas
Aš dirbu bendrovėje, kurioje mes paleisti daug partijos darbo vietų perdirbimo milijonus įrašų duomenų kiekvieną dieną ir aš galvoju neseniai apie visas mašinas, kurios sėdi aplink kiekvieną dieną nieko nedaryti dėl kelių valandų. Ar ne ji gera, jei mes galime naudoti šiuos mechanizmus stiprinti apdorojimo galia mūsų sistemos? Šiuo dirbiniai rinkinys I'm going pažvelgti į galimą naudą įdarbinimo biuro tinklo , naudojant virtualised aplinkoje.
Be 1 dalyje daviau tinklelį sistemos ir technologijos I bus naudojamas taip pat aptarė kai kuriuos iš galimų priežasčių, kodėl Jūs norėtumėte sukurti biurą.
Darbo kontrolės
Jei ketinate būti paleistas darbo vietų po to, you're going to reikia tam tikru būdu juos valdyti. Jūsų darbas kontrolės sistema (į savo darbo serveryje) reikia labai gerai apgalvoti dar prieš bandant paleisti biuro tinklo. Taigi pirma, kas yra už darbo kontrolės sistemos uždaviniai:
- Išdalinkite darbo vietų prašymu darbuotojų
- Praneškite darbuotojų kokio tipo darbo vietų paleisti
- Sekti vietų
- Užtikrinti, kad darbo vietų yra tik paleisti kartą
- Pateikite darbo duomenų darbuotojams, arba bent pasakykite jiems, kur gauti ji
Sistema taip pat turi būti galima pratęsti, tirpalas, kuris tinka dabar vienu atveju gali būti pratęstas skaičiuoti kelių tipų darbo vietų, kaip verslo mato verta tinklelį tirpalo. Pavyzdžiui, darbo vietų gali gauti prioritetus, daugiau kaip vieną darbą tipas gali būti (ty keli kodas bazes), galų gale jūs net gali paleisti keletą skirtingų darbuotojas mašinos, yra optimizuotas kiekvienai darbo tipas (nors tai nėra tolti nuo "bendro darbuotojas "idėja). Visada stenkitės galvoti apie ateitį, kai sistemų kūrimo, trumpalaikių vizija gali sukelti ilgalaikius nusivylimas ir padidėjo vystymosi metu.
Darbo Serveris
Mes ketiname reikia kažkur kontroliuoti mūsų darbo vietas, tai turėtų būti tik sistemai savo tinklelį kad turi fiksuotą Resource Locator, būti, kad IP adresą, kompiuterio vardą, adresą (naudojant vidinio DNS) ir tt Taip yra todėl, darbuotojai turi žinoti, kur ieškoti darbo, darbuotojams reikia susirasti darbą kontrolės sistemos (ne darbo kontrolės sistema surasti darbuotojų).
Darbas serveris pats tikrai ne sudėtingas uždavinys (pagrindiniame sistema Kažkaip), reikia laikyti darbo vietų sąrašą, ranką darbo vietas, gauti rezultatus, o vėliau juos laikyti, kad vėliau. Kaip šių dalių (pavyzdžiui, "ranką darbo vietų) yra apibrėžtos, gali būti labai paprastas. Vėliau mes galime išplėsti sistemą įtraukiant administravimo sąsaja pridėti, redaguoti, trinti, sustabdyti darbus, bet tai nesusiję su šios užduoties.
Nėra jokio pagrindo tada, kad jūsų darbas serveris negalėjo būti virtualios mašinos veikia per savo pagrindinę tvarkymo serveryje, jeigu ji neišteka per daug išteklių iš jo. Darbo serverio Tačiau tai reikia didelio prieinamumo, jei jis krinta ant penktadienio vakaro jūs ketinate prarasti visą savaitgalį perdirbimo, potencialiai jums kainuos savaičių verta perdirbimo metu pora (lyginant su jūsų pagrindinė perdirbimo serverio tik) . Jei norite, galite apsvarstyti galimybę savo darbo serveryje apkrova subalansuotą aplinką didelio prieinamumo.
Pagrindinis nustatymas
Pagrindinis įdiegimo mūsų darbo serverio sudarys ką I'm calling vienas iš mano Limp serverių (tai yra Li Nux m ySql P AG). Kodas veikia Thea darbuotojams bus faktiškai dirba, kas darbo vietų ji gali veikti sąveikaudama su su darbo kontrolės sistemos duomenų bazes. Vėliau mes galime sukurti interneto paslaugų ir faktiškai ranką darbo vietų, o ne darbuotojų padaryti sunkų darbą sau, bet dabar mes ir toliau naudoti KISS principas (keep it simple, stupid!).
Taigi, leidžia sukurti tris mySQL lentelių spręsti darbo vietų. Tai bus "darbo", "jobRecords", ir "jobResults".
Čia aš naudoju SQL Buddy labai mažai alternatyva phpMyAdmin tik todėl, kad jos lengviau įdiegti Centos (kitiems žiūrėkite: 10 Didžiosios alternatyvų phpMyAdmin )
Ši lentelė sudaryta iš 5 paprasti srityse,
- numeris: identifikuoti darbo
- pavadinimas: Ar galima klientas nuoroda, ar identifikatorius skaičių kitų
- Statusas: Jūs turite žinoti, kur darbas yra, pavyzdžiui,
- 0: Nepradėta
- 1: įlaipinami
- 2: Baigta
- started_by: Kas pradėjo daryti darbą? Tai nėra visiškai būtini, tačiau yra malonu turėti. Norėčiau pasiūlyti stebėjimo darbuotojų savo IP adresą jūsų tinklo
- started_at: Kada darbuotojas pradeda dirbti? Stebėdami darbo vietų, kurios dar nėra baigti per X laiką mes žinome, mes turime pasiimti darbą dar kartą ir pradėkite tvarkyti kito darbuotojo. Darbuotojų galėtų sustabdyti tvarkymo / atsijungti bet dėl daugelio priežasčių, nutrūkus energijos tiekimui, avarijos, tinklo nuostolių, ir tt
Tai lengva, kaip ši lentelė gali būti pratęstas su keletu papildomų laukų, kad būtų galima statistikos sekimo, apdaila laiko stulpelį pamatysite, kiek laiko darbo ėmėsi, skaitliukas pamatyti, kiek darbuotojų pakėlė darbas (žinoma, tai turi tendenciją 1), darbo prioritetas, sąrašas gali tęstis ir toliau. Sudėtingesnių darbo scenarijų būtų galima nurodyti, kiek atminties darbuotojas turės prieigą (ir todėl naudokite tik tinkamus darbuotojus), ar net kokio tipo darbuotojas būtų reikalaujama.
Leidžia pridėti keletą pavyzdžiui darbo vietų:
Tolesnėje lentelėje vėl yra gana paprasta suprasti, tai yra mūsų darbo įrašus. Jie yra susiję su pagrindinių darbo vietų lentelės skiltyje "jobs_id". Sudaro šios lentelės labai daug priklauso nuo duomenų, kad jums reikia pateikti savo darbuotojų, leidžia padaryti labai paprastą pavyzdį, kur mes keturios skiltys:
- numeris: ID įrašo
- pavadinimas: asmens vardas
- adresas: Asmuo adresas
- jobs_id: darbas ID, kad šis įrašas yra susijęs su
Trečioji ir galutinė lentelė susideda iš rezultatų lentelės, ji panašiai sudaryti iki mūsų įrašus lentelėje ir su kai kurių stulpelių to galėtų būti dalis įrašai lentelėje:
- job_record_id: Nuoroda rezultatas darbo stalo
- rezultatas: rezultatas duomenys
... Ir tai viskas, ko jums reikia darbo kontrolė! (Nors labai bazinio lygio) Mano atveju aš atkreipė dėmesį į kitoje lentelėje, kur mano duomenų apdorojimui buvo įsikūrusi, tačiau tai gali taip pat lengvai buvo failą, parametrų paleisti modeliavimas kodas, you name it.
Pasirinkus darbą
Kaip nurodyta anksčiau, darbuotojai atliks savo darbą valdymo mumis dabar, todėl visi turime tikrai yra susirasti darbą, kurį reikia perdirbti ir gauti informaciją. Kaip mes tai darome? Na pasiimti mūsų darbas atrankos kriterijus ir ieškotis darbo, SQL aš taip:
- Imtis bet kokių darbų, kurie nėra pažymėti kaip išsamūs, bet iš mūsų darbuotojas ir iš naujo jas (pakaitalas __ME__ su identifikatoriumi, lengviausia būtų IP adresas):
UPDATE `darbo` SET `status` = 0 ", jei" statusas "= 1 IR" started_by `= __ME__;
- Naudojant mūsų darbas atrankos kriterijus, pasirinkite darbo ir pasakyti kontrolės sistemą, kad šis darbuotojas yra susijusios su IT:
UPDATE `darbo` SET `status` = 1, "started_by` = __ME__, "started_at` = NOW () WHERE `status` = 0 arba
(`Status` = 1 IR "started_at"> DATE_SUB (NOW (), intervalas X VALANDĄ)) ORDER BY `id` ASC;
Iki greiferiniai darbo vietų, kurios davė rezultatus "X laiko mes užtikriname, kad visos darbo vietos būtų paleisti į darbuotojo kritimo ar ketinate AWOL atveju.
- Kitas patraukti vietų detales po įrašo save:
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.
Santrauka
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.