La version 6.0 de la base de données distribuée rqlite a été présentée, utilisant SQLite comme moteur de stockage et permettant l'organisation d'un cluster de dépÎts synchronisés. Parmi les caractéristiques de rqlite, on note la simplicité d'installation, de déploiement et de maintenance d'un stockage distribué tolérant aux pannes, similaire à etcd et Consul, mais utilisant un modÚle relationnel pour le travail avec les données au lieu d'un format clé/valeur. Le code du projet est écrit en Go et est distribué sous licence MIT.
Pour maintenir tous les nĆuds dans un Ă©tat synchronisĂ©, l'algorithme de consensus Raft est utilisĂ©. Rqlite utilise la bibliothĂšque SQLite originale et le driver standard go-sqlite3, sur lesquelles repose une couche qui traite les requĂȘtes des clients, effectue la rĂ©plication vers d'autres nĆuds et suit l'atteinte du consensus sur le choix du nĆud leader.
Les modifications dans la base de donnĂ©es peuvent ĂȘtre apportĂ©es uniquement par le nĆud dĂ©signĂ© comme leader, mais les connexions pour les opĂ©rations d'Ă©criture peuvent Ă©galement ĂȘtre dirigĂ©es vers d'autres nĆuds du cluster, qui retourneront l'adresse du leader pour rĂ©itĂ©rer la requĂȘte (la prochaine version promet d'ajouter un passage automatique Ă travers le leader). L'accent est mis sur la tolĂ©rance aux pannes, donc le SGBD ne se dĂ©veloppe que pour les opĂ©rations de lecture, tandis que les opĂ©rations d'Ă©criture reprĂ©sentent un goulot d'Ă©tranglement. Il est possible de lancer un cluster rqlite Ă partir d'un seul nĆud, et cette solution peut ĂȘtre utilisĂ©e pour organiser l'accĂšs Ă SQLite via HTTP sans fournir de tolĂ©rance aux pannes.
Les donnĂ©es SQLite sur chaque nĆud ne sont pas stockĂ©es dans un fichier, mais en mĂ©moire. Au niveau de la couche d'implĂ©mentation du protocole Raft, un journal de toutes les commandes SQLite qui entraĂźnent des modifications de la base de donnĂ©es est conservĂ©. Ce journal est utilisĂ© lors de la rĂ©plication (rĂ©plication au niveau de la lecture des requĂȘtes sur d'autres nĆuds), du lancement d'un nouveau nĆud ou de la rĂ©cupĂ©ration aprĂšs une perte de connectivitĂ©. Pour rĂ©duire la taille du journal, une compression automatique est appliquĂ©e, qui est lancĂ©e aprĂšs un certain nombre de modifications et entraĂźne la sauvegarde sur disque d'un instantanĂ©, Ă partir duquel un nouveau journal commence Ă ĂȘtre tenu (l'Ă©tat de la base de donnĂ©es en mĂ©moire est identique Ă l'instantanĂ© + le journal des modifications accumulĂ©es).
Caractéristiques de rqlite :
- Simplicité de déploiement du cluster, sans nécessiter d'installation séparée de SQLite.
- Possibilité d'obtenir rapidement un stockage SQL répliqué.
- PrĂȘt Ă ĂȘtre utilisĂ© dans des projets de production.
- La disponibilitĂ© d'une API HTTP(S) permettant de mettre Ă jour les donnĂ©es en mode batch et de dĂ©terminer le nĆud principal du cluster. Une interface en ligne de commande est Ă©galement fournie, ainsi que la possibilitĂ© d'utiliser diverses bibliothĂšques clientes conçues pour SQLite.
- DisponibilitĂ© d'un service pour identifier d'autres nĆuds, permettant de crĂ©er des clusters de maniĂšre dynamique.
- Support du chiffrement des Ă©changes de donnĂ©es entre les nĆuds.
- Possibilité de configurer le niveau de vérification de l'actualité et de la cohérence des données lors de la lecture.
- PossibilitĂ© optionnelle de connecter des nĆuds en mode lecture seule, ne participant pas Ă la dĂ©termination du consensus et utilisĂ©s pour augmenter la scalabilitĂ© du cluster pour les opĂ©rations de lecture.
- Support d'une forme propre des transactions basĂ©e sur la fusion de commandes dans une seule requĂȘte (les transactions basĂ©es sur BEGIN, COMMIT, ROLLBACK, SAVEPOINT et RELEASE ne sont pas supportĂ©es).
- Support de la création de sauvegardes à chaud.
La nouvelle version apporte des modifications architecturales significatives visant Ă amĂ©liorer la fiabilitĂ© du cluster grĂące Ă l'optimisation du routage des requĂȘtes de lecture et d'Ă©criture vers les nĆuds appropriĂ©s du cluster. Les nĆuds rqlite peuvent dĂ©sormais multiplexe entre plusieurs connexions logiques en utilisant des connexions TCP Ă©tablies entre les nĆuds par le protocole Raft. Si une requĂȘte nĂ©cessite les droits du nĆud principal mais est envoyĂ©e Ă un nĆud secondaire, le nĆud secondaire peut dĂ©terminer l'adresse du leader et la transmettre au client, sans effectuer de calcul de consensus via le protocole Raft.
Le changement a Ă©galement permis de se dĂ©barrasser d'un composant distinct pour la synchronisation des mĂ©tadonnĂ©es et d'Ă©liminer le traitement sĂ©parĂ© de l'Ă©tat Raft et des mĂ©tadonnĂ©es. Les nĆuds secondaires dirigent dĂ©sormais les requĂȘtes vers le nĆud principal uniquement si nĂ©cessaire, lorsqu'il leur faut connaĂźtre l'adresse du nĆud principal. L'API propose la possibilitĂ© d'obtenir des informations sur l'Ă©tat des autres nĆuds du cluster. Une commande « .sysdump » a Ă©tĂ© ajoutĂ©e Ă l'interface de ligne de commande.
Source : opennet.ru
