Alta disponibilità¶
Potete distribuire Drovio Server in alta disponibilità per evitare qualsiasi interruzione che degraderebbe l'esperienza degli utenti. Drovio Server si appoggia a tal fine sul clustering Hazelcast.
Distribuire più istanze¶
Distribuite Drovio Server su almeno due macchine distinte. Assicuratevi che ogni istanza sia configurata allo stesso modo.
Dovrete ospitare la base di dati su una macchina a parte, affinché sia raggiungibile da entrambe le istanze. Drovio Server supporta solo PostgreSQL 14 e superiore.
Dimensioni dei pool
Impostate con cura le due dimensioni di pool
(pool_options.main.max_size e pool_options.licensing.max_size)
su ogni istanza: la loro somma complessiva deve restare inferiore al numero
massimo di connessioni che la vostra base può accettare. Per esempio, con
max_connections = 60 e due istanze, fissate entrambi i max_size a 15 su
ogni istanza.
Potete rilevare il valore del massimo di connessioni con lo strumento
PostgreSQL psql, tramite show max_connections;.
Attivare il clustering¶
Aprite il file di proprietà del cluster:
/etc/drovio-server/cluster.properties
C:\ProgramData\Drovio\Drovio Server\cluster.properties
Poi:
- Portate
enabledatrue. - Verificate che
config_pathdesigni effettivamente il filecluster.xml, normalmente situato nella stessa cartella dicluster.properties. - Valorizzate
hostcon l'IP privato della macchina, quello che serve a comunicare con gli altri membri del cluster, oppure0.0.0.0per ascoltare su tutte le interfacce disponibili. - Potete lasciare
porta0: Vert.x sceglie automaticamente una porta libera e Hazelcast la annuncia agli altri membri durante la scoperta. Fissate una porta solo se le vostre regole di firewall lo esigono.
Configurare il clustering¶
Aprite il file XML del cluster:
/etc/drovio-server/cluster.xml
C:\ProgramData\Drovio\Drovio Server\cluster.xml
Dovete modificare il contenuto del tag <network></network>, mentre gli altri tag
non devono essere toccati. Vi si offrono allora più opzioni perché le vostre
istanze si scoprano a vicenda.
Il multicast deve essere attivato sulla vostra rete perché ciò funzioni.
Valorizzate gli IP statici degli altri membri, avendo cura di disattivare il multicast.
<network>
<join>
<multicast enabled="false"/>
<aws enabled="true">
<access-key>my-access-key</access-key>
<secret-key>my-secret-key</secret-key>
<iam-role>role</iam-role>
<region>us-west-1</region>
<host-header>ec2.amazonaws.com</host-header>
<security-group-name>hazelcast-sg</security-group-name>
<tag-key>type</tag-key>
<tag-value>hz-nodes</tag-value>
</aws>
</join>
</network>
Tutti questi tag sono facoltativi. Senza access-key né secret-key viene
usato il ruolo IAM, il che è raccomandato, e lo stesso vale per iam-role.
region vale us-east-1 per impostazione predefinita, e host-header vale
ec2.amazonaws.com, nel qual caso region non deve essere valorizzato.
Infine, security-group-name e poi la coppia tag-key e tag-value
restringono la scoperta alle istanze corrispondenti.
Il modo più semplice per cominciare con la scoperta AWS EC2 è:
- Creare un ruolo IAM dotato del permesso
ec2:DescribeInstances. - Attribuirlo a ogni istanza.
- Usare solo
region,tag-keyetag-value.
Per approfondire: README di hazelcast-aws.
Se le macchine dispongono di più interfacce di rete, per esempio in presenza di
una VPN, potete indicare a Hazelcast quale usare con il tag
<interface></interface>:
<network>
<join>
[…]
</join>
<interfaces enabled="true">
<interface>192.168.1.20</interface>
</interfaces>
</network>
L'indirizzo indicato è quello associato alla vostra interfaccia di rete. Per approfondire: Hazelcast, meccanismi di scoperta.
Avviare il cluster¶
Avviate ogni istanza una alla volta. Sorvegliate i log e attendete una voce come quella qui sotto prima di avviare la successiva, in genere una decina di secondi tra un avvio e l'altro:
Members [2] {
Member [192.168.1.105]:5701 - 899898be-b8aa-49aa-8d28-40917ccba56c
Member [192.168.1.105]:5702 - d6b81800-2c78-4055-8a5f-7f5b65d49f30 this
}
Aggiornare il cluster¶
Quando dovete aggiornare Drovio Server, procedete un'istanza alla volta per evitare ogni interruzione e per non perdere i dati condivisi tra le istanze. Arrestate l'istanza manualmente, consultate i log dell'altra istanza e attendete una voce di questo tipo prima di lanciare l'aggiornamento:
Commutazione di indirizzo (solo Linux)¶
Il vostro cluster funziona, ma le istanze hanno indirizzi IP differenti. Vorrete configurare una semplice commutazione di indirizzo, affinché un solo IP possa designare l'una o l'altra istanza. Su Linux, keepalived si presta bene allo scopo.
Il principio è piuttosto semplice:
- Per due istanze disponete di tre indirizzi IP, uno dei quali condiviso dalle due istanze.
- Designate l'istanza master e l'istanza di riserva.
- L'IP condiviso, per esempio
10.0.12.16, designa l'istanza master, per esempio10.0.12.17. - Quando l'istanza master cade, l'IP condiviso designa allora l'istanza di
riserva, per esempio
10.0.12.18.
keepalived deve essere distribuito su tutte le vostre istanze Drovio perché ciò funzioni.
La commutazione di indirizzo è la soluzione più rapida quando volete garantire la disponibilità del servizio. Quando il clustering è attivato, Drovio Server distribuisce già internamente buona parte delle operazioni. Per contro, le richieste HTTP arrivano sempre sulla stessa istanza, e le connessioni WebSocket che Drovio Server mantiene con i client attivi sono anch'esse portate dalla stessa istanza. Vorrete quindi senza dubbio distribuire il carico sull'insieme dell'installazione man mano che il carico e il numero di utenti aumentano.
Bilanciamento del carico (solo Linux)¶
Il bilanciamento del carico si ottiene con HAProxy o Nginx (Plus). Drovio Server è un'applicazione HTTP e WebSocket. Vi serve almeno una macchina supplementare su cui distribuire HAProxy o Nginx.
Warning
In questo scenario, se la macchina di bilanciamento cade, tutto il servizio cade con lei. Vorrete senza dubbio distribuire almeno due macchine supplementari e combinarle con una tecnica di commutazione come quella descritta più sopra, per esempio HAProxy e keepalived.
- Documentazione di HAProxy
- Distribuzione rapida di HAProxy con supporto dei WebSocket
- Bilanciamento del carico Nginx con supporto dei WebSocket, pagina dedicata a Node.js; Drovio Server, poggiando su Vert.x, dovrebbe comportarsi allo stesso modo.
AWS Elastic Load Balancing¶
Se le istanze di Drovio Server sono distribuite su Amazon AWS, potete allestire rapidamente un bilanciatore con AWS ELB. Commutazione, bilanciamento del carico, WebSocket, tutto è supportato e richiede solo qualche clic. Fate riferimento alla documentazione AWS, Application Load Balancer.
Drenaggio delle connessioni
Quando dovete arrestare un'istanza per manutenzione, ritiratela temporaneamente dal gruppo di destinazione e attendete la fine del drenaggio prima di arrestarla davvero. Senza questo, l'ELB restituirà risposte HTTP 502 per circa un minuto, dato che la connessione persistente con l'istanza arrestata risulta interrotta.
Risposta multivalore AWS Route 53¶
Se il vostro nome di dominio è gestito da AWS Route 53, un'altra soluzione è la politica di instradamento a risposta multivalore. Associato a controlli di salute, il DNS risponde alle richieste con l'IP dell'una o dell'altra istanza ancora in piedi, fino a otto, a turno. Vedere politiche multivalore e semplice.
Note
La connessione tra un client Drovio e il cluster impiega più tempo a ristabilirsi che con il metodo ELB, circa cinque secondi per l'ELB contro trenta secondi o un minuto per la risposta multivalore. Per contro, durante la commutazione, le sessioni di condivisione dello schermo in corso non vengono interrotte, grazie all'architettura peer-to-peer di Drovio.