Introduzione
Io lavoro in una società dove eseguire i processi di elaborazione in batch molti milioni di record di dati ogni giorno e ho pensato di recente su tutte le macchine che si siedono intorno ogni giorno senza far nulla per diverse ore. Non sarebbe un bene se abbiamo potuto utilizzare queste macchine per sostenere la potenza di elaborazione dei nostri sistemi? In questa serie di articoli che sto andando a guardare i potenziali benefici di impiegare un ufficio griglia con ambienti virtualizzati.
Nella Parte 1 ho dato una panoramica del sistema e delle tecnologie userò così come discusso alcune delle possibili motivazioni per cui si vorrebbe creare una griglia ufficio.
Lavoro di controllo
Se avete intenzione di essere in esecuzione i lavori allora stai andando avere bisogno di un modo per gestirli. Il sistema di controllo di lavoro (sul server di lavoro) deve essere molto ben pensato prima ancora di tentare di eseguire una griglia ufficio. Quindi in primo luogo, quali sono i compiti di un sistema di controllo dei job:
- Distribuire posti di lavoro su richiesta di lavoratori
- Dillo lavoratori che tipo di lavori da eseguire
- Tenere traccia dei lavori
- Assicurarsi che i lavori vengano eseguiti una volta sola
- Fornire i dati del lavoro ai lavoratori, o almeno dire loro dove trovarlo
Il sistema deve anche essere estensibile, una soluzione che funziona per ora in un singolo caso può essere estesa ad eseguire diversi tipi di lavori come l'azienda vede il valore in una soluzione griglia. Ad esempio, i lavori possono avere priorità, più di un tipo di processo può esistere (ovvero basi di codice diversi), eventualmente si può anche eseguire più macchine worker differenti che sono ottimizzati per ogni tipo di lavoro (anche se questo si allontana dal 'operaio generico 'idea). Cerca sempre di pensare al futuro nello sviluppo di sistemi, di una visione a breve termine può portare a frustrazione a lungo termine e tempi di sviluppo maggiore.
Job Server
Stiamo andando a bisogno di un posto di controllare i nostri lavori da, questo dovrebbe essere l'unico sistema in rete che ha una fissa resource locator, che sia un indirizzo IP, nome host, URL (con DNS interno), ecc Questo è perché I lavoratori hanno bisogno di sapere dove cercare lavoro, i lavoratori hanno bisogno di trovare il sistema di controllo del lavoro (non il sistema di controllo del lavoro a trovare i lavoratori).
Il server di posti di lavoro in sé in realtà non hanno un compito complicato (in un sistema di base comunque), ha bisogno di memorizzare un elenco di posti di lavoro, mano lavoro, ricevere i risultati, e successivamente li memorizza per il successivo recupero. Come queste parti (ad esempio 'mano posti di lavoro') sono definite può essere molto di base. In seguito siamo in grado di estendere il sistema per includere un'interfaccia di amministrazione per aggiungere, modificare, eliminare, sospendere i lavori ma questo è al di là di questo esercizio.
Non vi è alcun motivo quindi che il server di lavoro non potrebbe essere una macchina virtuale in esecuzione all'interno del server di elaborazione principale a condizione che non scarica troppe risorse da esso. Il server di posti di lavoro però ha bisogno di alta disponibilità, se va giù su un Venerdì sera stai andando a perdere un intero weekend di elaborazione, potenzialmente vi costa un paio di settimane di tempo di elaborazione (rispetto al server di elaborazione principale da solo) . Si consiglia di valutare l'ipotesi di lavoro il server in un ambiente di bilanciamento del carico per l'alta disponibilità.
Impostazioni di base
La configurazione di base per il nostro server di lavoro sarà costituito da ciò che io chiamo uno dei miei server Bizkit (che è nux Li, m ySql, P HP). Il codice in esecuzione sui lavoratori Thea realmente capire il lavoro che può essere eseguito tramite l'interazione con i database di sistema di controllo dei job. In seguito potremmo creare un servizio web ed effettivamente mano posti di lavoro piuttosto che avere i lavoratori fare il lavoro duro se stessi, ma per ora ci continuare a utilizzare il principio KISS (Keep it Simple, Stupid!).
Quindi, consente di creare tre mySQL tabelle a che fare con posti di lavoro. Questi saranno i `posti di lavoro`, `jobRecords`, e `JobResults`.
Qui sto usando SQL amici una grande alternativa poco a phpMyAdmin solo perché è più facile da installare su CentOS (per gli altri vedi: 10 grandi alternative a phpMyAdmin )
Questa tabella è composta da 5 campi semplici,
- id: Identificare in modo univoco il lavoro
- Nome: Potrebbe essere un riferimento per la clientela, o un qualsiasi numero di altri identificatori
- Status: Hai bisogno di sapere dove il lavoro è, ad esempio
- 0: Non iniziato
- 1: Raccolto
- 2: Completato
- started_by: Chi ha iniziato a fare il lavoro? Questo non è del tutto necessario, ma è un bello avere. Io suggerirei di tracciamento dei lavoratori dai loro indirizzi IP sulla rete
- started_at: Quando il lavoratore avviare il lavoro? Tenendo traccia di lavoro che non hanno completato entro quantità X di tempo sappiamo che abbiamo bisogno di far salire il lavoro ancora una volta e avviare l'elaborazione da un altro lavoratore. I lavoratori possono interrompere l'elaborazione / go offline per qualsiasi numero di ragioni, mancanza di corrente, crash, perdita di rete, ecc
E 'facile come questo tavolo potrebbe essere esteso con alcuni campi aggiuntivi permettono di tracciare le statistiche, una colonna tempo finale per vedere quanto tempo il lavoro ha preso, un contatore per vedere quanti lavoratori raccolto il lavoro (ovviamente questo deve tendere alla 1), la priorità del lavoro, l'elenco può continuare a lungo. In scenari di lavoro più complessi sarebbe possibile specificare la quantità di memoria il lavoratore avrebbe avuto bisogno (e quindi utilizzare solo i lavoratori adatti), o anche che tipo di lavoratore sarebbe necessario.
Consente di aggiungere un lavoro alcuni esempi:
La tabella seguente è ancora abbastanza semplice da capire, questi sono i nostri record di posti di lavoro. Esse sono legate alla tabella principale posti di lavoro da una colonna `jobs_id`. Il make up di questa tabella molto dipende dai dati che avete bisogno di fornire ai vostri lavoratori, consente di fare un esempio molto semplice in cui abbiamo quattro colonne:
- id: ID del record
- name: nome della persona
- Indirizzo: indirizzo della persona da
- jobs_id: L'ID del lavoro che questo record è legata alla
Il tavolo terza e finale consiste di una tabella di risultati, ha la stessa trucco come nostro tavolo record, e con l'aggiunta di alcune colonne potrebbero essere parte del record della tabella:
- job_record_id: Collegare il risultato al tavolo di lavoro
- risultato: i dati dei risultati
... E questo è tutto il necessario per il controllo dei job! (Anche se ad un livello molto elementare) Nel mio caso sto indicando un altro tavolo dove si trovava miei dati da elaborare, ma questo potrebbe altrettanto facilmente essere un file, i parametri per eseguire codice di simulazione, è il nome.
Selezione di un lavoro
Come detto in precedenza, i lavoratori faremo la nostra gestione dei lavori per noi, per ora, quindi tutto quello che dobbiamo fare davvero è trovare un lavoro che necessita di trattamento e ottenere le informazioni. Come facciamo questo? Bene scegliere i nostri criteri di selezione di lavoro e di cercare lavoro, in SQL ho fatto la seguente:
- Prendete tutti i processi che non sono contrassegnati come completa, ma dal nostro lavoratore e ripristinarle (sostituire ME__ __ con un identificatore, più semplice sarebbe indirizzo IP):
UPDATE `lavoro` SET `status` = 0 WHERE `status` = 1 AND `started_by` = __ ME__;
- Utilizzando i nostri criteri di selezione di lavoro, selezionare un lavoro e dire al sistema di controllo che il lavoratore se ne occupa:
UPDATE `lavoro` SET `status` = 1, `started_by` = __ ME__, started_at `` = NOW () WHERE `status` OR = 0
(`Status` = 1 AND `started_at`> DATE_SUB (NOW (), INTERVAL HOUR X)) ORDER BY `id` ASC;
Con i lavori afferrare che non hanno restituito risultati in quantità X di tempo ci assicuriamo che tutti i lavori sono eseguiti in caso di un lavoratore crash o andare AWOL.
- Avanti afferrare i dettagli posti di lavoro seguiti dagli stessi record:
SELECT * FROM `lavoro` WHERE `started_by` = __ ME__ LIMIT 1;
SELECT * FROM `job_records` WHERE `id` = __ JOBID__;
Al termine del lavoro inseriamo i nostri dati di risultato e di segnare il lavoro come completo. Ricordate come posti di lavoro può sospendere / riprendere in qualsiasi momento consentire una certa robustezza nello script. Potrebbe essere che il compito sospende a metà strada attraverso l'aggiornamento del sistema di controllo del lavoro, in modo da controllare il numero di record in un lavoro e il numero di risultati salvati nel sistema di controllo di lavoro sarebbe una mossa saggia.
Inoltre, mentre questo dimostra come i lavori possono essere selezionati e gestiti da un SQL-query cornice che in realtà dovrebbe essere astrarre il controllo del lavoro in modo che se si decide di passare ad usare un servizio web, un file system basato su XML , o qualsiasi altro numero di sistemi non influenzerà il codice di sopra di esso.
Job Configurazione
L'aspetto da considerare è la dimensione del lavoro e di configurazione. Giocando con la configurazione di posti di lavoro si può trovare un ottimo equilibrio tra velocità, la replica di processo, e affidabilità. Prendete un paio di scenari OFA:
- Offerte di lavoro prendere 1 giorno ciascuno a correre: Questo significa che i lavoratori hanno bisogno di 15 giorni per elaborare ogni posto di lavoro (ricordate il 10% della potenza per 2/3rds del tempo). Questo chiaramente non è un saggio di configurazione, la dimensione lavoro è troppo grande! Ci vorrebbe almeno il doppio del tempo per ottenere un lavoro elaborato il lavoratore deve prima andare AWOL (tempo di raccogliere che non ha restituito un risultato più tempo ritrattamento). In un ideale che avresti avuto almeno un lavoro a tempo pieno facilmente eliminato entro la fine di ogni lungo periodo di inattività, in questo modo di mantenere i posti di lavoro ticchettio sopra e al peggiore dei casi un lavoro avrebbe preso due giorni per il primo processo dovrebbe andare dispersi.
- Offerte di lavoro prende 1 minuto per eseguire: Questo significa che i lavoratori impiegano circa 15 minuti per eseguire ogni lavoro. Anche se questo può inizialmente sembrare ideale, è possibile ottenere ulteriori elaborazioni lavoro durante l'ora di pranzo, coffee break, riunioni, etc questo scenario gravano su altri settori del sistema e presenta i propri problemi. Ad esempio, in primo luogo la configurazione / trasformazione rapporto tempo sta per andare a destra in basso, perdendo così l'efficienza del sistema. La rete sta per essere costantemente informazioni sul processo di streaming per il personale i vari lavoratori frustrante che sono dong il loro lavoro quotidiano. Stai andando anche a mettere più pressione sul vostro server processo di elaborazione in quanto deve servire fuori un sacco di piccoli pezzi di lavoro su base regolare. Infine, in questa situazione se il server va giù di posti di lavoro che stai andando a creare un log enorme dietro il lavoro non completato, mentre più grandi posti di lavoro potrebbe di trattamento continuato beatamente inconsapevoli che il server di lavoro è stato in difficoltà.
In realtà non ci sarà alcuna configurazione quello ideale per la configurazione di rete, molto dipende dalle risorse disponibili, i tipi di lavoro, di lavoro requisiti tempi di lavorazione, capacità di rete, e così via. Tuttavia alcune linee guida potrebbe essere:
- Lavori dimensioni in modo che ogni lavoratore può ottenere attraverso almeno 3-4 posti di lavoro in un periodo di 15 ore (la più lunga del probabile periodo di tempo di inattività)
- Gioca con la dimensione del lavoro in modo che i tempi di configurazione diventa abbastanza insignificante rispetto al tempo di elaborazione (in considerazione del punto precedente).
- Se un processo non si completa in doppio la quantità di tempo (forse meno) ci si aspetta di completare la presupporre che il suo AWOL andato e avviare l'elaborazione con un altro lavoratore. Questo significa che potrebbe essere necessario attendere fino a tre volte la lunghezza normale di un lavoro per il completamento (forse più a lungo se il lavoro non riesce successiva). Si consiglia di ridurre questo tempo, ma attenzione a non ridurre troppo come si può iniziare a duplicare le operazioni di elaborazione su base regolare.
- Offerte di lavoro dovrebbero essere indipendenti al di fuori dei requisiti il più possibile. Il server di lavoro, ad esempio, deve essere contattato all'inizio e alla fine di ogni lavoro.
- Non saturare la rete, questo avrà due effetti negativi, il personale diurno si trova utilizzando la rete frustrante e problemi possono essere sperimentato con connessioni timeout un problema che potrà solo peggiorare, come si ridimensiona la griglia.
- Garantire posti di lavoro può essere eseguito su i vostri operai. Se i processi diventano troppo spazio di memoria di lavoro ad alta intensità o disco ad alta intensità inizierà l'interruzione e l'unica cosa che noterete è un calo nel numero dei lavori elaborati senza alcun vero motivo.
Risultati Invio di un lavoro
Nel presentare i risultati di un lavoro, è importante verificare che i risultati non sono stati presentati da un altro lavoratore, soprattutto se il lavoratore attuale non è stato sospeso per qualche tempo.
Quando i risultati vengono presentati in modo che il numero di risultati corrisponde al numero di record all'interno del processo.
Come detto in precedenza, e non può essere superiore a sottolineare, costruire la tolleranza ai guasti nel recupero di posti di lavoro e presentazione dei risultati. I lavoratori possono (e molto probabilmente) entrare in modalità di sospensione al più scomodo dei tempi e questo deve essere soddisfatti. Inoltre ancora una volta, astraendo la vostra presentazione risultati aiuteranno soddisfare i futuri cambiamenti al sistema di controllo di lavoro molto più facile da affrontare.
Riassunto
In questo sezionali abbiamo guardato a ciò che un server di controllo del lavoro deve fare e come ottenere un sistema molto semplice configurare. Abbiamo discusso di come recuperare un lavoro dal sistema di controllo e come configurare al meglio i lavori per ottenere il massimo del nostro sistema per ufficio griglia. Per finire, un paragrafo o due alla presentazione dei risultati al server di controllo del lavoro è stato presentato.
- Un server gestisce il controllo dei job posti di lavoro e assicura che tutte le unità di lavoro sono stati completati
- Astraendo il tuo lavoro selezionare / presentazione dei risultati possiamo cambiare la tecnologia del server di controllo senza problemi molto
- Configurare i processi per assicurare che vengono eseguiti in modo rapido ed efficiente senza mettere troppa pressione sulla vostra infrastruttura di rete, e senza duplicare le operazioni di elaborazione su base regolare.
- Assicurarsi che si genera tolleranza ai guasti e checking errore nelle vostre routine, i lavoratori possono sospendere e riprendere e il più scomodo dei tempi. Ricordati di controllare se i risultati sono già stati presentati da un altro lavoratore.
La prossima volta
In parte 3 creeremo la nostra macchina virtuale, l'elaborazione e impostare le nostre macchine windows per diventare idle-time.