Servir une large base d'utilisateurs avec des données fiables, cohérentes et à faible latence est un défi très difficile pour toute équipe backend. Chez Ledger, nous avons fait le choix stratégique d'héberger nos propres services de données de base de blockchain. En ne faisant pas appel à des tiers, nous pouvons gérer nous-mêmes les données de nos clients, en veillant à ce que les processus sous-jacents respectent nos directives de sécurité et nos objectifs de niveau de service (SLO) axés sur les performances.
Mais cette stratégie apporte aussi son lot de défis.
Notre premier défi consiste à migrer ces services de fourniture de données de base loin des outils noSQL sympas et brillants. Dans cet article, je vais plonger dans les raisons pour lesquelles nous avons pris cette décision difficile, les complexités que nous avons rencontrées et les avantages que nous avons récoltés.
Le but de cet article est de montrer les aspects techniques qui nous ont amenés à choisir PostgreSQL comme nouvelle couche de stockage de base pour les données blockchain.
Plongez dans les données de la blockchain
Les données de la blockchain ont plusieurs caractéristiques clés.
Tout d'abord, il ne cesse de croître et rien n'en est jamais supprimé. Cependant, dans la pratique, bien que la majeure partie d'une blockchain soit immuable, la partie la plus jeune de la blockchain peut changer en raison de conflits qui doivent être résolus. En effet, la chaîne étant un réseau peer to peer, plusieurs blocs légitimes peuvent coexister temporairement. Habituellement, l'ancien est supprimé, ce qui entraîne ce que nous appelons une réorganisation. Pour faire court, les données sont divisées entre une queue froide immuable et un état de tête qui change rarement.
Le problème que nous essayons de résoudre est que si les blockchains sont idéales pour avoir des données byzantines tolérantes aux pannes, elles sont moins efficaces pour les trancher et les découper sur de nombreux axes. A savoir, obtenir la liste des opérations qui ont affecté un compte est très difficile. Même obtenir un solde de compte sur une blockchain comme le bitcoin est un défi lorsque vous n'avez pas déjà la liste des transactions.
Pour surmonter ces défis, Ledger Explorer Services indexe l'ensemble de la blockchain. Il s'agit d'un service important, critique et sensible aux performances, entièrement écrit en Scala, utilisant le effet chat temps d'exécution haute performance. Nous sommes à plus de 10 95 rps sur bitcoin, tout en maintenant une latence de queue p100 inférieure à XNUMX ms. Nous recrutons également .
Un peu d'histoire
Au début de notre histoire, bien avant que je ne rejoigne l'entreprise, la couche de service de données Ledger était gérée par une base de données intégrée Neo4j. Chaque boîte de service indexait ses propres données et les servait localement, ce qui causait beaucoup de problèmes.
La cohérence des données entre les instances n'était pas garantie, et la taille même de l'état qui devait être indexé, combinée à l'utilisation du disque et de la RAM neo4j, n'était pas évolutive. Ce problème n'a fait qu'empirer à mesure que l'entreprise grandissait, rendant de plus en plus difficile la création de nouvelles instances.
Cassandra a ensuite été choisi comme moteur principal de cette nouvelle configuration : il s'agit d'une base de données en cluster et évolutive horizontalement qui se trouve du côté AP du théorème CAP. Il résout les problèmes liés au partage de données et permet une séparation claire entre l'indexation, le composant prenant en charge la blockchain et les serveurs d'API sans tête.
Mais quel est l'intérêt d'avoir tout l'état historique disponible si nous n'allons jamais vraiment le lire ?
En ce qui concerne notre cas d'utilisation, les données historiques brutes sont rarement nécessaires car l'état du compte de notre utilisateur peut en être agrégé. Cela nous a conduit à challenger la solution de stockage de données existante qui est basée sur la base de données distribuée Cassandra.
Le volume de données que nous devons stocker par blockchain, bien que de l'ordre du téraoctet, n'est pas ce que l'on peut appeler du "big data". De plus, la partie de if qui sera utilisée pour répondre à la plupart des requêtes (alias The hot path) est encore plus petite. De nos jours, on peut facilement trouver des serveurs matériels de base avec plus de 16 To de stockage SSD NVMe. La mise à l'échelle verticale est un outil très puissant, tout comme une base de données relationnelle.
Enfin, le principal problème que nous avons rencontré avec la configuration actuelle de Cassandra n'était ni le modèle de stockage inutile ni le cas d'utilisation des données mal adapté, mais le manque de convivialité pour les développeurs. Le développement d'une nouvelle fonctionnalité basée sur les données sur Cassandra s'est avéré inutilement chronophage. Nous nous sommes efforcés de mettre en œuvre chaque nouvel axe sur lequel nous devions fournir des données.
Compte tenu de l'expertise de notre équipe dans les compétences en modélisation de données et la maîtrise de SQL, PostgreSQL était le candidat idéal. Cette solution est testée au combat, robuste, facile à étendre, ce qui en fait un choix idéal.
Pourquoi nous avons choisi SQL plutôt que NoSQL :
- Lit/écrit les soldes: le cas d'utilisation des données de la blockchain a été fortement faussé sur les lectures plutôt que sur les écritures (la blockchain écrit très peu de données à un rythme très raisonnable, même pour une blockchain comme Polygon). Cassandra a la capacité d'absorber une très grande quantité d'écritures - le chemin de lecture est en fait plus long que le chemin d'écriture.
- Prise en charge de l'indexation: Les indices sont un élément clé d'un SGBD pour répondre aux requêtes et aux nouvelles analyses de rentabilisation ou opportunités. Cassandra a un support limité pour l'indexation. Les index ne sont efficaces que si la requête spécifie déjà un moyen de restreindre la partition sur laquelle la requête s'exécutera. Nous payons ici le coût d'avoir un distribution arbitraire base de données. La prise en charge des index par PostgreSQL est efficace, extensible et à la périphérie.
- Prise en charge de l'agrégation: Même cas pour l'agrégation ; étant donné que Cassandra n'autorise pas l'agrégation multipartition et ne tolère aucune clause GROUP BY dans son langage de requête, son support fait en quelque sorte défaut. PostgreSQL propose une prise en charge étendue de l'agrégation, même sur des types de données exotiques comme les plages et les blobs jsonb.
- La modélisation des données: Cassandra est très, très limitante dans la façon dont la modélisation des données est possible. Une table doit être créée pour presque chaque requête à laquelle vous souhaitez répondre, et les données doivent être dénormalisées en grandes lignes (en utilisant pleinement le magasin de colonne large aspect de C* et aussi le fait que les écrivains sont très bon marché). PostgreSQL nous permet de tirer parti de l'aspect relationnel de la blockchain (appels, transactions, blocs) et de l'espace disque disponible, favorisant la réutilisation des données.
- Requêtes ad hoc et audit: Être capable d'utiliser le standard complet de SQL et de faire des requêtes arbitraires signifie que nous pouvons explorer et rechercher la cause racine potentielle d'un bogue ou avoir des données exploratoires pour de futurs cas d'utilisation. Nous pouvons vraiment utiliser la base de données comme un outil interactif et intelligent plutôt qu'un stockage stupide. Le faire sur Cassandra sans un cluster de calcul d'analyse étendu et coûteux comme Presto, Spark, etc. (et comme nous fonctionnons sur des serveurs bare metal, nous n'avons pas accès à des outils d'analyse de données distribués facilement générés comme EMR).
- L'utilisation de mémoire: L'hypothèse de Cassandra est que le stockage est très bon marché et que le cluster peut être facilement étendu avec de nouvelles machines. Cela signifie que toutes les limitations sur les indices et les agrégations doivent être payées avec le stockage. L'absence d'index globalement efficace et de prise en charge des jointures signifie que nous devons dénormaliser et stocker une copie de la table entière pour chaque axe que nous voulons interroger. PostgreSQL nous épargne des téraoctets de stockage.
- Cohérence: Comme Cassandra est une base de données distribuée, orientée AP (la communication se fait avec des commérages entre les nœuds), la cohérence n'est qu'éventuelle en termes d'écritures. Vous pouvez régler la politique de cohérence de chaque instruction pour les lectures et les écritures, mais l'objectif de cette base de données n'a jamais été d'avoir une cohérence forte. PostgreSQL a une solide histoire d'utilisation pour des missions critiques et est très résilient. Être centralisé signifie également qu'aucun réseau n'est impliqué dans le chemin d'écriture.
- Transactions et MVCC:
- Transactions : Cassandra prend en charge seulement des transactions légères sur les requêtes DML. Certains lots peuvent être appliqués (dock) mais il y a de nombreuses mises en garde, à savoir que les lignes doivent être dans le même serveur (= partition) pour ne pas avoir des performances épouvantables.
- MVCC : Cassandra prend en charge l'horodatage des lignes, mais le MVCC complet n'est pas garanti. Un compactage peut effacer des données obsolètes et il n'y a aucun moyen de dire à C* qu'il ne devrait pas (comme par exemple avec une transaction dans PG).
- PostgreSQL prend en charge un modèle MVCC puissant qui garantit un chemin de lecture cohérent pour nos utilisateurs.
- Outillage: PostgreSQL possède de nombreux autres outils largement utilisés pour exploiter facilement la base de données. De plus, un outil comme voie de migration garantit que nous maintenons un versionnage solide du schéma de la base de données. Nous l'avons déjà intégré avec succès à notre base de code. Il n'y a pas d'équivalent à ce niveau de maturité sur Cassandra.
- Évolutivité horizontale: C'est le principal argument de vente de Cassandra. Ajoutez simplement plus de machines à mesure que vos données augmentent. Pas d'équivalent pour PostgreSQL car le sharding et le partitionnement doivent être faits manuellement.
Comment nous prévoyons d'évoluer
Comme nous l'avons vu, le seul inconvénient de l'utilisation d'une configuration Postgres est la mise à l'échelle à la fois des lectures et du stockage. Que pouvons-nous faire pour surmonter cette limitation ?
Le premier outil efficace dont nous disposons consiste à séparer chaque protocole ou blockchain que nous prenons en charge dans sa propre base de données, car il peut donc être mis à l'échelle de manière appropriée en fonction du volume et du trafic. La segmentation par domaine d'activité assure une première couche de mise à l'échelle.
En poussant ce concept plus loin, nous pouvons également segmenter des données historiques froides en partition temporelle. Les dernières versions de Postgres ont beaucoup amélioré la convivialité des tables partitionnées, ce qui pourrait permettre de déplacer de manière transparente des données sur un cluster de machines. Par exemple, nous pourrions utiliser des machines moins chères avec moins de puissance de calcul pour héberger la majorité des données historiques, tout en conservant des mastodontes empilés en RAM au service des utilisateurs pour héberger des tables agrégées et les dernières opérations de l'utilisateur.
Cette approche fonctionne très bien dans notre cas d'utilisation car il n'y a pas de clés étrangères inter-partitions dans le stockage historique (tout est finalement attaché au bloc). Du point de vue du serveur principal, les données historiques pourraient même être accessibles de manière transparente à l'aide du partitionnement et de l'extension postgres_fdw.
Afin d'aider à mettre tout cela en place, nous avons également examiné l'extension TimescaleDB. Cette extension ajoute de nombreuses fonctionnalités aux postgres de base, et la plupart d'entre elles conviennent parfaitement à nos cas d'utilisation :
- Partitionnement automatique des tables basé sur une colonne time like (dans notre cas, nous l'adaptons en prenant la hauteur de la blockchain comme référence).
- Compression automatique, sensible au type de données et basée sur les colonnes des anciens morceaux. Cela garantit un taux de compression presque parfait en utilisant des algorithmes de pointe sur des données très similaires.
- Agrégation efficace basée sur des intervalles de temps pour calculer facilement les soldes historiques et les graphiques de données de marché.
Nous n'en sommes qu'au début de l'expérimentation concernant le stockage, et cela débloque de nombreux cas d'utilisation. Preuve de concepts utilisant une petite quantité de données (~ 10 2 blocs sur le réseau principal Ethereum, soit environ XNUMX jours de données) a montré une réduction de l'espace disque allant jusqu'à 40 %.
Comme nous l'avons vu, le volume de données, à condition d'utiliser la bonne stratégie, n'est pas un problème. Mais comment évoluer avec la taille de notre base d'utilisateurs ?
Nous avons déjà un bel avantage ici : nous indexons l'ensemble des données de la blockchain. Ainsi, le stockage nécessaire n'augmentera pas comme le nombre d'utilisateurs, mais comme la taille totale de la blockchain. Les optimisations de stockage et de lecture sont totalement orthogonales dans leur résolution.
Cette configuration, combinée au très faible besoin d'écriture par rapport au volume de lecture qui doit être servi, est la configuration de rêve pour un modèle de réplique leader-suiveur de classement. Afin d'améliorer encore les performances et le débit, nous pouvons également placer les répliques en lecture postgres sur les mêmes machines que les serveurs d'API et tirer parti des sockets de domaine UNIX pour éviter les allers-retours réseau.
Voici un exemple de stratégie de réplication de données que nous pourrions utiliser pour mettre à l'échelle nos lectures. Les cases gris clair représentent des serveurs uniques. Nous pouvons voir ici que les pods d'API sont directement co-localisés avec des répliques des données les plus chaudes pour garantir un temps de transfert minimal entre le stockage et les utilisateurs. Les instances d'archive décrites précédemment ne sont pas représentées pour ne pas trop compliquer le schéma.
Remarques finales
En tant qu'utilisateur de longue date de Cassandra, je tiens à souligner qu'il s'agit d'une excellente base de données dans sa conception, qui convient à une grande variété d'applications. Malheureusement, le choix qui a été fait chez Ledger de l'utiliser a été fait sur un cas d'utilisation de données qui ne s'est jamais concrétisé.
La productivité de notre équipe a été affectée, et dans l'attente des défis que nous devons résoudre, nous avons choisi de mordre la balle et de ne pas tomber dans le sophisme des coûts irrécupérables.
Dans de nombreux cas, vos données ne sont pas du Big Data. La gestion de la distribution des données n'est pas une tâche difficile dans la plupart des cas, et les compromis d'une base de données distribuée à part entière doivent vraiment être soigneusement pris en compte. La principale considération est l'expérience du développeur, car elle libère un temps précieux pour créer autre chose. C'est le cas d'utilisation réel dans lequel nous devons investir massivement.
- Contenu propulsé par le référencement et distribution de relations publiques. Soyez amplifié aujourd'hui.
- PlatoAiStream. Intelligence des données Web3. Connaissance Amplifiée. Accéder ici.
- Frapper l'avenir avec Adryenn Ashley. Accéder ici.
- Achetez et vendez des actions de sociétés PRE-IPO avec PREIPO®. Accéder ici.
- La source: https://www.ledger.com/blog/serving-web3-at-web2-scale
- :possède
- :est
- :ne pas
- $UP
- 10
- 10K
- 20
- a
- capacité
- Capable
- accès
- accédé
- Compte
- à travers
- actually
- adapter
- ajouter
- Ajoute
- adhérer
- Avantage
- agrégation
- algorithmes
- Tous
- permettre
- permet
- déjà
- aussi
- Bien que
- montant
- an
- selon une analyse de l’Université de Princeton
- analytique
- ainsi que
- répondre
- tous
- quoi que ce soit d'artificiel
- api
- applications
- appliqué
- une approche
- de manière appropriée
- Archive
- SONT
- autour
- L'art
- article
- AS
- d'aspect
- aspects
- hypothèse
- At
- disponibles
- conscients
- et
- HACHES
- Axis
- backend
- Balance
- soldes
- base
- basé
- Baseline
- BE
- car
- était
- before
- Début
- Béhémoths
- va
- avantages.
- jusqu'à XNUMX fois
- Big
- Big Data
- Bit
- Bitcoin
- Block
- blockchain
- données de la blockchain
- blockchains
- Blocs
- tous les deux
- Box
- boîtes
- Apporte
- Punaise
- construire
- la performance des entreprises
- mais
- by
- Appelez-nous
- Appels
- CAN
- candidat
- casquette
- prudemment
- maisons
- cas
- Causes
- causé
- centralisée
- chaîne
- challenge
- globaux
- difficile
- Change
- en changeant
- pas cher
- moins chère
- machines moins chères
- le choix
- Selectionnez
- choisir
- choisi
- clair
- Grappe
- code
- base de code
- du froid
- Colonne
- combiné
- marchandise
- Communication
- Société
- complexités
- composant
- calcul
- concept
- concepts
- considération
- considéré
- cohérent
- Freddi
- Core
- Prix
- pourriez
- créée
- critique
- Courant
- données
- l'analyse des données
- partage de données
- stockage de données
- Base de données
- jours
- décision
- décrit
- Conception
- Développeur
- développement
- difficile
- directement
- saleté
- distribué
- distribution
- divisé
- do
- faire
- domaine
- Ne pas
- inconvénient
- rêve
- driver
- deux
- e
- chacun
- même
- Easy
- Edge
- Efficace
- efficace
- d'autre
- intégré
- mettre en relief
- permettre
- encourageant
- de renforcer
- assurer
- Assure
- assurer
- Équivalent
- etc
- Ethereum
- RÉSEAU PRINCIPAL ETHEREUM
- Pourtant, la
- éventuellement
- JAMAIS
- Chaque
- peut
- exemple
- existant
- Exotique
- se développe
- Découvrez
- nous a permis de concevoir
- explorez
- explorateur
- étendre
- extension
- les
- fait
- Automne
- Fonctionnalité
- Fonctionnalités:
- few
- Trouvez
- Prénom
- s'adapter
- Pour
- étranger
- Avant
- logie
- de
- plein
- à part entière
- d’étiquettes électroniques entièrement
- fonctionnalités
- plus
- avenir
- obtention
- donné
- À l'échelle mondiale
- objectif
- aller
- graphiques
- gris
- l'
- Réservation de groupe
- Croître
- Croissance
- garantie
- lignes directrices
- ait eu
- Dur
- Matériel
- Vous avez
- ayant
- front
- fortement
- la taille
- aider
- ici
- Haute
- très
- historique
- hôte
- HOT
- les plus en vogue
- Comment
- How To
- Cependant
- HTML
- HTTPS
- i
- idéal
- if
- immuable
- impact
- la mise en œuvre
- amélioré
- in
- de plus en plus
- indice
- Indices
- instance
- des services
- Interactif
- développement
- Investir
- impliqué
- aide
- vous aider à faire face aux problèmes qui vous perturbent
- IT
- SES
- rejoindre
- rejoint
- jpg
- juste
- en gardant
- ACTIVITES
- clés
- Genre
- Peindre
- langue
- gros
- Latence
- Nouveautés
- couche
- LED
- Ledger
- légitime
- moins
- Niveau
- Levier
- lumière
- léger
- comme
- limitation
- limites
- limité
- Liste
- peu
- localement
- Location
- regardé
- recherchez-
- Lot
- Faible
- Les machines
- LES PLANTES
- Entrée
- mainnet
- maintenir
- Majorité
- Fabrication
- gérer
- les gérer
- manuellement
- de nombreuses
- Marché
- Données du marché
- maturité
- largeur maximale
- Mai..
- veux dire
- Métal
- émigrer
- minimal
- missions
- modèle
- modélisation statistique
- PLUS
- Par ailleurs
- (en fait, presque toutes)
- Bougez
- beaucoup
- must
- à savoir
- presque
- Besoin
- nécessaire
- Besoins
- Ni
- réseau et
- n'allons jamais
- Nouveauté
- agréable
- aucune
- nœuds
- rien
- nombre
- nombreux
- objectifs
- of
- on
- ONE
- uniquement
- fonctionner
- Opérations
- Opportunités
- or
- de commander
- nos
- nous-mêmes
- plus de
- Overcome
- propre
- payé
- partie
- les parties
- chemin
- Patron de Couture
- Payer
- par les pairs
- peer to peer
- parfaite
- performant
- objectifs
- Place
- plan
- Platon
- Intelligence des données Platon
- PlatonDonnées
- gousses
- Point
- politique
- Polygone
- possible
- Postgresql
- défaillances
- power
- solide
- pratique
- Problème
- les process
- productivité
- preuve
- proportion
- propose
- protocole
- proven
- fournir
- à condition de
- mettre
- requêtes
- RAM
- gamme
- Tarif
- plutôt
- rapport
- raw
- Lire
- réal
- vraiment
- raisonnable
- réduction
- en ce qui concerne
- en relation
- fiable
- réorganisation
- répondre
- réplication
- représentent
- représenté
- nécessaire
- résilient
- Résolution
- résolu
- résultant
- réutiliser
- bon
- robuste
- racine
- Round
- RANGÉE
- Courir
- pour le running
- même
- Scala
- évolutive
- Escaliers intérieurs
- mise à l'échelle
- de façon transparente
- Rechercher
- sécurité
- sur le lien
- vu
- clignotant
- segmentation
- Disponible
- point de vente
- service
- Services
- service
- set
- installation
- plusieurs
- sharding
- partage
- Shorts
- montrer
- côté
- similaires
- depuis
- unique
- Taille
- compétences
- petit
- faibles
- smart
- So
- sur mesure
- RÉSOUDRE
- Résout
- quelques
- Space
- Spark
- Frayer
- SQL
- Standard
- Région
- Déclaration
- storage
- Boutique
- Histoire
- Stratégique
- de Marketing
- STRONG
- fortement
- Avec succès
- Support
- Les soutiens
- table
- Prenez
- prise
- Tâche
- équipe
- Technique
- dire
- conditions
- que
- qui
- La
- Le bloc
- L'État
- leur
- puis
- Là.
- Ces
- l'ont
- Troisièmement
- des tiers
- this
- débit
- fiable
- à
- trop
- outil
- les outils
- Total
- TOTALEMENT
- circulation
- transaction
- Transactions
- transférer
- de manière transparente
- type
- types
- En fin de compte
- sous
- sous-jacent
- malheureusement
- unix
- déverrouille
- inutilement
- us
- convivialité
- Utilisation
- utilisé
- cas d'utilisation
- d'utiliser
- Utilisateur
- utilisateurs
- en utilisant
- d'habitude
- Précieux
- variété
- vertical
- très
- le volume
- souhaitez
- était
- Façon..
- we
- Web2
- Web3
- WELL
- Quoi
- Qu’est ce qu'
- quand
- qui
- tout en
- Si l’achat
- la totalité
- why
- large
- largement
- sera
- comprenant
- sans
- vos contrats
- écrire
- code écrit
- you
- Le plus jeune
- Votre
- zéphyrnet