Sistema di gestione di a cunfigurazione di a rete di filtrazione Qrator

Sistema di gestione di a cunfigurazione di a rete di filtrazione Qrator

TL; DR: Descrizzione di l'architettura cliente-servitore di u nostru sistema di gestione di cunfigurazione di a rete interna, QControl. Hè basatu annantu à un protocolu di trasportu à dui strati chì travaglia cù missaghji gzip-packed senza decompressione trà i punti finali. I routers distribuiti è i punti finali ricevenu l'aghjurnamenti di a cunfigurazione, è u protokollu stessu permette l'installazione di relè intermedi localizzati. U sistema hè custruitu nantu à u principiu backup differenziale ("recent-stabile", spiegatu sottu) è usa a lingua di dumanda JMESpath cù u mutore di mudelli Jinja per rende i schedarii di cunfigurazione.

Qrator Labs opera una rete di mitigazione di attaccu distribuita in u mondu. A nostra reta opera nantu à u principiu anycast, è i subnets sò annunziati via BGP. Essendu una reta BGP anycast fisicamente situata in parechje regioni di a Terra, pudemu processà è filtrà u trafficu illegittimu più vicinu à u core di l'Internet - Operatori Tier-1.

Per d 'altra banda, esse una reta di distribuzione geografica ùn hè micca faciule. A cumunicazione trà i punti di prisenza di a rete hè critica per u fornitore di serviziu di sicurità per avè una cunfigurazione coherente di tutti i nodi di a rete, aghjurnendu in una manera puntuale. Dunque, per furnisce u più altu livellu pussibule di serviziu core à u cunsumadore, avemu bisognu di truvà un modu per sincronizà in modu affidabile e dati di cunfigurazione in i cuntinenti.

In u principiu era a Parola. Hè diventatu rapidamente un protokollu di cumunicazione in bisognu di un aghjurnamentu.


A basa di l'esistenza di QControl, è à u listessu tempu u mutivu principale per passà una quantità significativa di tempu è risorse per custruisce stu tipu di protokollu, hè a necessità di ottene una sola fonte autoritaria di cunfigurazione è, in fine, sincronizà i nostri punti di prisenza. cun ella. L'almacenamiento stessu era solu unu di parechje esigenze durante u sviluppu di QControl. Inoltre, avemu ancu bisognu di integrazioni cù servizii esistenti è pianificati in punti di presenza (POP), metudi intelligenti (è persunalizabili) di validazione di dati, è ancu di cuntrollu di accessu. In più di questu, avemu ancu vulsutu cuntrullà un tali sistema utilizendu cumandamenti invece di fà mudificazioni à i schedari. Prima di QControl, i dati sò stati mandati à i punti di presenza quasi manualmente. Se unu di i punti di prisenza ùn era micca dispunibule è avemu scurdatu di aghjurnà dopu, a cunfigurazione finisci fora di sincronia è duvemu perde u tempu per ripiglià è funziona.

In u risultatu, avemu ghjuntu cù u schema seguente:
Sistema di gestione di a cunfigurazione di a rete di filtrazione Qrator
U servitore di cunfigurazione hè rispunsevule per a validazione è l'almacenamiento di dati; u router hà parechji punti finali chì ricevenu è trasmettenu l'aghjurnamenti di cunfigurazione da i clienti è i squadre di supportu à u servitore, è da u servitore à i punti di presenza.

A qualità di cunnessione Internet varia assai in u mondu - per illustrà stu puntu, fighjemu un MTR simplice da Praga, Repubblica Ceca à Singapore è Hong Kong.

Sistema di gestione di a cunfigurazione di a rete di filtrazione Qrator
MTR da Praga à Singapore

Sistema di gestione di a cunfigurazione di a rete di filtrazione Qrator
Listessa cosa à Hong Kong

Latenza alta significa velocità più bassa. Inoltre, ci hè a perdita di pacchetti. A larghezza di u canali ùn cumpensà micca stu prublema, chì deve sempre esse cunsideratu quandu custruisce sistemi decentralizati.

A cunfigurazione completa di un puntu di prisenza hè una quantità significativa di dati chì deve esse mandatu à parechji destinatari nantu à cunnessione inaffidabile. Fortunatamente, anche se a cunfigurazione cambia constantemente, succede in picculi incrementi.

Disegnu recente stabile

Pudemu dì chì a custruzzione di una reta distribuita basata nantu à u principiu di l'aghjurnamenti incrementali hè una suluzione abbastanza ovvia. Ma ci sò assai prublemi cù diffs. Avemu bisognu di salvà tutte e diffizzioni trà i punti di riferimentu, è ancu esse capaci di rinvià in casu chì qualchissia hà mancatu una parte di e dati. Ogni destinazione deve applicà in una sequenza strettamente specificata. Di genere, in u casu di parechje destinazioni, una tale operazione pò piglià assai tempu. U receptore deve ancu esse capace di dumandà e parti mancanti è, sicuru, a parte cintrali deve risponde à una tale dumanda currettamente, mandendu solu i dati mancanti.

In u risultatu, avemu ghjuntu à una suluzione piuttostu interessante - avemu solu una capa di riferimentu, fissu, chjamemu stabile, è solu una diffarenza per questu - recente. Ogni recente hè basatu annantu à l'ultima stabile generata è hè abbastanza per ricustruisce i dati di cunfigurazione. Appena u frescu recente ghjunghje à u so destinazione, u vechju ùn hè più necessariu.

Tuttu ciò chì resta hè di mandà una cunfigurazione stabile fresca da u tempu à u tempu, per esempiu perchè recenti hè diventatu troppu grande. Ciò chì hè ancu impurtante quì hè chì mandemu tutte queste aghjurnamenti in un modu broadcast / multicast, senza preoccupassi di i destinatari individuali è a so capacità di riunisce pezzi di dati. Una volta simu sicuri chì tutti anu a stabile curretta, mandemu solu novi recenti. Vale a pena chjarificà chì questu funziona? Opere. Stabile hè in cache nantu à u servitore di cunfigurazione è i destinatari, recenti hè creatu cum'è necessariu.

Architettura di trasportu à dui livelli

Perchè avemu custruitu u nostru trasportu à dui livelli? A risposta hè abbastanza simplice - vulemu disaccoppià u routing da a logica d'altu livellu, inspirendu u mudellu OSI cù i so strati di trasportu è applicazione. Avemu usatu Thrift per u rolu di u protocolu di trasportu, è u formatu di serializazione msgpack per u formatu d'altu livellu di i missaghji di cuntrollu. Hè per quessa chì u router (realizendu multicast / broadcast / relay) ùn guarda micca in msgpack, ùn sbulicà o imballa u cuntenutu, è solu trasmette dati.

Thrift (da l'inglese - "thrift", pronunzianu [θrift]) hè una lingua di descrizzione di l'interfaccia chì hè aduprata per definisce è creà servizii per diverse lingue di prugrammazione. Hè un framework per e chjama di prucedura remota (RPC). Unisce un pipeline di software cù un mutore di generazione di codice per sviluppà servizii chì travaglianu in modu più o menu efficace è faciule trà e lingue.

Avemu sceltu u framework Thrift per via di RPC è supportu per parechje lingue. Comu solitu, i parti faciuli eranu u cliente è u servitore. Tuttavia, u router hè diventatu una noce dura per crack, in parte per via di a mancanza di una suluzione pronta durante u nostru sviluppu.

Sistema di gestione di a cunfigurazione di a rete di filtrazione QratorCi sò altre opzioni, cum'è protobuf / gRPC, in ogni modu, quandu avemu principiatu u nostru prughjettu, gRPC era abbastanza novu è ùn avemu micca cura di piglià à bordu.

Di sicuru, pudemu (è in fattu duverebbe) custruisce a nostra propria bicicletta. Saria più faciule per creà un protokollu per ciò chì avemu bisognu perchè l'architettura di u cliente-servitore hè relativamente semplice da implementà cumparatu cù a custruzione di un router in Thrift. In un modu o l'altru, ci hè un preghjudiziu tradiziunale versu i protokolli scritti da sè stessu è l'implementazione di biblioteche populari (per una bona ragione); in più, durante e discussioni, a quistione hè sempre: "Cumu andemu à portà questu in altre lingue?" Allora avemu immediatamente cacciatu l'idea di una bicicletta.

Msgpack hè simile à JSON, ma più veloce è più chjucu. Hè un furmatu di serializazione di dati binari chì permette di scambià dati trà parechje lingue.

À u primu livellu avemu Thrift cù l'infurmazione minima necessaria per u router per trasmette u messagiu. À u sicondu livellu ci sò strutture msgpack imballate.

Avemu sceltu msgpack perchè hè più veloce è più compactu cumparatu cù JSON. Ma più importantemente, sustene i tipi di dati persunalizati, chì ci permettenu di utilizà funzioni cool cum'è passà binari crudi o oggetti speciali chì indicanu l'absenza di dati, chì era impurtante per u nostru schema "stabile recente".

JMESPath
JMESPath hè una lingua di dumanda JSON.
Questu hè esattamente ciò chì a descrizzione chì avemu da a documentazione ufficiale di JMESPath pari, ma in fattu, face assai più di questu. JMESPath vi permette di circà è filtrà subtrees in una struttura d'arburu arbitraria, è applicà cambiamenti à e dati nantu à a mosca. Si permette dinù voi à aghjunghje filtri spiciali è prucedure di trasfurmazioni di dati. Ancu s'ellu, sicuru, esige un sforzu di u cervellu per capiscenu.

u nomu
Per certi cunsumatori, avemu bisognu di trasfurmà a cunfigurazione in un schedariu - cusì usemu un mutore di mudellu è Jinja hè a scelta ovvia. Cù u so aiutu, generà un schedariu di cunfigurazione da u mudellu è i dati ricevuti à u destinazione.

Per generà un schedariu di cunfigurazione, avemu bisognu di una dumanda JMESPath, un mudellu per u locu di u schedariu in u FS, è un mudellu per a cunfigurazione stessu. Hè ancu una bona idea in questa fase per chjarificà i permessi di u schedariu. Tuttu chistu hè statu cumminatu cun successu in un schedariu - prima di l'iniziu di u mudellu di cunfigurazione, mettemu un capu in u formatu YAML chì descrive u restu.

Per esempiu:

---
selector: "[@][[email protected]._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) }}

Per fà un schedariu di cunfigurazione per un novu serviziu, aghjustemu solu un novu schedariu di mudellu. Nisuna mudificazione di u codice fonte o di u software nantu à i punti di presenza hè necessariu.

Chì hè cambiatu da quandu QControl hè andatu in diretta? U primu è più impurtante hè a consegna coherente è affidabile di l'aghjurnamenti di cunfigurazione à tutti i nodi in a reta. U sicondu hè di riceve un strumentu putente per verificà a cunfigurazione è fà cambiamenti in questu da u nostru squadra di supportu, è ancu da i cunsumatori di u serviziu.

Pudemu fà tuttu questu utilizendu u schema di aghjurnamentu recente-stabile per simplificà a cumunicazione trà u servitore di cunfigurazione è i destinatari di cunfigurazione. Utilizà un protokollu di dui strati per sustene un modu indipendente da u cuntenutu di u routing di dati. Integratu cù successu un mutore di generazione di cunfigurazione basatu in Jinja in una rete di filtrazione distribuita. Stu sistema sustene una larga gamma di metudi di cunfigurazione per i nostri periferichi distribuiti è eterogenei.

Grazie per u vostru aiutu à scrive u materiale. VolanDamrod, serenheit, NoN.

Versione inglese postu.

Source: www.habr.com

Add a comment