Vue normale

Reçu avant avant-hier

H2DB - Mettre en place une réplication sur un cluster

3 mars 2025 à 08:35

Concept :

  • Vous avez une base H2 sur le réseau.
  • Vous en avez setupé une autre ailleurs sur le réseau.
  • Toutes les actions en écriture effectuées sur la première seront répliquées sur les autres. Ca nous fait donc des backups à pas cher.

Comment faire ?

  1. On démarre les instances A et B
# Instance A
java org.h2.tools.Server
    -tcp -tcpPort 9101
    -baseDir instance-A

# Instance B
java org.h2.tools.Server
    -tcp -tcpPort 9102
    -baseDir instance-B

Puis on démarre une troisième instance qui sera le cluster des deux autres :

# Cluster
java org.h2.tools.CreateCluster
    -urlSource jdbc:h2:tcp://localhost:9101/~/test
    -urlTarget jdbc:h2:tcp://localhost:9102/~/test
    -user sa
    -serverList localhost:9101,localhost:9102

Notre application se contentera de se connecter au cluster qui fera la réplication lui-même.

Nota Bene

  • Ce système ne marche pas avec une base embarquée !
  • Ce système effectue toujours les requêtes sur le premier nœud, le second n'est là que comme backup.

Et en cas de plantage ?

Simple, il suffit de :

  1. Se rendre sur le nœud qui est tombé.
  2. Dropper les datafiles.
  3. Relancer l'instance.
  4. Relancer le cluster (qui se chargera de répliquer tout sur l'instance remise à zéro).

Cette procédure de restauration peut prendre du temps sur les grosses bases mais je vois mal un SI de plusieurs tera-octets sur H2DB de toutes façons. Par contre, et au vu de la simplicité de configuration/installation de H2, ça peut être bien pour des BDD de moins de 32 Go

Pourquoi 32 Go et pas plus ?
Car avec une vitesse de réplication de 10 Mo / sec, ce qui est assez fréquent sur des petits VPS, la réplication des 32 Go prendra moins d'une heure, ce qui reste acceptable. Quant aux petites bases de moins de 1 Go, en 1 ou 2 minutes tout sera plié.

Pour peu qu'on ait mis en place un monitoring des instances et un rôle Ansible capable de restaurer les nœud déclenché par un hook, alors la procédure peut se faire automatiquement et sans effort, et j'aime le DevOps facile :D
Liens directs

❌