Introduzione
Io lavoro in una società dove eseguire i processi di elaborazione batch di molti milioni di record di dati ogni giorno e ho pensato di recente su tutte le macchine che si siedono attorno ad ogni e ogni giorno non fare nulla per diverse ore. Non sarebbe bello se potessimo usare queste macchine per sostenere la potenza di elaborazione del nostro sistema? In questa serie di articoli ho intenzione di 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 alcuni dei motivi possibili per cui si vorrebbe creare una griglia d'ufficio.
Lavoro di controllo
Se avete intenzione di essere in esecuzione i lavori allora si sta andando a bisogno di un modo per gestirli. Il vostro sistema di controllo dei job (sul server di lavoro) deve essere davvero 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:
- I lavori a mano su richiesta di lavoratori
- Dillo a lavoratori che tipo di lavori da eseguire
- Tenere traccia dei lavori
- Garantire che i lavori sono eseguiti solo una volta
- Fornire 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 per eseguire diversi tipi di lavori come l'azienda vede il valore in una soluzione griglia. Per esempio, i lavori possono avere priorità, più di un tipo di lavoro può esistere (cioè diverse basi di codice), alla fine si può anche eseguire più macchine worker differenti che sono ottimizzati per ogni tipo di lavoro (anche se questo si muove lontano dal 'operaio generico 'idea). Cercate sempre di pensare al futuro nello sviluppo di sistemi, una visione a breve termine può portare alla frustrazione più lungo termine e un aumento dei tempi di sviluppo.
Job Server
Stiamo andando a bisogno di un posto di controllare il nostro lavoro da, questo dovrebbe essere l'unico sistema in rete che ha un fisso Resource Locator, è che un indirizzo IP, nome host, l'URL (usando il DNS interno), ecc Questo perché i lavoratori hanno bisogno di sapere dove cercare lavoro, i lavoratori hanno bisogno di trovare il sistema di controllo di lavoro (non il sistema di controllo trovare lavoro i lavoratori).
Il server di lavoro in sé non hanno un compito davvero complicato (in un sistema di base comunque), ha bisogno di memorizzare un elenco di posti di lavoro, distribuire posti di lavoro, ottenere risultati, e, successivamente, conservarle per il successivo recupero. Come queste parti (come 'mano di posti di lavoro') sono definite può essere molto di base. Più tardi siamo in grado di estendere il sistema per includere un'interfaccia di amministrazione di aggiungere, modificare, eliminare, sospendere i lavori ma questo è al di là di questo esercizio.
Non vi è alcun motivo allora che il server di lavoro non poteva 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 lavoro però ha bisogno di alta disponibilità, se va giù su un Venerdì sera si sta andando a perdere un intero fine settimana di lavorazione, 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 del 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à composto da ciò che io chiamo uno dei miei server LIMP (che è Nux Li, m ySql, P HP). Il codice in esecuzione sui lavoratori thea realmente capire cosa posti di lavoro che possono essere eseguiti interagendo con il controllo dei job con i database di sistema. In seguito si potrebbe creare un servizio web ed effettivamente distribuire posti di lavoro piuttosto che i lavoratori fare il lavoro duro se stessi, ma per il momento continueremo con il principio KISS (Keep it Simple, Stupid!).
Quindi, consente di creare tre mySQL tabelle a che fare con posti di lavoro. Questi saranno `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 si compone di 5 campi semplici,
- id: Identificare in modo univoco il lavoro
- Nome: Potrebbe essere un cliente di riferimento, o un qualsiasi numero di altri identificatori
- Stato: è necessario sapere dove il lavoro è a, per 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 lavoratori dai loro indirizzi IP sulla rete
- started_at: Quando il lavoratore iniziare il lavoro? Tracciando i lavori che non hanno completato entro quantità X di tempo sappiamo che abbiamo bisogno di raccogliere ancora una volta il lavoro e avviare l'elaborazione di 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 per consentire il monitoraggio delle statistiche, una colonna di tempo finale per vedere quanto tempo il lavoro ha avuto, un contatore per vedere quanti lavoratori prese il posto di lavoro (ovviamente questo deve tendono a 1), la priorità di lavoro, la lista può continuare a lungo. In scenari più complessi di lavoro sarebbe possibile specificare la quantità di memoria il lavoratore avrebbe bisogno di accedere a (e quindi utilizzare solo i lavoratori adatti), o anche che tipo di lavoratore sarebbe necessario.
Consente di aggiungere un paio di lavori di esempio:
La tabella successiva è ancora abbastanza semplice da capire, questi sono i nostri registri di lavoro. Esse sono legate alla tabella principale di posti di lavoro da una colonna `jobs_id`. Il make up di questa tabella molto dipende dai dati che avete bisogno di fornire ai propri lavoratori, consente di fare un esempio molto semplice in cui abbiamo quattro colonne:
- id: ID del record
- name: nome di persona
- indirizzo: indirizzo Person
- jobs_id: l'ID di lavoro che questo disco è legata alla
La terza tabella e finale consiste in una tabella dei risultati, ha più o meno allo stesso compongono la nostra tabella i record e con l'aggiunta di alcune colonne potrebbero essere parte della tabella record:
- job_record_id: Link il risultato al tavolo di lavoro
- risultato: I dati dei risultati
... E questo è tutto ciò che serve per il controllo del lavoro! (Anche se a un livello molto elementare) Nel mio caso ho fatto a 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 affermato precedentemente, i lavoratori faremo del nostro gestione dei lavori per noi, per ora, quindi tutto quello che dobbiamo fare è veramente trovare un lavoro che ha bisogno di elaborazione e ottenere le informazioni. Come lo facciamo? Bene scegliere i nostri criteri di selezione di lavoro e cercano un lavoro, in SQL ho fatto la seguente:
- Prendete tutti i processi che non sono contrassegnati come completo ma dal nostro lavoratore e ripristinarle (__ME__ sostituire con un identificatore, più semplice sarebbe indirizzo IP):
UPDATE `lavoro` SET `status` = 0 dove `status` = 1 `E` 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 () DOVE `status` = 0 O
(`Status` = 1 `E` started_at> DATE_SUB (NOW (), INTERVAL ORA X)) ORDER BY `id` ASC;
Afferrando i lavori che non hanno prodotto risultati in quantità X di tempo ci assicuriamo che tutti i lavori vengono eseguiti in caso di un lavoratore crash o andare AWOL.
- Avanti afferrare i dettagli di posti di lavoro seguita 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 più completo. Ricorda come i lavori possono suspend / resume in ogni 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 del 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 astraendo il vostro lavoro di controllo 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 sopra di esso.
Lavoro di configurazione
L'aspetto da considerare è la dimensione del lavoro e di configurazione. Giocando con la configurazione di lavoro si può trovare un ottimo equilibrio tra velocità, processo di replica, e affidabilità. Prendete un paio di scenari ofa:
- Lavori prendere 1 giorno ciascuno a correre: questo significa che il tuo lavoratori hanno bisogno di 15 giorni per ogni processo di lavoro (si ricordi il 10% della potenza per 2/3rds del tempo). Questo chiaramente non è un saggio di configurazione, la tua dimensione del lavoro è troppo grande! Ci vorrebbe almeno il doppio del tempo per ottenere un lavoro elaborato il lavoratore deve andare AWOL iniziale (tempo di prendere che non ha restituito un risultato più il tempo di ritrattamento). In un ideale che avresti avuto almeno un lavoro pieno facilmente eliminato entro la fine di ogni lungo periodo di inattività, in questo modo si mantiene il ticchettio di posti di lavoro più e nel peggiore caso un posto di lavoro avrebbe preso due giorni per il primo processo dovrebbe andare dispersi.
- Lavori prendere 1 minuto per eseguire: Questo significa che i vostri dipendenti impiegano circa 15 minuti per eseguire ogni lavoro. Anche se questo può inizialmente sembrare ideale, si guadagna ulteriori elaborazioni lavoro durante l'ora di pranzo, coffee break, incontri, ecc questo scenario gravano su altre aree del sistema e presenta i suoi problemi. Per esempio, in primo luogo la configurazione / elaborazione rapporto tempo sta per andare a destra verso il basso, perdendo così l'efficienza del sistema. La rete sta per essere costantemente in streaming informazioni sul lavoro al personale frustrante vari lavoratori che sono dong il loro lavoro quotidiano. Sei anche andando a mettere più pressione sul vostro server l'elaborazione dei processi in quanto deve servire fuori un sacco di piccoli pezzi di lavoro su base regolare. Infine, in questa situazione se il server di lavoro va giù che si vuole creare un registro enorme ritorno di opera incompiuta, mentre più posti di lavoro potrebbe di continuare il trattamento beatamente ignaro che il server di lavoro era in difficoltà.
In realtà non ci sarà alcuna configurazione quello ideale per la configurazione della rete, molto dipende dalle risorse disponibili, i tipi di lavoro, i requisiti di turnaround lavoro a tempo, la capacità di rete, e così via. Tuttavia alcune linee guida potrebbe essere:
- Lavori di dimensioni in modo che ogni lavoratore può ottenere attraverso almeno 3-4 lavori in un periodo di 15 ore (il più lungo periodo di probabile tempo di inattività)
- Gioca con la dimensione del lavoro in modo che i tempi di configurazione diventa piuttosto insignificante rispetto al tempo di elaborazione (tenendo conto del punto precedente).
- Se un processo non si completa in doppio della quantità di tempo (forse meno) ci si aspetta di completare lo supporre che la sua AWOL andato e avviare l'elaborazione con un altro lavoratore. Ciò 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 successivo fallisce). 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.
- Lavori dovrebbero essere indipendenti dei requisiti di fuori quanto più possibile. Il server di lavoro, ad esempio, deve essere contattato all'inizio e alla fine di ciascun lavoro.
- Non saturare la rete, questo avrà due effetti negativi, il personale durante il giorno si trova utilizzando la rete frustrante e problemi possono essere sperimentati con connessioni in timeout un problema che potrà solo peggiorare, come si scala la griglia.
- Assicurarsi che i lavori possono essere eseguiti sul vostro lavoratori. Se i processi diventano troppo spazio di memoria di lavoro intensivo o intensivo del disco partirà l'interruzione e l'unica cosa che noterete è un calo nel numero di lavori elaborati senza alcun vero motivo.
Risultati Invio di un lavoro
Nel presentare i risultati di un lavoro, è importante verificare che i risultati non siano stati presentati da un altro lavoratore, soprattutto se il lavoratore corrente è stato sospeso per qualche tempo.
Quando i risultati sono presentati in modo che il numero di risultati corrisponde al numero di record all'interno del processo.
Come detto in precedenza, e non possono essere più enfatizzato, 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 di volte e questo ha bisogno di essere soddisfatti. Inoltre ancora una volta rendere astratta 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 di base creato. 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 di risultati al server di controllo del lavoro è stato presentato.
- Un server di controllo del lavoro gestisce i lavori 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
- Configura il tuo lavoro per garantire che vengano eseguiti in modo rapido ed efficiente, senza mettere troppa pressione sulla vostra infrastruttura di rete, e senza duplicazione di compiti di elaborazione su base regolare.
- Assicurarsi di costruire la tolleranza ai guasti e checking errore nella vostra routine, i lavoratori possono sospendere e riprendere e il più scomodo di volte. Ricordati di controllare se i risultati sono già stati presentati da un altro lavoratore.
La prossima volta
Nella parte 3 creeremo la nostra macchina virtuale di elaborazione e impostare le nostre macchine finestre per diventare inattivo lavoratori a tempo parziale.