Niklas Erlandsson
Självständigt arbete — Projektrapport Studieinriktning: Datateknik
Kursopäng: 15 hp Termin, år: VT, 2020
Handledare: Magnus Eriksson Examinator: Lennart Franked
Högskoleprogram: Nätverksdrift, 120 poäng
Abstract
The goals of this study are to implement a test environment for streaming telemetry and compare two alternatives for analysing the collected data in real-time. The two alternatives are the Python libraries PyKafka and Confluent-Kafka-Python. The comparison focused mainly on three are- as, these being documentation, amount of code and memory usage. The test environment for streaming telemetry was set up with a router run- ning IOS XR software that is sending data to a Cisco Pipeline collector, which in turn sends data to a Kafka-cluster. The comparison of the two libraries for interfacing with the cluster was made with the language Pyt- hon. The results of the comparison showed that both libraries had well- written documentation and showed a negligible difference in amount of code. The memory usage was considerably lower with the Confluent- Kafka-Python library. The study shows that streaming telemetry together with real-time analysis makes a good complement to or a replacement of SNMP. The study further recommends the use of Confluent-Kafka-Python in real-world implementations of streaming telemetry, particularly in lar- ge networks with a large amount of devices.
Keywords: Streaming Telemetry, Apache Kafka, Python, Real-time analy-
sis
Sammanfattning
Målen med denna studie är att implementera en testmiljö för streaming telemetry samt jämföra två alternativ för att möjliggöra realtidsanalys av det insamlade datat. Dessa två alternativ är Python-biblioteken PyKafka och Confluent-Kafka-Python. Bedömningskritierna för jämförselsen var dokumentation, kodmängd och minnesanvändning. Testmiljön för strea- ming telemetry använder en router med Cisco IOS XR programvara som skickar data till en Cisco Pipeline collector, som vidare sänder datat till ett Kafka-kluster. Jämförelsen av Python-biblioteken utfördes med språ- ket Python. Resultaten av jämförelsen visade att båda biblioteken hade välskriven dokumentation och liten skillnad i kodmängd, dock använde Confluent-Kafka-Python mindre minne. Studien visar att streaming tele- metry med realtidsanalys kan fungera bra som ett komplement till eller en ersättning av SNMP. Studien rekommenderar användning av Confluent- Kafka-Python för implementering i produktionsmiljöer med ett stort an- tal nätverksenheter med tanke på den lägre minnesanvändningen.
Nyckelord: Streaming Telemetry, Apache Kafka, Python, Realtidsanalys
Författarens tack
Ett stort tack till min handledare Magnus Eriksson för all hjälp under pro-
jektets gång. Jag vill även tacka mina företagshandledare Lukas Garberg
och Fredrik Lindgren för all hjälp med utvecklingen av skriptet och Sam
Pesonen för hjälp med routerkonfigurationen.
Författarens tack iii
Figurer vi
Tabeller vii
Kodexempel viii
Terminologi ix
1 Introduktion 1
1.1 Bakgrund och problemmotivering . . . . 1
1.2 Syfte . . . . 1
1.3 Avgränsningar . . . . 1
1.4 Konkreta och verifierbara mål . . . . 2
1.5 Översikt . . . . 2
2 Teori 3 2.1 Pull-baserade insamlingsmetoder . . . . 3
2.2 Push-baserade insamlingsmetoder . . . . 3
2.3 Pull kontra Push-metod? . . . . 4
2.4 Streaming telemetry - en översikt . . . . 4
2.4.1 Apache Kafka . . . . 5
2.4.2 Konfiguration av Streaming Telemetry . . . . 6
3 Metod 8 3.1 Verktyg . . . . 8
3.2 Bedömningskriterier . . . . 8
3.3 Mätning av minnesanvändning . . . . 8
3.4 Installation och konfigurering av Pipeline . . . . 9
3.5 Modell av tilltänkt teknisk lösning . . . . 9
4 Konstruktion 10 4.1 Anslutning till Apache Kafka och konsumtion av medde- landen . . . . 10
4.1.1 Skillnaden emellan PyKafka och Confluent-Kafka- Python . . . . 11
4.2 Filtrering och lagring av data i buffer . . . . 11
4.3 Uträkning av genomsnittlig belastning . . . . 14
4.4 Analys av data . . . . 14
5 Resultat 17 5.1 Jämförelse emellan Python-bibliotek . . . . 17
5.1.1 Dokumentation . . . . 17
5.1.2 Kodmängd och skriptkomplexitet . . . . 17
5.1.3 Minnesanvändning . . . . 17
6 Diskussion 19 6.1 Reflektion över arbetets syfte och mål . . . . 19
6.2 Reflektion över analysen . . . . 19
6.3 Etiska och samhälleliga aspekter . . . . 20
7 Slutsatser 21 7.1 Arbetets resultat . . . . 21
7.2 Förslag på fortsatt arbete . . . . 21
Källförteckning 22 A Fullständig kod för analys-skript 1 A.1 Confluent-Kafka-Python . . . . 1
A.2 PyKafka . . . . 5
B Skärmklipp över minnesanvändning 9
mory . . . . 18
Kodexempel
1 Exempel på YANG-RPC för on-change subscription . . . . 7 2 Upprätta anslutning till Kafka-brokers med SSL . . . . 10 3 Konsumera meddelanden ifrån Kafka-topic . . . . 10 4 Exempel på anslutning och konsumering med Pykafka . . 11 5 Filtering av data från meddelanden . . . . 12 6 Skapa post i buffer för interface och lagra värden . . . . 13 7 Beräkna genomsnittlig länkbelastning . . . . 14 8 Jämförelse av data mot länkkapacitet och genomsnittlig be-
lastning . . . . 15
Terminologi
SNMP Simple Network Management Protocol
MIB Management Information Base, används av SNMP OID Object ID, används av SNMP
NMS Network Monitoring System SLA Service Level Agreement
Apache Kafka System för att hantera meddelanden TSDB Time-Series Database
InfluxDB En variant av en TSDB
Prometheus Ett system bestående av en Event monitor och en TSDB
ASN.1 Abstract Syntax Notation One, en språkstandard för datastrukturer
BER Basic Encoding Rules, en del av X.601 standarden för ASN.1 notation
RPC Remote Procedure Call
1 Introduktion
1.1 Bakgrund och problemmotivering
Dagens pull-baserade metoder för att samla telemetridata från nätverk skalar allt sämre i stora nätverk. Uppdatering av MIBar i ett stort SNMP- baserat nätverk blir snabbt en krävande syssla, och NMS kan ha svårt att hantera belastningen av de tusentals enheter som data ska hämtas från.
Datat som tas in med dessa system är inte i realtid, och problem som uppstår i tiden emellan polling-intervaller blir ej upptäckta när de upp- kommer, vilket leder till stora problem i nätverk med höga krav på till- gänglighet och hårda SLA mot kund.
Streaming telemetry är en push-baserad metod för insamling av telemetri- data som ämnar att lösa problematiken med den åldrande polling-baserade tekniken som främst nyttjas idag. Streaming telemetry skickar prenume- rerad data kontinuerligt utan behov av en managers förfrågan som krävs med SNMP, vilket möjliggör åtkomst till fullständig realtidsdata som kan nyttjas för ändamål såsom nätverksautomatisering och preventivt under- håll. Streaming telemetry är optimalt för stora nätverk med höga krav på tillgänglighet och smala SLA-tider.
1.2 Syfte
Syftet med detta arbete är att ge mer kunskap om strömmande telemetri- lösningar för stora nätverk. Vidare ämnar arbetet att utforska insamlings- metodens möjligheter för felsökning av nätverket genom analys av in- samlad data.
1.3 Avgränsningar
Arbetet kommer främst att fokusera på implementering av en testmiljö för strömmande telemetri. Den data som samlas in kan användas för många ändamål som felsökning och automatiserad beslutsfattning, detta arbete kommer endast att fokusera på analys i felsökningssyfte.
Delar av infrastrukturen som krävs för implementering av streaming te-
lemetry är redan i drift på företaget, bl.a Apache Kafka och en TSDB. Det-
ta arbete kommer därför inte att beröra installation och konfiguration av
dessa moduler.
1.4 Konkreta och verifierbara mål
Detta arbete ämnar att uppnå dessa mål:
• Implementera en testplattform för strömmande telemetridata i nät- verk.
• Jämföra alternativ för konstruktion av program för analys av ström- mande data.
• Konstruera ett program för analys av strömmande data i syfte att upptäcka överbelastade länkar samt länkar som upplever snabba förändringar i belastning.
1.5 Översikt
Kapitel 1 ger en introduktion till arbetet samt beskriver arbetets syfte och mål.
Kapitel 2 beskriver teorin om ämnet datainsamling med fokus på nät- verksdrift.
Kapitel 3 beskriver arbetets metoder som används för att utveckla kod och metodiken för arbetets analys.
Kapitel 4 går igenom konstruktionen av skriptet som används för analy- sen.
Kapitel 5 redovisar och visualiserar analysens resultat.
Kapitel 6 reflekterar över arbetet och metoderna som användes för att skaffa resultaten samt en konsekvensanalys om nätverksautomatisering.
Kapitel 7 utformar slutsatser och ger rekommendationer för fortsatt arbe-
te inom detta område.
2 Teori
2.1 Pull-baserade insamlingsmetoder
Nästan alla nätverk idag använder någon form av datainsamling för att övervaka nätverkets hälsa och felsöka problem. Ett av de äldsta och mest vanligt förekommande protokollen är SNMP(Simple Network Manage- ment Protocol), vars första version har använts sedan 80-talet[1].
Martin-Flatin beskriver pull-baserade metoder såsom SNMP är baserade på request/response-modellen, där klienten skickar en request till servern och servern svarar antingen synkront eller asynkront. Detta kan liknas med att klienten drardata från servern, där klienten är en manager/NMS och servern är en nätverksenhet[2, sec 3.1].
I en artikel publicerad av Cisco argumenterar Shelly Cadora att pull-baserade datainsamlingsmetoder är väldigt resursintensiva, och har hög overhead, vilket gör att protokoll som SNMP blir allt mindre lämpliga i takt med att nätverken växer och mängden enheter som en manager hämtar data från ökar[3].
I artikeln beskriver Shelly Cadora vidare om SNMPs GetBulk-kommando för att hämta stora mängder data, genom att fylla ett paket med så många kolumner som möjligt. Om hela tabellen inte får plats så skickas en ny GetBulk-request från managern, till dess att svarspaketen innehåller OID från en annan tabell. För stora tabeller kan detta innebära många requests och väldigt stor belastning på nätverksenheten. I stora nätverk så är det inte ovanligt med NMS-redundans, vilket betyder två iterationer av den- na väldigt resurskrävande syssla. Eftersom nätverksenheten måste pro- cessa dessa GetBulk-requests oberoende av varandra leder detta till dub- belt arbete, även om primary och backup manager frågade efter samma MIB samtidigt[3].
2.2 Push-baserade insamlingsmetoder
Ett alternativ till de traditionella pull-baserade metoderna för datainsamn- ling är de push-baserade metoderna. Dessa metoder använder
publish/subscribe/distribute-modellen istället för request/response-modellen.
Martin-Flatin beskriver de push-baserade metodernas operation: Agen-
ten publicerar först vilken typ av information som kan skickas. Därefter
prenumererar en manager på den informationen som den vill ha, som
kan skickas via schemaläggning eller asynkront. Efter detta behöver ma-
nagern inte kommunicera direkt med agenten, agenten pushar"istället in-
formationen till managern[2, sec 3.1].
Martin-Flatin förklarar vidare fördelarna med att använda push-metoder, som minskad belastning på nätverket och förflyttning av en del av CPU- belastningen från managern till agenten. Martin-Flatin menar att en stor del av pull-metodernas overhead orsakas av den repetitiva naturen av nätverksdrift och datainsamling. Som exempel tar han upp ett vanligt sätt att kolla om en agent är online genom att förfråga samma OID-varibel t.ex sysObjectID, vilket snabbt blir resurskrävande och ineffektivt om en manager ska fråga alla agenter varje polling-cykel[2, sec 4].
Ett problem som push-metoder behöver lösa är synkronisering. Om au- tomatiserad nätverksövervakning och/eller datainsamling används kan osynkroniserade klockor leda till falsklarm och att data går förlorad. Martin- Flatin rekommenderar därför användning av t.ex NTP för att säkerstäl- la att schemalagda händelser och insamlingar fungerar korrekt. Martin- Flatin menar att denna synkroniserings-overhead är försumbar jämfört med den minskade CPU- och nätverksbelastningen som en övergång från pull till push-metoden innebär[2, sec 4].
2.3 Pull kontra Push-metod?
Martin-Flatin beskriver en väldigt enkel och relaterbar metafor som jäm- för de olika modellerna:
”The newspaper metaphor is a simple illustration of these models: if you want to read your favourite newspaper everyday, you can either go and buy it every morning, or subscribe to it once and then receive it automatically at home. The former is an example of pull, the latter of push.”[2, sec 3.1]
De två metoderna uppfyller i slutändan samma krav: insamling av data.
Skillnaden emellan metoderna ligger som tidigare nämnt i resursanvänd- ningen och belastning på nätverket.
Som exempel medför SNMPs nyttjande av SMIv1 för SNMPv1[4] och SMIv2 för SNMPv2 och SNMPv3[5] en högre overhead på grund av dess användning av ASN.1 med BER. BER har fått kritik för att vara onödigt stor i förhållande till mängden data, vilket resulterar i högre belastning på nätverket[2, sec 2.2].
2.4 Streaming telemetry - en översikt
En plattform för strömmande telemetri är uppbyggd av många system
som tillsammans formar en nyttig informationskedja. Många alternativ
för implementation av denna insamlingsmetod är öppna och använder
formateringsstandarder som stöds av en uppsjö olika system.
Cisco beskriver streaming telemetry som en push-baserad metod för da- tainsamling som möjliggör kontinuerligt strömmande av data i nära real- tid[6].
Telemetridata skickas oftast till en s.k collector, vars uppgift är att sam- la in data från flera enheter och formatera datat till den notation som förväntas av resten av övervakningsinfrastrukturen. T.ex kan collectorn Pipeline formatera data i JSON för användning i en Apache Kafka-buss eller till öppna format som används av t.ex Prometheus eller InfluxDB[7], två populära öppna alternativ för Tidsserie-databaser och systemöverva- kare[8][9].
Mera information om collectors och Cisco Pipeline finns på XRDocs[10]
och denna artikel[7] från Shelly Cadora.
2.4.1 Apache Kafka
Apache Kafka är ett populärt val för implementering i allehanda applika- tioner där hantering av meddelanden i realtid är ett krav. Apache Kafka är ett meddelandesystem vars funktion är att passera meddelanden från ett system till ett annat, utan att övriga system behöver tänka på medde- landehanteringen. Kafka arbetar enligt publish-subscribe-modellen, och lämpar sig därför särskilt väl till distribution av meddelanden till många konsumenter i realtid.[11]
Kafka organiserar meddelanden i topics som separerar olika meddelan- deköer ifrån varandra. Detta är särskilt bra för miljöer där många system kan köras på samma Kafka-server utan att blandas ihop. Kafka lagrar meddelanden i en indexerbar lista där de senaste meddelandena läggs till i ena änden. Det gör att man med en offset kan exempelvis hämta de senaste 50 meddelandena ur kön.[12]
PyKafka och Confluent-Kafka-Python
Det finns många alternativ för att kommunicera med en Kafka-server. Fle- ra bibliotek för språk såsom Python och C finns tillgängliga gratis, två ex- empel på Python-bibliotek är PyKafka och Confluent-Kafka-Python. Båda dessa bibliotek uppfyller samma funktion, dock skiljer sig implementatio- nerna åt.
PyKafka
Biblioteket PyKafka är helt och hållet Python-baserat, med stöd för att
använda C-biblioteket librdkafka istället för den python-baserade imple-
mentationen. Enligt PyKafkas dokumentation är bibliotekets primära mål
att ge användaren en hög grad av abstraktion och ett API som är så pyt- honiskt som möjligt[13]. PyKafka är utvecklat av Parse.ly, ett företag som utvecklar mjukvara för webb-analys och innehållsoptimering för online- publishing[14].
Confluent-Kafka-Python
Ett alternativ till PyKafka är Confluent-Kafka-Python, som utvecklas och underhålls av Confluent, Inc. Confluent är skaparna av Apache Kafka och Confluent Platform[15] som Confluent-Kafka-Python också stödjer.
Confluent-Kafka-Python är en wrapper som är byggd kring C-biblioteket librdkafka och kräver därför installation av librdkafka[16][17], till skill- nad från PyKafka som har inbyggda Python-baserade funktioner(se sek.
2.4.1).
2.4.2 Konfiguration av Streaming Telemetry
Konfiguration av streaming telemetry sker vanligtvis med YANG via NETCONF och data som skickas till en manager är även detta baserat på datamodel-
len YANG.[6] YANG är skapat av IETF och är datamodellen som används för all data som sänds över management-protokoll såsom NETCONF. YANG inkluderar modeller för all data som används för NETCONF-operationer, såsom konfigurationsdata, statistik, RPC och notifieringar.[18]
Streaming telemetry är som tidigare nämnt en push-modell, och konfi- gureras enligt publish/subscribe/distribute-modellen. För att etablera en subscription till en enhet så skickas en YANG ”establish-subscription”
RPC(Remote Procedure Call), som bl.a innehåller information om vilken data som ska skickas.[19]
Mera information om streaming telemetry och dess konfiguration kan hit- tas på Cisco DevNet[20].
Ett exempel på en establish-subscription RPC visas i kodexemplet nedan.
Denna RPC skapar en on-change subscription på alla ändringar i enhetens
CDP-tabell.
Kodexempel 1 : Exempel på YANG-RPC för on-change subscription 1 < rpc message - id = ''101 '' xmlns = ''
urn:ietf:params:xml:ns:netconf:base:1.0 ''>
2 <establish - subscription xmlns = ''
urn:ietf:params:xml:ns:yang:ietf -event - notifications '' xmlns:yp = ''
urn:ietf:params:xml:ns:yang:ietf -yang - push ''>
3 < stream > yp:yang -push </ stream >
4 <yp:xpath - filter > /cdp -ios -xe - oper:cdp - neighbour - details /cdp - neighbour -detail </ yp:xpath - filter >
5 <yp:dampening -period >0 </ yp:dampening -period >
6 </ establish - subscription >
7 </ rpc >
Det finns två typer av subscription som kan konfigureras i YANG: pe-
riodic och on-change. En periodic subscription skickar ut uppdatering-
ar enligt ett konfigurerat tidsintervall. En on-change-subscription skickar
endast ut uppdateringar när en ändring sker i den prenumererade infor-
mationen. Kodexempel 1 visar en on-change subscription som skickar ut
en uppdatering varje gång en ändring sker i enhetens CDP-tabell.[6]
3 Metod
Detta arbete kommer att implementera en testplattform för streaming te- lemetry och utföra analys på det insamlade datat. Insamlingen av datat kommer att göras i Apache Kafka och konsumeras av analys-skripten.
Detta arbetes undersökning kommer att utvärdera två Python-bibliotek som kan användas för att hämta och analysera data från Kafka. Dessa bibliotek är:
• PyKafka - Ett alternativ till Kafka-Python som underhålls av Parsly.
• confluent-kafka-python - Detta bibliotek underhålls av Confluent som skapade Kafka.
3.1 Verktyg
De verktyg som används för att utföra undersökningen är Ciscos Pipeline- collector som är kopplad till Apache Kafka. Språket Python kommer att användas tillsammans med de bibliotek som skall undersökas. Analysda- tat tillhandahålls av en Cisco router med IOS XR programvara. Mätning av minnesanvändning sker med programmet htop(1).
3.2 Bedömningskriterier
Biblioteken kommer att utvärderas efter följande kriterier:
• Dokumentation - Har biblioteket en välskriven dokumentation som förenklar implementationsarbetet?
• Kodmängd - Hur många rader kod krävs för att uppnå ett givet re- sultat?
• Minnesanvändning - Hur stor skillnad är det emellan biblioteken i minnesanvändning?
3.3 Mätning av minnesanvändning
Att jämföra minneanvändning är viktigt för skalbarhet. Eftersom detta ar- bete utvecklar en prototyp används endast en nätverksenhet för datain- samling. Minnesanvändningen mellan de två biblioteken kan ge en trolig bild över vilket bibliotek som bäst hanterar flera enheter i en produktions- miljö.
Minnesanvändningen kommer att mätas med programmet htop(1) efter
att skriptet har körts i 10 minuter. Därefter kommer resultaten att jämföras
mot varandra och skillnaden i minnesanvändning mätt i procent kommer att redovisas i del 5.
3.4 Installation och konfigurering av Pipeline
Att installera Pipeline är en simpel process. Allt som krävs för att komma igång är att ladda ned repositoriet från GitHub och starta programmet med startskriptet. Nätverksenheter som skickar data till Pipeline konfi- gurerades som dial-out, vilket betyder att de skickar data till collectorns IP-adress där collectorn redan lyssnar.
För att skicka data till Kafka så konfigurerades Pipeline med adresserna för de tre redan tillgängliga Kafka-servrarna, som finns i företagets pro- duktionsmiljö.
3.5 Modell av tilltänkt teknisk lösning
Mina tekniska lösningar för att uppnå arbetets mål kommer att följa funk- tionsmodellen i flödesdiagrammet nedan:
Start
Läs meddelan- de från Kafka
Lagra interface-värden, timestamp i buffer
Skapa delta på interface- värden och timestamp
Länken överbelastad? Larm till tekniker/NMS
Länkbelastning >
60% av medelvärde?
Länk OK, inget larm
Stop
Ja
Nej
Ja
Nej Interrupt