3 points par GN⁺ 2024-10-12 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • À mesure que Netflix s’est étendu à des domaines variés comme la VoD et le gaming, la capacité à stocker et traiter de grands volumes de données temporelles (à l’échelle du pétaoctet) avec une latence de l’ordre de la milliseconde est devenue essentielle.
  • En s’appuyant sur une abstraction Key-Value et sur la plateforme Data Gateway, Netflix a développé une abstraction TimeSeries afin de proposer une solution permettant de stocker et d’interroger efficacement des données d’événements temporels pour un large éventail de cas d’usage.

Défis

  • Chez Netflix, des données temporelles sont générées et utilisées en continu à partir des interactions utilisateur, de l’exposition des assets et de l’activité de réseaux complexes de microservices.
  • Il est crucial de gérer efficacement ces données afin de garantir l’expérience utilisateur et la fiabilité du système.
  • Principaux défis :
    • Débit élevé : il faut gérer jusqu’à 10 millions d’écritures par seconde tout en maintenant une haute disponibilité.
    • Requêtes efficaces sur des jeux de données massifs : tout en stockant des données à l’échelle du pétaoctet, le système doit renvoyer les résultats de lecture par clé principale en quelques millisecondes et prendre en charge la recherche et l’agrégation via plusieurs attributs secondaires.
    • Lecture et écriture globales : le système doit prendre en charge les opérations de lecture et d’écriture partout dans le monde, avec un modèle de cohérence configurable.
    • Configuration ajustable : il doit être possible de partitionner les jeux de données dans des magasins mono-tenant ou multi-tenant.
    • Gestion des pics de trafic : il faut absorber les hausses soudaines de trafic lors de la sortie de nouveaux contenus ou de la reprise après incident régional.
    • Efficacité des coûts : il faut minimiser les coûts d’infrastructure tout en optimisant la conservation à long terme.

Abstraction TimeSeries

  • Partitionnement des données : l’utilisation d’une stratégie de partitionnement temporel spécifique et d’une approche par event buckets permet de gérer efficacement les charges burst et de simplifier les requêtes.
  • Stockage flexible : la solution est conçue pour s’intégrer à différents backends de stockage comme Apache Cassandra et Elasticsearch.
  • Configurabilité : elle offre, pour chaque dataset, diverses options de réglage permettant de s’adapter à des cas d’usage variés.
  • Scalabilité : elle prend en charge la montée en charge horizontale et verticale afin d’absorber l’augmentation du débit et du volume de données à mesure que la base d’utilisateurs et les services de Netflix grandissent.
  • Infrastructure shardée : en s’appuyant sur la Data Gateway Platform, il est possible de déployer des infrastructures mono-tenant et/ou multi-tenant avec l’isolation d’accès et de trafic requise.

Modèle de données

  • Le système suit un modèle de données événementiel spécifique qui encapsule les données d’événements afin de permettre des requêtes efficaces.
  • Event item : un event item est une paire clé-valeur utilisée par l’utilisateur pour stocker des données liées à un événement donné. Exemple : {"device_type": "ios"}
  • Événement : un événement est une collection structurée composée d’un ou plusieurs event items. Il se produit à un instant donné et est identifié par un timestamp généré côté client et un identifiant d’événement (UUID, par exemple). La combinaison de event_time et event_id constitue une partie de la clé d’idempotence unique de l’événement, ce qui permet aux utilisateurs de relancer leurs requêtes en toute sécurité.
  • ID de série temporelle : time_series_id est un ensemble d’un ou plusieurs événements survenus durant la période de rétention d’un dataset. Par exemple, device_id stocke tous les événements survenus sur un appareil donné pendant cette période. Tous les événements sont immuables et le service TimeSeries ne fait qu’ajouter des événements à un ID de série temporelle donné.
  • Namespace : un namespace est un ensemble d’IDs de séries temporelles et de données d’événements représentant l’intégralité d’un dataset TimeSeries. L’utilisateur peut créer un ou plusieurs namespaces pour chaque cas d’usage. L’abstraction applique diverses options configurables au niveau du namespace.

API

  • WriteEventRecordsSync : ce endpoint écrit un lot d’événements et renvoie au client une confirmation de durabilité. Il est utilisé lorsque l’utilisateur exige des garanties de durabilité.
  • WriteEventRecords : il s’agit de la version fire-and-forget de l’endpoint ci-dessus. Il met en file un lot d’événements sans confirmation de durabilité. Il est utilisé dans des cas comme le logging ou le tracing, où l’utilisateur privilégie le débit et peut tolérer une légère perte de données.
  • ReadEventRecords : étant donné une combinaison de namespace, timeSeriesId, timeInterval et éventuellement d’eventFilters, cet endpoint renvoie tous les événements correspondants triés par ordre décroissant de event_time avec une faible latence de l’ordre de la milliseconde.
  • SearchEventRecords : avec des critères de recherche et un intervalle temporel, cet endpoint renvoie tous les événements correspondants. Ces cas d’usage se prêtent à des lectures à cohérence éventuelle.
  • AggregateEventRecords : avec des critères de recherche et un mode d’agrégation (par ex. DistinctAggregation), cet endpoint effectue l’agrégation demandée sur l’intervalle temporel donné. Comme pour l’endpoint Search, l’utilisateur peut accepter une cohérence éventuelle et une latence potentiellement plus élevée (de l’ordre de la seconde).

Couche de stockage

  • La couche de stockage de TimeSeries se compose d’un datastore principal et d’un datastore d’index optionnel.
  • Apache Cassandra est privilégié comme datastore garantissant la durabilité dans les scénarios à fort débit.
  • Elasticsearch est privilégié comme datastore pour l’indexation.

Datastore principal

  • Apache Cassandra est utilisé pour prendre en charge les cas d’usage TimeSeries.
  • Les données sont gérées via un partitionnement temporel qui les découpe en chunks selon des intervalles de temps.
    • Tranches temporelles : mappées à des tables Cassandra correspondant à la période de rétention
    • Buckets temporels : repartitionnement des données au sein d’une tranche temporelle afin d’optimiser les requêtes sur des plages de temps spécifiques
    • Event buckets : repartitionnement supplémentaire des buckets temporels afin de gérer les écritures massives sur une série temporelle pendant une courte période
  • Les tables de données stockent les données d’événements réelles, tandis que les tables de métadonnées conservent les informations de configuration des tranches temporelles par namespace.

Datastore d’index

  • Afin de prendre en charge des patterns d’accès secondaires via des attributs non clés primaires, les données sont indexées dans Elasticsearch.
  • Les utilisateurs peuvent configurer, par namespace, la liste des attributs à utiliser pour la recherche et l’agrégation.

Plan de contrôle

  • Le data plane gère les opérations de lecture/écriture, tandis que le control plane configure tous les aspects du comportement des namespaces.
  • Le data plane communique avec la pile de contrôle TimeSeries, qui interagit elle-même avec le control plane de Data Gateway.
  • La configuration des namespaces permet d’ajuster avec souplesse divers paramètres (par ex. partitionnement temporel, buffering, cohérence, rétention, etc.).

Configuration des namespaces

  • Un extrait de configuration illustrant la flexibilité du service montre que de nombreux paramètres peuvent être ajustés par namespace.

Provisioning de l’infrastructure

  • En tenant compte de divers paramètres, un workflow de provisioning automatisé permet de déterminer la configuration optimale.
  • Le système provisionne l’infrastructure initiale puis s’adapte en fonction de la charge utilisateur.

Scalabilité

  • Comme les prévisions d’usage sont limitées lors du provisioning initial, des ajustements a posteriori sont nécessaires.
  • Montée en charge horizontale : les instances de serveurs TimeSeries s’ajustent automatiquement à la hausse ou à la baisse selon la demande de trafic.
  • Montée en charge verticale : les instances de serveurs TimeSeries ou de stockage peuvent être renforcées verticalement pour obtenir davantage de CPU, de RAM et/ou de capacité de stockage attachée.
  • Extension disque : les données peuvent être stockées via EBS, et lorsque le stockage disque atteint un certain seuil, les volumes EBS sont étendus.
  • Le repartitionnement des données permet d’ajuster les datasets sur- ou sous-partitionnés.

Principes de conception

  • Idempotence des événements : l’idempotence est intégrée à tous les endpoints de mutation afin que les utilisateurs puissent relancer leurs requêtes en toute sécurité.
  • Hedging basé sur les SLO : des objectifs de niveau de service (SLO) sont assignés à différents endpoints afin de garantir les performances.
  • Retour partiel : si le client est sensible à la latence, il peut accepter un ensemble de résultats partiel.
  • Pagination adaptative : lorsque la couche de service estime qu’un dataset de séries temporelles est dense, elle ajuste dynamiquement le facteur de fan-out.
  • Fenêtre d’écriture limitée : les données deviennent immuables aussi rapidement que possible, ce qui permet d’appliquer des optimisations.
  • Buffering des écritures : pour absorber les charges burst, les événements sont fusionnés sur de courtes périodes afin de mieux lisser la charge.
  • Compression dynamique : une fois les données devenues immuables, des stratégies de compression sont utilisées pour optimiser les performances en lecture.

Performances réelles

  • Le service peut enregistrer les données avec une latence de l’ordre de la milliseconde tout en maintenant des temps de lecture ponctuelle stables.

Utilisation de TimeSeries chez Netflix

L’abstraction TimeSeries joue un rôle important dans les principaux services de Netflix. Voici quelques cas d’usage marquants :

  • Tracing et insights : le tracing des logs de toutes les applications et microservices de Netflix permet de comprendre les communications interservices, d’aider au débogage des problèmes et de répondre aux demandes de support.
  • Suivi des interactions utilisateur : des millions d’interactions utilisateur, comme la lecture vidéo, la recherche et l’engagement avec les contenus, sont suivies afin d’améliorer en temps réel les algorithmes de recommandation de Netflix et de fournir des insights améliorant l’expérience globale.
  • Lancement de fonctionnalités et analyse des performances : le suivi du lancement et des performances de nouvelles fonctionnalités produit permet aux ingénieurs Netflix de mesurer la manière dont les utilisateurs interagissent avec elles, soutenant ainsi des décisions d’amélioration fondées sur les données.
  • Suivi et optimisation des impressions d’assets : le suivi de l’exposition des assets permet de garantir une diffusion efficace des contenus et des assets, tout en fournissant un feedback en temps réel pour l’optimisation.
  • Facturation et gestion des abonnements : des données historiques liées à la facturation et à la gestion des abonnements sont stockées afin d’assurer l’exactitude des historiques de transaction et de faciliter les demandes du service client.

Améliorations futures

À mesure que les cas d’usage évoluent et que le besoin de rendre l’abstraction encore plus rentable s’accroît, Netflix prévoit d’apporter de nombreuses améliorations au service dans les mois à venir. En voici quelques-unes :

  • Stockage hiérarchisé pour l’efficacité des coûts : prise en charge du déplacement des données anciennes et moins consultées vers un object storage moins coûteux mais avec un time-to-first-byte plus long, ce qui pourrait faire économiser plusieurs millions de dollars à Netflix.
  • Event bucketing dynamique : au lieu d’avoir une configuration quelque peu statique lors du provisioning d’un namespace, prise en charge d’un partitionnement en temps réel des clés vers des partitions de taille optimale au fil du streaming des événements. Cette stratégie présente l’avantage majeur de réduire le coût global de l’amplification en lecture en ne partitionnant pas les time_series_id qui n’en ont pas besoin. En outre, Cassandra 4.x apporte des améliorations significatives pour lire des sous-ensembles de données dans de très larges partitions, ce qui pourrait réduire la nécessité de partitionner agressivement l’ensemble du dataset à l’avance.
  • Caching : exploitation de l’immuabilité des données pour mettre intelligemment en cache des plages temporelles individuelles.
  • Comptage et autres agrégations : certains utilisateurs ne s’intéressent qu’au nombre d’événements sur un intervalle donné, au lieu de récupérer l’ensemble des données événementielles.

Conclusion

  • L’abstraction TimeSeries est un composant essentiel de l’infrastructure de données en ligne de Netflix, soutenant les décisions en temps réel comme à long terme.
  • À mesure que Netflix s’étend à de nouveaux domaines, l’abstraction TimeSeries restera un élément central de la plateforme et contribuera à étendre les possibilités du streaming et au-delà.

Avis de GN⁺

  • Le savoir-faire de Netflix est impressionnant : avec son abstraction TimeSeries, l’entreprise parvient à combiner scalabilité, flexibilité et efficacité des coûts pour traiter de manière fiable d’immenses volumes de données de séries temporelles. Les techniques optimisées pour les caractéristiques des données et les patterns d’accès, comme le partitionnement temporel, le buffering des écritures et la compaction dynamique, sont particulièrement remarquables.
  • Il ne s’agit pas simplement d’une base de données de séries temporelles : grâce à une couche d’abstraction, Netflix exploite avec souplesse plusieurs stockages comme Cassandra et Elasticsearch, tout en disposant d’un système de contrôle permettant de provisionner et d’exploiter l’infrastructure selon les caractéristiques de la charge. Cette abstraction masque la complexité et permet aux utilisateurs de se concentrer sur les données.
  • Le système traite actuellement des données à l’échelle du pétaoctet tout en gérant 15 millions d’événements par seconde, ce qui en fait un exemple de référence pour les entreprises souhaitant construire un pipeline de données de séries temporelles à haute performance. Cela montre en particulier que, pour les services à grande échelle, il faut considérer conjointement le volume, la vitesse et les coûts.
  • L’abstraction est utilisée dans des domaines clés de l’activité de Netflix, comme le tracing, l’analyse du comportement utilisateur et la gestion de la facturation, ce qui montre que les données de séries temporelles sont un moteur central de la prise de décision fondée sur les données et de l’innovation produit. Il ne s’agit pas seulement de logging, mais aussi d’une fondation pour des services basés sur le ML/l’IA, comme la recommandation en temps réel.
  • Les projets d’amélioration à venir — stockage hiérarchisé, partitionnement dynamique, opérations d’agrégation, etc. — montrent une volonté d’évolution continue. Pour répondre à des exigences métier en mutation rapide, une telle innovation permanente semble indispensable. On peut espérer que le savoir-faire accumulé au cours de ce processus sera partagé via l’open source ou d’autres moyens.

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.