2013-03-20 19 views
9

Ho un piccolo gruppo di server che devo tenere sincronizzati. Il mio pensiero iniziale su questo era quello di avere un server "master" e pubblicare aggiornamenti usando la funzionalità pub/sub di redis (dato che stiamo già usando redis per lo storage) e lasciando che gli altri server nel cluster, gli slave, eseguano il polling degli aggiornamenti in un compito a lungo termine. Questo sembrava essere un metodo semplice per mantenere tutto in sincrono, ma poi ho pensato all'ovvia questione: cosa accadrebbe se il mio "maestro" dovesse cadere? È qui che ho iniziato a studiare le tecniche per assicurarmi che ci sia sempre un maestro, che mi ha portato a leggere idee come l'elezione del leader. Alla fine, sono incappato su Apache Zookeeper (tramite binding Python, "pettingzoo"), che a quanto pare si occupa di gran parte della logica di tolleranza agli errori per voi. Potrei essere in grado di scrivere il mio codice di selezione del leader, ma immagino che non sarebbe vicino a qualcosa che è stato provato e testato, come Zookeeper.sincronizzazione server zookeeper vs redis

Il mio problema principale con l'utilizzo di Zookeeper è che è solo un altro componente che potrei aggiungere al mio setup inutilmente quando potrei ottenere con qualcosa di più semplice. Qualcuno ha mai usato i redis in questo modo? O c'è qualche altro semplice metodo che posso usare per ottenere il tipo di funzionalità che sto cercando di ottenere?

Maggiori informazioni su pettingzoo (slideshare)

risposta

13

ho paura non esiste un metodo semplice per ottenere elevata disponibilità. Di solito è difficile da configurare e difficile da testare. Esistono diversi modi per ottenere l'HA, da classificare in due categorie: clustering fisico e clustering logico.

Clustering locale riguarda l'utilizzo di meccanismi hardware, di rete e di sistema operativo per raggiungere l'HA. Su Linux, puoi dare un'occhiata a Pacemaker che è una vera soluzione open source in arrivo con tutte le distribuzioni aziendali. Se si desidera incorporare direttamente funzionalità di clustering nella propria applicazione (in C), è possibile controllare lo Corosync cluster engine (utilizzato anche da Pacemaker). Se si prevede di utilizzare software commerciale, Veritas Cluster Server è una soluzione HA ben collaudata (ma costosa) multipiattaforma.

Il clustering logico consiste nell'utilizzare algoritmi di fantasia distribuiti (come l'elezione del leader, PAXOS, ecc.) Per raggiungere l'HA senza fare affidamento su specifici meccanismi di basso livello. Questo è ciò che forniscono servizi come Zookeeper.

Zookeeper è un archivio gerarchico coerente, ordinato e costruito sulla parte superiore del protocollo ZAB (abbastanza simile a PAXOS). È abbastanza robusto e può essere utilizzato per implementare alcune funzionalità HA, ma non è banale e occorre installare la JVM su tutti i nodi. Per buoni esempi, si può dare un'occhiata ad alcuni recipes e l'eccellente libreria Curator da Netflix. In questi giorni, Zookeeper viene utilizzato ben oltre i contesti puri di Hadoop e IMO, questa è la soluzione migliore per costruire un'infrastruttura logica HA.

Redis pub/sub meccanismo non è abbastanza affidabile per implementare un cluster logico, perché i messaggi non letti andranno persi (non è prevista la messa in coda di elementi con pub/sub). Per ottenere l'HA di una raccolta di istanze di Redis, puoi provare Redis Sentinel, ma non si estende al tuo software.

Se si è pronti per programmare in C, un framework HA che viene spesso dimenticato (ma può essere abbastanza utile IMO) è quello in arrivo con BerkeleyDB. È piuttosto elementare, ma supporta elezioni ufficiali e può essere integrato in qualsiasi ambiente. La documentazione può essere trovata here e here. Nota: non è necessario memorizzare i dati con BerkeleyDB per beneficiare del meccanismo HA (solo i dati di topologia - gli stessi che si inseriscono in Zookeeper).