I föresparingarna inför lanseringen av den nya kursströmmingen har vi förberett en översÀttning av intressant material.

Ăversikt
Vi kommer att prata om ett populÀrt mönster dÀr applikationer anvÀnder flera datalager, dÀr varje lager anvÀnds för specifika ÀndamÄl, till exempel för lagring av kanonisk datavy (MySQL osv.), för att möjliggöra avancerad sökning (ElasticSearch osv.), för cachelagring (Memcached osv.) och andra. Vanligtvis fungerar ett datalager som huvudlager medan andra fungerar som underordnade lager. Det enda problemet Àr hur dessa datalager ska synkroniseras.
Vi har granskat ett antal olika mönster för att lösa problemet med att synkronisera flera lager, sÄsom dubbelskrivning, distribuerade transaktioner osv. Men dessa angreppssÀtt har betydande begrÀnsningar nÀr det gÀller praktisk anvÀndning, tillförlitlighet och underhÄll. Förutom datasynkronisering behöver vissa applikationer ocksÄ berika data genom att anropa externa tjÀnster.
För att lösa dessa problem utvecklades Delta. Delta Àr i grunden en sammanhÀngande, hÀndelsestyrd plattform för synkronisering och berikning av data.
Befintliga lösningar
Dubbelskrivning
För att synkronisera tvÄ datalager kan man anvÀnda dubbelskrivning, dÀr man gör en skrivning till ett lager och dÀrefter genast skriver till det andra. Den första skrivningen kan upprepas, och den andra kan avbrytas om den första misslyckas efter att antalet försök har nÄtt sin grÀns. Problemet Àr dock att de tvÄ datalager kan sluta att synkroniseras om skrivningen till det andra lagret misslyckas. Detta problem löses vanligtvis genom att skapa en ÄterstÀllningsprocedur som periodiskt kan Äteröverföra data frÄn det första lagret till det andra eller göra det endast om det upptÀcks skillnader i data.
Problem:
Utförandet av ÄterstÀllningsproceduren Àr ett specifikt arbete som inte kan ÄteranvÀndas. Dessutom förblir data mellan lagringsenheterna osynkroniserade tills ÄterstÀllningsproceduren Àr genomförd. Problemet förvÀrras om mer Àn tvÄ datalagringsenheter anvÀnds. Slutligen kan ÄterstÀllningsproceduren lÀgga en belastning pÄ den ursprungliga datakÀllan.
Ăndringsloggtabell
NÀr Àndringar görs i en tabellsamling (t.ex. insÀttning, uppdatering och borttagning av poster), lÀggs Àndringsposter till i Àndringsloggtabellen som en del av samma transaktion. En annan trÄd eller process begÀr kontinuerligt hÀndelser frÄn Àndringsloggtabellen och skriver dem till en eller flera datalagringsenheter, och tar bort hÀndelser frÄn Àndringsloggtabellen efter att inskrivningen har bekrÀftats av alla lagringsenheter.
Problem:
Denna mönster bör implementeras som ett bibliotek och helst utan att Àndra koden för den applikation som anvÀnder det. I en polyglot-miljö bör en sÄdan biblioteksimplementation finnas pÄ vilket behövligt sprÄk som helst, men att sÀkerstÀlla konsekvent funktionalitet och beteende mellan sprÄken Àr mycket utmanande.
Ett annat problem ligger i att fÄnga schemaÀndringar i system som inte stöder transaktionella schemaÀndringar [1][2], som till exempel MySQL. DÀrför kommer mönstret för att utföra förÀndringar (t.ex. schemaÀndringar) och den transaktionella registreringen av detta i Àndringsloggtabellen inte alltid att fungera.
Distribuerade Transaktioner
Distribuerade transaktioner kan anvÀndas för att dela upp en transaktion mellan flera heterogena datalagringsenheter sÄ att operationen antingen bekrÀftas i alla anvÀnda lagringsenheter, eller inte bekrÀftas i nÄgon av dem.
Problem:
Distribuerade transaktioner Àr ett stort problem för heterogena databaser. De kan per definition endast förlita sig pÄ den minsta gemensamma nÀmnaren hos de deltagande systemen. Till exempel blockeras XA-transaktioner om det intrÀffar ett fel i applikationsprocessen under förberedelse. Dessutom erbjuder XA inte dödlÀgesdetektering och stöder inte optimistiska scheman för parallellhantering. Utöver detta stöder vissa system som ElasticSearch varken XA eller nÄgot annat heterogent transaktionssystem. DÀrmed kvarstÄr det att sÀkerstÀlla atomÀr skrivning i olika datalagringsteknologier som en stor utmaning för applikationer [3].
Delta
Delta utvecklades för att övervinna begrÀnsningarna hos befintliga datasykroniseringlösningar, och det möjliggör Àven realtidsberikning av data. VÄrt mÄl var att abstrahera alla dessa komplexa aspekter frÄn applikationsutvecklare, sÄ att de kan fokusera helt pÄ att implementera affÀrsfunktionaliteten. Nedan kommer vi att beskriva "Movie Search", det faktiska anvÀndningsfallet för Delta frÄn Netflix.
Netflix anvÀnder en mikroservicearkitektur dÀr varje mikroservice vanligtvis hanterar en typ av data. Grundinformationen om filmer hanteras av en mikroservice som kallas Movie Service, medan relaterade data, som information om producenter, skÄdespelare och leverantörer, hanteras av flera andra mikroservicer (specifikt Deal Service, Talent Service och Vendor Service).
AffÀrsanvÀndare pÄ Netflix Studios behöver ofta söka efter filmer baserat pÄ olika kriterier, vilket gör det mycket viktigt för dem att kunna söka i all filmrelaterad data.
Innan Delta behövde filmletarteamet hÀmta data frÄn flera mikroservicer innan de indexerade filmdata. Dessutom var teamet tvunget att utveckla ett system som periodiskt uppdaterade sökindexet genom att hÀmta förÀndringar frÄn andra mikroservicer, Àven om det inte fanns nÄgra förÀndringar. Detta system blev snabbt komplicerat och blev svÄrt att underhÄlla.

Figur 1. Pollingssystemet före Delta
Efter att ha börjat anvÀnda Delta blev systemet förenklat till ett hÀndelsestyrt system, som visas i följande bild. CDC-hÀndelser (Change-Data-Capture) skickas till Keystone Kafka-topiker via Delta-Connector. Delta-appen, byggd med hjÀlp av Delta Stream Processing Framework (baserat pÄ Flink), tar emot CDC-hÀndelser frÄn topiken, berikar dem genom att anropa andra mikrotjÀnster och överför slutligen de berikade uppgifterna till sökindexet i Elasticsearch. Hela processen sker nÀstan i realtid, vilket innebÀr att sÄ snart förÀndringar registreras i datalagret uppdateras sökindexen.

Bild 2. Datapipeline med Delta
I följande avsnitt kommer vi att beskriva hur Delta-Connector fungerar, som kopplar till lagret och publicerar CDC-hÀndelser pÄ transportnivÄn, som Àr infrastrukturen för realtidsdataöverföring som dirigerar CDC-hÀndelser till Kafka-topiker. Och i slutet kommer vi att prata om strukturen för Delta-strömbehandling, som apputvecklare kan anvÀnda för logik kring databehandling och berikning.
CDC (Change-Data-Capture)
Vi har utvecklat en CDC-tjĂ€nst som kallas Delta-Connector, som kan registrera begĂ„ngna Ă€ndringar frĂ„n datalagret i realtid och skriva dem till en ström. RealtidsĂ€ndringar hĂ€mtas frĂ„n transaktionsloggen och lagrets dumpningar. Dumpningar anvĂ€nds eftersom transaktionsloggar vanligtvis inte lagrar hela historiken av Ă€ndringar. Ăndringar serielliseras vanligtvis som Delta-hĂ€ndelser, sĂ„ mottagaren behöver inte oroa sig för varifrĂ„n Ă€ndringen kommer.
Delta-Connector stöder flera ytterligare funktioner, sÄsom:
- Möjlighet att skriva till anpassad utdata utanför Kafka.
- Möjlighet att aktivera manuella dumpningar nÀr som helst för alla tabeller, en specifik tabell eller för vissa primÀra nycklar.
- Dumpningar kan hÀmtas i block, sÄ det Àr inte nödvÀndigt att börja om frÄn början vid fel.
- Det Àr ingen anledning att sÀtta lÄs pÄ tabeller, vilket Àr mycket viktigt för att skrivtrafiken till databasen aldrig blockeras av vÄr tjÀnst.
- Hög tillgÀnglighet pÄ grund av reservinstanser i AWS Availability Zones.
För nÀrvarande stödjer vi MySQL och Postgres, inklusive distributioner i AWS RDS och Aurora. Vi stöder Àven Cassandra (multi-master). Mer information om Delta-Connector kan du fÄ i detta .
Kafka och transportlagret
Transportlagret för Delta-hÀndelser Àr byggt pÄ meddelandetjÀnsten i plattformen .
Historiskt sett har publicering av meddelanden i Netflix optimerats för att öka tillgÀngligheten snarare Àn hÄllbarheten (se ). Detta har resulterat i en potentiell datainkonsistens mellan olika grÀnsscenarier. Till exempel, unclean leader election ansvarar för att mottagaren potentiellt duplicerar eller förlorar hÀndelser.
Med Delta ville vi fÄ mer robusta garantier för hÄllbarhet för att sÀkerstÀlla leverans av CDC-hÀndelser till avledda lagringslösningar. För detta föreslog vi en specialdesignad Kafka-kluster som ett förstklassigt objekt. Du kan se nÄgra instÀllningar för broker i tabellen nedan:

I Keystone Kafka-kluster, unclean leader election Àr vanligtvis aktiverat för att sÀkerstÀlla tillgÀngligheten för publicisten. Detta kan leda till förlust av meddelanden om en osynkroniserad replik vÀljs som ledare. För ett nytt högre tillförlitligt Kafka-kluster Àr instÀllningen unclean leader election avstÀngd för att förhindra meddelandeförlust.
Vi har ocksÄ ökat replication factor frÄn 2 till 3 och minimum insync replicas frÄn 1 till 2. Publicister som skriver till detta kluster krÀver acks frÄn alla andra, vilket garanterar att 2 av 3 repliker har de mest aktuella meddelandena som skickats av publicisten.
NÀr en broker-instans slutar fungera, ersÀtter en ny instans den gamla. Den nya brokern mÄste dock ikapp de osynkroniserade replikarna, vilket kan ta flera timmar. För att förkorta ÄterstÀllningstiden för detta scenario började vi anvÀnda blocklagring (Amazon Elastic Block Store) istÀllet för lokala diskar för brokern. NÀr den nya instansen ersÀtter den avslutade broker-instansen, ansluter den EBS-volymen som den avslutade instansen hade och börjar synka nya meddelanden. Denna process minskar tiden för att eliminera efterslÀpning frÄn flera timmar till flera minuter, eftersom den nya instansen inte lÀngre behöver replikera frÄn ett tomt tillstÄnd. Sammanfattningsvis minskar separata livscykler för lagring och broker avsevÀrt effekten av bytet av broker.
För att ytterligare öka garantin för dataleverans har vi anvÀnt för att upptÀcka eventuell förlust av meddelanden under extrema förhÄllanden (till exempel tidsavvikelser i ledaren för en partition).
Stream Processing Framework
BehandlingsnivÄn i Delta bygger pÄ Netflix SPaaS-plattformen, som integrerar Apache Flink med Netflix-ekosystemet. Plattformen tillhandahÄller ett anvÀndargrÀnssnitt för att hantera distributionen av Flink-jobb och orkestreringen av Flink-kluster ovanpÄ vÄr containerhanteringsplattform Titus. GrÀnssnittet hanterar ocksÄ jobbkonstruktioner och gör det möjligt för anvÀndare att dynamiskt Àndra konfigurationen utan att behöva recompilera Flink-jobben.
Delta tillhandahÄller ett ramverk för strömbehandling baserat pÄ Flink och SPaaS, som anvÀnder annotationsbaserad DSL (Domain Specific Language) för att abstrahera tekniska detaljer. Till exempel, för att definiera steget som eventen ska berikas med genom att anropa externa tjÀnster, mÄste anvÀndarna skriva följande DSL, och ramverket skapar en modell baserat pÄ det som körs av Flink.

Figur 3. Exempel pÄ berikning med DSL i Delta.
Ramverket för bearbetning förkortar inte bara inlÀrningskurvan, utan erbjuder ocksÄ gemensamma funktioner för strömbehandling, sÄsom deduplicering, schematisk hantering, samt flexibilitet och motstÄndskraft för att lösa vanliga problem i driften.
Delta Stream Processing Framework bestÄr av tvÄ nyckelmoduler: DSL & API-modulen och Runtime-modulen. DSL & API-modulen erbjuder DSL och UDF (User-Defined-Function) API sÄ att anvÀndare kan skriva sin egen bearbetningslogik (t.ex. filtrering eller transformationer). Runtime-modulen tillhandahÄller en implementation av DSL-parsern som bygger en intern representation av bearbetningsstegen i DAG-modeller. Execution-komponenten tolkar DAG-modellerna för att initiera de faktiska Flink-operatörerna och slutligen köra Flink-applikationen. Arkitekturen av ramverket illustreras i följande bild.

Bild 4. Arkitekturen av Delta Stream Processing Framework
Denna metod har flera fördelar:
- AnvÀndare kan fokusera pÄ sin affÀrslogik utan att behöva gÄ in pÄ Flink-specifika detaljer eller SPaaS-strukturen.
- Optimering kan göras pÄ ett sÀtt som Àr transparent för anvÀndarna, och fel kan rÀttas till utan att det krÀvs nÄgra Àndringar i anvÀndarens kod (UDF).
- Delta-applikationers arbete har förenklats för anvÀndare, eftersom plattformen erbjuder flexibilitet och motstÄndskraft direkt ur lÄdan och samlar in detaljerade metrikdata som kan anvÀndas för aviseringar.
AnvÀndning i produktion
Delta har varit i produktion i över ett Är och spelar en nyckelroll i mÄnga applikationer pÄ Netflix Studio. Det har hjÀlpt teamen att implementera anvÀndningsfall som sökindexering, datalagring och hÀndelsestyrda arbetsflöden. Nedan följer en översikt av plattformens hög-nivÄarkitektur.

Bild 5. Hög-nivÄarkitektur av Delta.
Tack.
Vi vill tacka följande personer som bidragit till skapandet och utvecklingen av Delta pÄ Netflix: Allen Wang, Charles Zhao, Jaebin Yoon, Josh Snyder, Kasturi Chatterjee, Mark Cho, Olof Johansson, Piyush Goyal, Prashanth Ramdas, Raghuram Onti Srinivasan, Sandeep Gupta, Steven Wu, Tharanga Gamaethige, Yun Wang och Zhenzhong Xu.
KĂ€llor
- Martin Kleppmann, Alastair R. Beresford, Boerge Svingen: Online-hĂ€ndelsebearbetning. Commun. ACM 62(5): 43â49 (2019). DOI:
: "Data Build Tool för Amazon Redshift-databasen."
KĂ€lla: habr.com
