Construire un service web hautement disponible sans base de données
Exploration
- Pour une nouvelle startup, on choisit généralement un framework web comme Rails, Django ou Node, ainsi qu'une base de données comme MySQL, PostgreSQL ou MongoDB
- Mais que se passerait-il s'il était possible de fusionner le service web et l'instance de base de données en un seul ensemble ? Il est possible d'adopter une approche où toutes les données sont stockées en RAM
- En utilisant la RAM comme base de données, il n'est plus nécessaire de sérialiser les données via des requêtes SQL
- Les index peuvent être implémentés à l'aide de tables de hachage en mémoire
- Les tâches en arrière-plan peuvent être traitées par des threads au sein d'un grand processus
- En cas de crash du processus, la récupération est possible en prenant périodiquement des instantanés de la RAM et en enregistrant les modifications sur disque
Passage à l'échelle
- Lorsqu'apparaissent des clients exigeant une haute disponibilité, les serveurs sont répliqués à l'aide de l'algorithme de consensus Raft
- Si le serveur leader tombe en panne, un nouveau leader est élu pour traiter les requêtes
- Cette approche permet des déploiements progressifs sans redémarrer les serveurs
Extraction
- Lorsqu'il y a beaucoup de grands clients, il est possible de répartir le service web par sharding
- Un cluster dédié est fourni à chaque client entreprise
- Le principal goulet d'étranglement peut être la performance du thread de commit
Notre stack
- Utilisation de Common Lisp : excellente prise en charge du multithreading et bien adapté au hot reloading du code
- Utilisation de bknr.datastore et bknr.cluster : la bibliothèque Braft de Baidu est utilisée pour implémenter Raft
- Utilisation d'EFS pour stocker les fichiers image : la gestion des erreurs et les tests y sont plus simples qu'avec S3
Résumé
- Cette architecture convient bien aux nouvelles startups, et avec Common Lisp, de nombreux outils sont déjà disponibles
- Merci aux contributeurs de bknr.datastore, Braft et Raft
Le récapitulatif de GN⁺
- Cet article présente une nouvelle architecture pour construire un service web hautement disponible sans base de données
- La RAM est utilisée comme base de données, et la haute disponibilité est assurée via l'algorithme de consensus Raft
- Common Lisp est utilisé pour prendre en charge le multithreading et le hot reloading du code
- Cette architecture convient aux nouvelles startups et permet un développement et un débogage rapides
- Parmi les projets offrant des fonctionnalités similaires, on peut citer Redis et Memcached
1 commentaires
Avis Hacker News
Créer son propre journal de transactions au lieu d’utiliser SQLite, c’est étrange
Créer sa propre base de données en mémoire au lieu d’utiliser MySQL, Postgres, Redis ou MongoDB est complexe
Ne pas vouloir apprendre les aspects de base de MySQL ou Postgres est une perte de temps
C’est une architecture similaire à celle de HashiCorp avec Nomad, Consul et Vault
Il existe une idée fausse selon laquelle la RAM serait très bon marché
J’ai déjà vu un projet qui utilisait les répertoires du système de fichiers comme tables et des fichiers JSON comme lignes
Utiliser une base de données relationnelle est plus fiable
Ils ont implémenté leur propre couche de consensus Raft pour éviter quelque chose de complexe
Les applications desktop et mobiles modernes utilisent souvent des bases de données comme SQLite
Construire sa propre base de données en mémoire n’est pas plus simple qu’installer Postgres ou SQLite