2016-06-17 62 views

risposta

6

È possibile utilizzare mod_proxy_balancer. Il modo in cui lo configuri dipende dal client MarkLogic che desideri utilizzare. Se si desidera utilizzare Java Client API, seguire il secondo esempio here per consentire a Apache di generare cookie di appiccicosità. Se si desidera utilizzare XCC, configurarlo per utilizzare lo strumento generato da ML-Server o generato da backend "SessionID" cookie.

La differenza qui è che XCC utilizza sessioni mentre l'API del client Java si basa sull'API REST che è stateless, quindi non ci sono sessioni. Tuttavia, anche nell'API client Java quando si utilizzano transazioni con richieste multiple, che impone lo stato per la durata di tale transazione, pertanto il servizio di bilanciamento del carico ha bisogno di un modo per instradare le richieste durante tale transazione sul nodo corretto nel cluster MarkLogic. Il cookie di stickiness verrà nuovamente inviato dall'API del client Java con ogni richiesta che utilizza una transazione, in modo che il servizio di bilanciamento del carico possa mantenere tale aderenza per le richieste relative a tale transazione.

Come sempre, eseguire alcuni test della configurazione per assicurarsi di averlo fatto correttamente. La corretta configurazione dei plugin di Apache è un'abilità avanzata. Dal momento che sei nuovo nell'apache, la tua migliore speranza di assicurarti di aver capito bene è controllare con uno strumento di monitoraggio HTTP come WireShark per esaminare il traffico HTTP dalla tua applicazione a MarkLogic Server per assicurarti che le cose vadano nel nodo corretto nel cluster come previsto.

+0

Thx è stato davvero utile :-) –

1

Si noti che anche con le API client (Java, Node.js) non è sempre ovvio o esplicito al livello dell'API della lingua che potrebbe causare la creazione di una sessione. La creazione esplicita di transazioni multiistruzione definately lo farà, ma anche altre operazioni potrebbero farlo. Se si utilizza la stessa connessione per l'interfaccia utente (browser) e l'API (REST o XCC), è probabile che l'app del browser esegua operazioni che creano lo stato della sessione.

La configurazione più sicura, ma meno flessibile è "TCP Session Affinity". Se sono supportati elimineranno la maggior parte delle preoccupazioni relative al bilanciamento del carico. Cookie Session Affinity si basa sulla garanzia che il load balencer utilizzi il cookie corretto. Non tutto il codice è uguale. Ho avuto casi in cui il bilanciamento del carico non utilizzava sempre il cookie fornito. La modifica della configurazione in "Affinità cookie fornita da Load Balancer" ha risolto questo problema.

Nessuno di questi è necessario se tutte le comunicazioni sono stateless sul livello TCP, sul livello HTTP e sul livello dell'app. Il successivo non può essere dedotto dal server. Un altro conern è se l'app o il livello intermedio è in co-residenza con altre app o la stessa app che si connette allo stesso bilanciamento del carico e alla stessa porta. Può essere difficile accertarsi che non ci siano "fili incrociati". Quando ML riceve una richiesta, associa la sua identità con l'IP e la porta del client. Anche senza load balencer, la maggior parte delle moderne librerie client HTTP e TCP implementano il caching del socket. Una grande vittoria della perfomrance, ma una fonte nascosta di sottili errori casuali casuali se la libreria o l'app condividono "cookie jar" (non insoliti). Una cache TCP e Cookie Jar utilizzata da diversi contesti applicativi può finire per inviare informazioni di stato da un'app non correlata nello stesso processo a un'altra. Principalmente si tratta di server di applicazioni di medio livello che possono semplicemente passare richieste dal primo livello senza conoscenza del dominio, presumendo che fare affidamento sulle librerie TCP di basso livello per "fare la cosa giusta" ... Stanno facendo la cosa giusta - per il caso d'uso che i programmatori di biblioteca avevano in mente - non dare per scontato che il tuo caso sia quello assunto dagli autori della biblioteca.I sintomi tendono ad essere molto rari, ma i problemi catastrofici con errori di transazione e possibilmente corruzione dei dati e problemi di sicurezza (a livello di applicazione) perché il server non può dire la differenza tra 2 connessioni dallo stesso livello intermedio.

A volte una strategia migliore consiste nel bilanciamento del carico tra il primo livello e il livello intermedio e connettersi direttamente dal livello intermedio a MarkLogic. Specialmente se la memorizzazione nella cache è eseguita nel servizio di bilanciamento del carico. È più comune che la memorizzazione nella cache sia utile tra il livello intermedio e il client, quindi il livello intermedio e il server. Ciò è anche più analogo alla classica architettura a 3 livelli utilizzata con RDBMS ... dove il bilanciamento del carico è tra client e livelli di logica aziendale non tra business logic e database.