
TL; DR: MÅ«su iekÅ”ÄjÄ tÄ«kla konfigurÄcijas pÄrvaldÄ«bas sistÄmas QControl klienta-servera arhitektÅ«ras apraksts. Tas ir balstÄ«ts uz divu slÄÅu transporta protokolu, kas darbojas ar gzip pakotiem ziÅojumiem bez dekompresijas starp galapunktiem. IzplatÄ«tie marÅ”rutÄtÄji un galapunkti saÅem konfigurÄcijas atjauninÄjumus, un pats protokols ļauj instalÄt lokalizÄtus starprelejus. SistÄma ir veidota pÄc principa (ārecent-stableā, paskaidrots tÄlÄk) un izmanto JMESpath vaicÄjumu valodu kopÄ ar Jinja veidÅu dzinÄju, lai renderÄtu konfigurÄcijas failus.
Qrator Labs pÄrvalda globÄli izplatÄ«tu uzbrukumu mazinÄÅ”anas tÄ«klu. MÅ«su tÄ«kls darbojas pÄc anycast principa, un apakÅ”tÄ«kli tiek reklamÄti, izmantojot BGP. TÄ kÄ BGP anycast tÄ«kls fiziski atrodas vairÄkos Zemes reÄ£ionos, mÄs varam apstrÄdÄt un filtrÄt neleÄ£itÄ«mu trafiku tuvÄk interneta kodolam - 1. lÄ«meÅa operatoriem.
No otras puses, bÅ«t Ä£eogrÄfiski sadalÄ«tam tÄ«klam nav viegli. SaziÅa starp tÄ«kla klÄtbÅ«tnes punktiem ir ļoti svarÄ«ga, lai droŔības pakalpojumu sniedzÄjam bÅ«tu konsekventa visu tÄ«kla mezglu konfigurÄcija, tos savlaicÄ«gi atjauninot. TÄpÄc, lai patÄrÄtÄjam nodroÅ”inÄtu visaugstÄko iespÄjamo pamatpakalpojumu lÄ«meni, mums bija jÄatrod veids, kÄ droÅ”i sinhronizÄt konfigurÄcijas datus dažÄdos kontinentos.
IesÄkumÄ bija VÄrds. Tas Ätri kļuva par sakaru protokolu, kam nepiecieÅ”ams atjauninÄjums.
QControl pastÄvÄÅ”anas stÅ«rakmens un vienlaikus galvenais iemesls ievÄrojama laika un resursu tÄrÄÅ”anai Å”Äda veida protokola izveidei ir nepiecieÅ”amÄ«ba iegÅ«t vienu autoritatÄ«vu konfigurÄcijas avotu un galu galÄ sinhronizÄt mÅ«su klÄtbÅ«tnes punktus. ar to. Pati krÄtuve bija tikai viena no vairÄkÄm prasÄ«bÄm QControl izstrÄdes laikÄ. TurklÄt mums bija nepiecieÅ”ama arÄ« integrÄcija ar esoÅ”ajiem un plÄnotajiem pakalpojumiem klÄtbÅ«tnes punktos (POP), viedÄs (un pielÄgojamÄs) datu validÄcijas metodes, kÄ arÄ« piekļuves kontrole. TurklÄt mÄs vÄlÄjÄmies kontrolÄt Å”Ädu sistÄmu, izmantojot komandas, nevis veicot failu modifikÄcijas. Pirms QControl dati uz klÄtbÅ«tnes punktiem tika nosÅ«tÄ«ti gandrÄ«z manuÄli. Ja kÄds no klÄtbÅ«tnes punktiem nebÅ«tu pieejams un mÄs to vÄlÄk aizmirsÄm atjauninÄt, konfigurÄcija netiks sinhronizÄta un mums bÅ«s jÄtÄrÄ laiks, lai to atjaunotu un palaistu.
RezultÄtÄ mÄs nonÄcÄm pie Å”Ädas shÄmas:

KonfigurÄcijas serveris ir atbildÄ«gs par datu validÄciju un uzglabÄÅ”anu; marÅ”rutÄtÄjam ir vairÄki galapunkti, kas saÅem un pÄrraida konfigurÄcijas atjauninÄjumus no klientiem un atbalsta komandÄm uz serveri un no servera uz klÄtbÅ«tnes punktiem.
Interneta savienojuma kvalitÄte joprojÄm ir ļoti atŔķirÄ«ga visÄ pasaulÄ ā lai ilustrÄtu Å”o punktu, apskatÄ«sim vienkÄrÅ”u MTR no PrÄgas, Äehijas lÄ«dz SingapÅ«rai un Honkongai.
MTR no PrÄgas uz SingapÅ«ru
Tas pats ar Honkongu
Liels latentums nozÄ«mÄ mazÄku Ätrumu. TurklÄt ir pakeÅ”u zudums. KanÄla platums nekompensÄ Å”o problÄmu, kas vienmÄr ir jÄÅem vÄrÄ, veidojot decentralizÄtas sistÄmas.
Pilna klÄtbÅ«tnes punkta konfigurÄcija ir ievÄrojams datu apjoms, kas ir jÄnosÅ«ta daudziem adresÄtiem, izmantojot neuzticamus savienojumus. Par laimi, lai gan konfigurÄcija nepÄrtraukti mainÄs, tas notiek nelielos soļos.
Nesen stabils dizains
Var teikt, ka izplatÄ«ta tÄ«kla izveide, pamatojoties uz pakÄpenisku atjauninÄjumu principu, ir diezgan acÄ«mredzams risinÄjums. Bet ar atŔķirÄ«bÄm ir daudz problÄmu. Mums ir jÄsaglabÄ visas atŔķirÄ«bas starp atskaites punktiem, kÄ arÄ« jÄspÄj tÄs nosÅ«tÄ«t atkÄrtoti, ja kÄds palaida garÄm daļu datu. Katram galamÄrÄ·im tie ir jÄpiemÄro stingri noteiktÄ secÄ«bÄ. Parasti vairÄku galamÄrÄ·u gadÄ«jumÄ Å”Äda darbÄ«ba var aizÅemt ilgu laiku. UztvÄrÄjam arÄ« jÄspÄj pieprasÄ«t trÅ«kstoÅ”Äs daļas un, protams, centrÄlajai daļai uz Å”Ädu pieprasÄ«jumu ir jÄatbild korekti, nosÅ«tot tikai trÅ«kstoÅ”os datus.
RezultÄtÄ mÄs nonÄcÄm pie diezgan interesanta risinÄjuma - mums ir tikai viens atsauces slÄnis, fiksÄts, sauksim to par stabilu, un tam tikai viena atŔķirÄ«ba - nesen. Katrs nesenais ir balstÄ«ts uz pÄdÄjo Ä£enerÄto stabilu un ir pietiekams, lai atjaunotu konfigurÄcijas datus. TiklÄ«dz svaigais nesen sasniedz savu galamÄrÄ·i, vecais vairs nav vajadzÄ«gs.
Atliek tikai laiku pa laikam nosÅ«tÄ«t jaunu stabilu konfigurÄciju, piemÄram, tÄpÄc, ka nesen ir kļuvis pÄrÄk liels. SvarÄ«gi ir arÄ« tas, ka mÄs visus Å”os atjauninÄjumus izsÅ«tÄm apraides/multiraides režīmÄ, neuztraucoties par atseviŔķiem adresÄtiem un viÅu spÄju apkopot datu gabalus. Kad esam pÄrliecinÄti, ka ikvienam ir pareizais stallis, mÄs nosÅ«tÄm tikai jaunus nesenos. Vai ir vÄrts precizÄt, ka tas darbojas? Darbojas. Stable tiek saglabÄta keÅ”atmiÅÄ konfigurÄcijas serverÄ« un adresÄtos, jaunÄkie tiek izveidoti pÄc vajadzÄ«bas.
DivlÄ«meÅu transporta arhitektÅ«ra
KÄpÄc mÄs savu transportu veidojÄm divos lÄ«meÅos? Atbilde ir pavisam vienkÄrÅ”a ā mÄs vÄlÄjÄmies atsaistÄ«t marÅ”rutÄÅ”anu no augsta lÄ«meÅa loÄ£ikas, iedvesmojoties no OSI modeļa ar tÄ transporta un lietojumprogrammu slÄÅiem. MÄs izmantojÄm Thrift transporta protokola lomai un msgpack serializÄcijas formÄtu augsta lÄ«meÅa vadÄ«bas ziÅojumu formÄtam. Å Ä« iemesla dÄļ marÅ”rutÄtÄjs (veic multicast/broadcast/relay) neskatÄs msgpack iekÅ”pusÄ, neizpako un neiepako saturu atpakaļ un tikai pÄrsÅ«ta datus.
Thrift (no angļu valodas - āthriftā, izrunÄ [Īørift]) ir saskarnes apraksta valoda, ko izmanto, lai definÄtu un izveidotu pakalpojumus dažÄdÄm programmÄÅ”anas valodÄm. TÄ ir attÄlo procedÅ«ru izsaukumu (RPC) sistÄma. Apvieno programmatÅ«ras cauruļvadu ar koda Ä£enerÄÅ”anas dzinÄju, lai izstrÄdÄtu pakalpojumus, kas vairÄk vai mazÄk efektÄ«vi un viegli darbojas starp valodÄm.
MÄs izvÄlÄjÄmies Thrift sistÄmu RPC un daudzu valodu atbalsta dÄļ. KÄ parasti, vienkÄrÅ”Äs daļas bija klients un serveris. TomÄr marÅ”rutÄtÄjs izrÄdÄ«jÄs ciets rieksts, daļÄji tÄpÄc, ka mÅ«su izstrÄdes laikÄ trÅ«ka gatava risinÄjuma.
Ir arÄ« citas iespÄjas, piemÄram, protobuf / gRPC, tomÄr, kad mÄs sÄkÄm savu projektu, gRPC bija diezgan jauns, un mÄs neuzdroÅ”inÄjÄmies to pieÅemt.
Protams, mÄs varÄjÄm (un patiesÄ«bÄ vajadzÄja) uzbÅ«vÄt savu velosipÄdu. BÅ«tu vienkÄrÅ”Äk izveidot protokolu tam, kas mums nepiecieÅ”ams, jo klienta-servera arhitektÅ«ru ir salÄ«dzinoÅ”i vienkÄrÅ”i ieviest, salÄ«dzinot ar marÅ”rutÄtÄja izveidi vietnÄ Thrift. VienÄ vai otrÄ veidÄ pastÄv tradicionÄla aizspriedumi pret paÅ”rakstÄ«tiem protokoliem un populÄru bibliotÄku ievieÅ”anu (laba iemesla dÄļ); turklÄt diskusiju laikÄ vienmÄr rodas jautÄjums: "KÄ mÄs to pÄrnessim uz citÄm valodÄm?" TÄpÄc mÄs nekavÄjoties izmetÄm ideju par velosipÄdu.
Msgpack ir lÄ«dzÄ«gs JSON, taÄu ÄtrÄks un mazÄks. Tas ir binÄrs datu serializÄcijas formÄts, kas ļauj apmainÄ«ties ar datiem starp vairÄkÄm valodÄm.
PirmajÄ lÄ«menÄ« mums ir Thrift ar minimÄlo informÄciju, kas nepiecieÅ”ama, lai marÅ”rutÄtÄjs varÄtu pÄrsÅ«tÄ«t ziÅojumu. OtrajÄ lÄ«menÄ« ir iepakotas msgpack struktÅ«ras.
MÄs izvÄlÄjÄmies msgpack, jo tas ir ÄtrÄks un kompaktÄks salÄ«dzinÄjumÄ ar JSON. Bet vÄl svarÄ«gÄk ir tas, ka tas atbalsta pielÄgotus datu tipus, ļaujot mums izmantot lieliskas funkcijas, piemÄram, neapstrÄdÄtu binÄro failu vai Ä«paÅ”u objektu nodoÅ”anu, kas norÄda uz datu neesamÄ«bu, kas bija svarÄ«gi mÅ«su ānesen-stabilaā shÄmai.
JMESPath
JMESPath ir JSON vaicÄjumu valoda.
TieÅ”i Å”Ädi izskatÄs apraksts, ko iegÅ«stam no oficiÄlÄs JMESPath dokumentÄcijas, taÄu patiesÄ«bÄ tas sniedz daudz vairÄk. JMESPath ļauj meklÄt un filtrÄt apakÅ”kokus patvaļīgÄ koka struktÅ«rÄ un veikt izmaiÅas datos. Tas arÄ« ļauj pievienot Ä«paÅ”us filtrus un datu pÄrveidoÅ”anas procedÅ«ras. Lai gan, lai to saprastu, protams, ir vajadzÄ«gas smadzeÅu pÅ«les.
Jinja
Dažiem patÄrÄtÄjiem mums ir jÄpÄrvÄrÅ” konfigurÄcija failÄ ā tÄpÄc mÄs izmantojam veidÅu dzinÄju, un Jinja ir acÄ«mredzama izvÄle. Ar tÄs palÄ«dzÄ«bu mÄs Ä£enerÄjam konfigurÄcijas failu no veidnes un galamÄrÄ·Ä« saÅemtajiem datiem.
Lai Ä£enerÄtu konfigurÄcijas failu, mums ir nepiecieÅ”ams JMESPath pieprasÄ«jums, faila atraÅ”anÄs vietas veidne FS un paÅ”as konfigurÄcijas veidne. Å ajÄ posmÄ ir arÄ« ieteicams precizÄt faila atļaujas. Tas viss tika veiksmÄ«gi apvienots vienÄ failÄ - pirms konfigurÄcijas veidnes sÄkuma mÄs ievietojÄm galveni YAML formÄtÄ, kas apraksta pÄrÄjo.
PiemÄram:
---
selector: "[@][?@.fft._meta.version == `42`] | items([0].fft_config || `{}`)"
destination_filename: "fft/{{ match[0] }}.json"
file_mode: 0644
reload_daemons: [fft]
...
{{ dict(match[1]) | json(indent=2, sort_keys=True) }}
Lai izveidotu konfigurÄcijas failu jaunam pakalpojumam, mÄs pievienojam tikai jaunu veidnes failu. Nav nepiecieÅ”amas nekÄdas izmaiÅas avota kodÄ vai programmatÅ«rÄ klÄtbÅ«tnes punktos.
Kas ir mainÄ«jies kopÅ” QControl darbÄ«bas uzsÄkÅ”anas? PirmÄ un vissvarÄ«gÄkÄ lieta ir konsekventa un uzticama konfigurÄcijas atjauninÄjumu piegÄde visiem tÄ«kla mezgliem. OtrkÄrt, mÅ«su atbalsta komanda, kÄ arÄ« pakalpojuma patÄrÄtÄji saÅem jaudÄ«gu rÄ«ku, lai pÄrbaudÄ«tu konfigurÄciju un veiktu tajÄ izmaiÅas.
MÄs to visu varÄjÄm izdarÄ«t, izmantojot neseno stabilo atjauninÄÅ”anas shÄmu, lai vienkÄrÅ”otu saziÅu starp konfigurÄcijas serveri un konfigurÄcijas adresÄtiem. DivslÄÅu protokola izmantoÅ”ana, lai atbalstÄ«tu no satura neatkarÄ«gu datu marÅ”rutÄÅ”anas veidu. VeiksmÄ«gi integrÄts Jinja konfigurÄcijas Ä£enerÄÅ”anas dzinÄjs izplatÄ«tajÄ filtrÄÅ”anas tÄ«klÄ. Å Ä« sistÄma atbalsta plaÅ”u konfigurÄcijas metožu klÄstu mÅ«su izplatÄ«tajÄm un neviendabÄ«gajÄm perifÄrijas ierÄ«cÄm.
Paldies par palÄ«dzÄ«bu materiÄla rakstīŔanÄ. , , .
pastu.
Avots: www.habr.com
