Haute disponibilité¶
Vous pouvez déployer Drovio Server en haute disponibilité pour éviter toute interruption qui dégraderait l'expérience des utilisateurs. Drovio Server s'appuie pour cela sur le clustering Hazelcast.
Déployer plusieurs instances¶
Déployez Drovio Server sur au moins deux machines distinctes. Assurez-vous que chaque instance est configurée de la même façon.
Vous devrez héberger la base de données sur une machine à part, afin qu'elle soit joignable par les deux instances. Drovio Server ne prend en charge que PostgreSQL 14 et supérieur.
Tailles des pools
Réglez soigneusement les deux tailles de pool
(pool_options.main.max_size et pool_options.licensing.max_size)
sur chaque instance : leur somme globale doit rester inférieure au nombre
maximal de connexions que votre base peut accepter. Par exemple, avec
max_connections = 60 et deux instances, fixez les deux max_size à 15 sur
chaque instance.
Vous pouvez relever la valeur du maximum de connexions avec l'outil
PostgreSQL psql, par show max_connections;.
Activer le clustering¶
Ouvrez le fichier de propriétés du cluster :
/etc/drovio-server/cluster.properties
C:\ProgramData\Drovio\Drovio Server\cluster.properties
Puis :
- Passez
enabledàtrue. - Vérifiez que
config_pathdésigne bien le fichiercluster.xml, normalement situé dans le même dossier quecluster.properties. - Renseignez
hostavec l'IP privée de la machine, celle qui sert à communiquer avec les autres membres du cluster, ou0.0.0.0pour écouter sur toutes les interfaces disponibles. - Vous pouvez laisser
portà0: Vert.x choisit automatiquement un port libre et Hazelcast l'annonce aux autres membres lors de la découverte. Ne fixez un port que si vos règles de pare-feu l'exigent.
Configurer le clustering¶
Ouvrez le fichier XML du cluster :
/etc/drovio-server/cluster.xml
C:\ProgramData\Drovio\Drovio Server\cluster.xml
Vous devez modifier le contenu de la balise <network></network>, les autres
balises ne devant pas être touchées. Plusieurs options s'offrent alors à vous pour
que vos instances se découvrent mutuellement.
Le multicast doit être activé sur votre réseau pour que cela fonctionne.
Renseignez les IP statiques des autres membres, en veillant à désactiver le 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>
Toutes ces balises sont facultatives. Sans access-key ni secret-key, le
rôle IAM est utilisé, ce qui est recommandé, et il en va de même pour
iam-role. region vaut us-east-1 par défaut, et host-header vaut
ec2.amazonaws.com, auquel cas region ne doit pas être renseigné. Enfin,
security-group-name puis le couple tag-key et tag-value restreignent la
découverte aux instances correspondantes.
Le plus simple pour démarrer avec la découverte AWS EC2 est de :
- Créer un rôle IAM disposant de la permission
ec2:DescribeInstances. - L'attribuer à chaque instance.
- N'utiliser que
region,tag-keyettag-value.
Pour aller plus loin : README de hazelcast-aws.
Si les machines disposent de plusieurs interfaces réseau, par exemple en présence
d'un VPN, vous pouvez indiquer à Hazelcast laquelle utiliser avec la balise
<interface></interface> :
<network>
<join>
[…]
</join>
<interfaces enabled="true">
<interface>192.168.1.20</interface>
</interfaces>
</network>
L'adresse indiquée est celle associée à votre interface réseau. Pour aller plus loin : Hazelcast, mécanismes de découverte.
Démarrer le cluster¶
Démarrez chaque instance une par une. Surveillez les journaux et attendez une entrée comme celle ci-dessous avant de démarrer la suivante, en général une dizaine de secondes entre chaque démarrage :
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
}
Mettre à jour le cluster¶
Lorsque vous devez mettre à jour Drovio Server, procédez une instance à la fois pour éviter toute interruption et pour ne pas perdre les données partagées entre les instances. Arrêtez l'instance manuellement, consultez les journaux de l'autre instance et attendez une entrée de ce type avant de lancer la mise à jour :
Bascule d'adresse (Linux uniquement)¶
Votre cluster fonctionne, mais les instances ont des adresses IP différentes. Vous voudrez configurer une bascule d'adresse simple, pour qu'une seule IP puisse désigner l'une ou l'autre instance. Sous Linux, keepalived s'y prête bien.
Le principe est assez simple :
- Pour deux instances, vous disposez de trois adresses IP, dont une partagée par les deux instances.
- Vous désignez l'instance maître et l'instance de secours.
- L'IP partagée, par exemple
10.0.12.16, désigne l'instance maître, par exemple10.0.12.17. - Quand l'instance maître tombe, l'IP partagée désigne alors l'instance de
secours, par exemple
10.0.12.18.
keepalived doit être déployé sur toutes vos instances Drovio pour que cela fonctionne.
La bascule d'adresse est la solution la plus rapide quand vous voulez garantir la disponibilité du service. Lorsque le clustering est activé, Drovio Server répartit déjà en interne une bonne partie des opérations. En revanche, les requêtes HTTP aboutissent toujours sur la même instance, et les connexions WebSocket que Drovio Server maintient avec les clients actifs sont elles aussi portées par la même instance. Vous voudrez donc sans doute répartir la charge sur l'ensemble de l'installation à mesure que la charge et le nombre d'utilisateurs augmentent.
Répartition de charge (Linux uniquement)¶
La répartition de charge s'obtient avec HAProxy ou Nginx (Plus). Drovio Server est une application HTTP et WebSocket. Il vous faut au moins une machine supplémentaire sur laquelle déployer HAProxy ou Nginx.
Warning
Dans ce scénario, si la machine de répartition tombe, tout le service tombe avec elle. Vous voudrez sans doute déployer au moins deux machines supplémentaires et les combiner avec une technique de bascule comme celle décrite plus haut, par exemple HAProxy et keepalived.
- Documentation de HAProxy
- Déploiement rapide de HAProxy avec prise en charge des WebSockets
- Répartition de charge Nginx avec prise en charge des WebSockets, page consacrée à Node.js, Drovio Server reposant sur Vert.x devrait se comporter de la même façon.
AWS Elastic Load Balancing¶
Si les instances de Drovio Server sont déployées sur Amazon AWS, vous pouvez monter rapidement un répartiteur avec AWS ELB. Bascule, répartition de charge, WebSockets, tout est pris en charge et ne demande que quelques clics. Reportez-vous à la documentation AWS, Application Load Balancer.
Drainage des connexions
Lorsque vous devez arrêter une instance pour maintenance, retirez-la temporairement du groupe cible et attendez la fin du drainage avant de l'arrêter réellement. Sans cela, l'ELB renverra des réponses HTTP 502 pendant environ une minute, la connexion persistante avec l'instance arrêtée étant rompue.
Réponse multivaleur AWS Route 53¶
Si votre nom de domaine est géré par AWS Route 53, une autre solution est la politique de routage à réponse multivaleur. Associé à des contrôles de santé, le DNS répond aux requêtes avec l'IP de l'une ou l'autre instance encore debout, jusqu'à huit, à tour de rôle. Voir politiques multivaleur et simple.
Note
La connexion entre un client Drovio et le cluster met plus de temps à se rétablir qu'avec la méthode ELB, environ cinq secondes pour l'ELB contre trente secondes à une minute pour la réponse multivaleur. En revanche, pendant le basculement, les sessions de partage d'écran en cours ne sont pas interrompues, grâce à l'architecture pair à pair de Drovio.