De evolúsje fan 'e arsjitektuer fan it hannels- en ferwideringssysteem fan' e Moskouse Exchange. Diel 1

De evolúsje fan 'e arsjitektuer fan it hannels- en ferwideringssysteem fan' e Moskouse Exchange. Diel 1

Hoi allegearre! Myn namme is Sergey Kostanbaev, by de Exchange ûntwikkelje ik de kearn fan it hannelssysteem.

As Hollywood-films de New York Stock Exchange sjen litte, sjocht it der altyd sa út: mannichte minsken, elkenien ropt wat, swaait mei papieren, folsleine gaos bart. Dit is hjir nea bard op 'e Moskouse Exchange, om't hannel fan it begjin ôf elektroanysk útfierd is en is basearre op twa haadplatfoarms - Spectra (forex merk) en ASTS (bûtenlânske útwikseling, stock en jildmerk). En hjoed wol ik prate oer de evolúsje fan 'e arsjitektuer fan it ASTS hannels- en ferwideringssysteem, oer ferskate oplossingen en befiningen. It ferhaal sil lang duorje, dus ik moast it yn twa dielen brekke.

Wy binne ien fan de pear útwikselings yn 'e wrâld dy't hannelet fermogen fan alle klassen en jout in folslein oanbod fan útwikseling tsjinsten. Bygelyks, ferline jier rangearre wy twadde yn 'e wrâld yn termen fan bondelhandelsvolume, 25e plak ûnder alle oandielbeurzen, 13e plak yn kapitalisaasje ûnder iepenbiere útwikselingen.

De evolúsje fan 'e arsjitektuer fan it hannels- en ferwideringssysteem fan' e Moskouse Exchange. Diel 1

Foar profesjonele hannelsdielnimmers binne sokke parameters as antwurdtiid, stabiliteit fan tiidferdieling (jitter) en betrouberens fan it hiele kompleks kritysk. Wy ferwurkje op it stuit tsientallen miljoenen transaksjes per dei. De ferwurking fan elke transaksje troch de systeemkernel duorret tsientallen mikrosekonden. Fansels hawwe mobile operators op âldjiersnacht of sykmasines sels in hegere wurkdruk as uzes, mar yn termen fan wurkdruk, tegearre mei de boppeneamde skaaimerken, kinne in pear mei ús fergelykje, liket my. Tagelyk is it wichtich foar ús dat it systeem gjin sekonde fertraget, absolút stabyl wurket, en alle brûkers binne op gelikense foet.

In bytsje skiednis

Yn 1994 waard it Australyske ASTS-systeem lansearre op 'e Moskou Interbank Currency Exchange (MICEX), en fan dat momint kin de Russyske skiednis fan elektroanyske hannel teld wurde. Yn 1998 waard de útwikselingsarsjitektuer modernisearre om ynternethannel yn te fieren. Sûnt dy tiid is de snelheid fan ymplemintaasje fan nije oplossingen en arsjitektoanyske feroarings yn alle systemen en subsystemen allinich momentum wurden.

Yn dy jierren wurke it útwikselingssysteem oan hi-end hardware - ultrabetroubere HP Superdome 9000-servers (boud op de PA-RISC), wêryn absolút alles waard duplicated: ynput / útfier subsystemen, netwurk, RAM (yn feite wie d'r in RAID-array fan RAM), processors (hot-swappable). It wie mooglik om elke tsjinner komponint te feroarjen sûnder de masine te stopjen. Wy fertrouden op dizze apparaten en beskôgen se praktysk fail-safe. It bestjoeringssysteem wie in Unix-lykas HP UX-systeem.

Mar sûnt sawat 2010 is in ferskynsel ûntstien neamd hege frekwinsje hannel (HFT), of hege frekwinsje hannel - gewoanwei, stock exchange robots. Yn mar 2,5 jier is de lading op ús servers 140 kear ferhege.

De evolúsje fan 'e arsjitektuer fan it hannels- en ferwideringssysteem fan' e Moskouse Exchange. Diel 1

It wie ûnmooglik te wjerstean sa'n lêst mei de âlde arsjitektuer en apparatuer. It wie nedich om ien of oare manier oan te passen.

Thús

Oanfragen foar it útwikselingssysteem kinne wurde ferdield yn twa soarten:

  • Transaksjes. As jo ​​dollars, oandielen of wat oars wolle keapje, stjoere jo in transaksje nei it hannelssysteem en krije in antwurd oer sukses.
  • Ynformaasje fersiken. As jo ​​​​de hjoeddeistige priis wolle útfine, besjoch it bestelboek of yndeksen, stjoer dan ynformaasjeoanfragen.

De evolúsje fan 'e arsjitektuer fan it hannels- en ferwideringssysteem fan' e Moskouse Exchange. Diel 1

Skematysk kin de kearn fan it systeem wurde ferdield yn trije nivo's:

  • It klantnivo, wêrop brokers en kliïnten wurkje. Se ynteraksje allegear mei tagongsservers.
  • Gateway-tsjinners binne caching-tsjinners dy't alle ynformaasjefersiken lokaal ferwurkje. Wolle jo witte hokker priis Sberbank-oandielen op it stuit hannelje? It fersyk giet nei de tagongstsjinner.
  • Mar as jo oandielen wolle keapje, dan giet it fersyk nei de sintrale server (Trade Engine). D'r is ien sa'n server foar elk type merk, se spylje in wichtige rol, it is foar har dat wy dit systeem hawwe makke.

De kearn fan it hannelssysteem is in tûke databank yn it ûnthâld wêryn alle transaksjes útwikselingstransaksjes binne. De basis waard skreaun yn C, de ienige eksterne ôfhinklikens wiene de libc-bibleteek en d'r wie hielendal gjin dynamyske ûnthâldallokaasje. Om de ferwurkingstiid te ferminderjen, begjint it systeem mei in statyske set fan arrays en mei statyske gegevensferhuzing: earst wurde alle gegevens foar de aktuele dei yn it ûnthâld laden, en gjin fierdere skiiftagong wurdt útfierd, alle wurk wurdt allinich yn it ûnthâld útfierd. As it systeem begjint, binne alle referinsjegegevens al sortearre, sadat it sykjen tige effisjint wurket en in bytsje tiid nimt yn runtime. Alle tabellen wurde makke mei opdringerige listen en beammen foar dynamyske gegevens struktueren sadat se net nedich ûnthâld tawizing by runtime.

Litte wy koart gean oer de skiednis fan 'e ûntwikkeling fan ús hannels- en clearingsysteem.
De earste ferzje fan 'e arsjitektuer fan' e hannels- en clearingsysteem waard boud op 'e saneamde Unix-ynteraksje: dielde ûnthâld, semafoaren en wachtrijen waarden brûkt, en elk proses bestie út ien tried. Dizze oanpak wie wiidferspraat yn 'e iere jierren '1990.

De earste ferzje fan it systeem befette twa nivo's fan Gateway en in sintrale server fan it hannelssysteem. De workflow wie sa:

  • De klant stjoert in fersyk, dat berikt de Gateway. It kontrolearret de jildigens fan it formaat (mar net de gegevens sels) en fersmyt ferkearde transaksjes.
  • As in ynformaasjefersyk ferstjoerd is, wurdt it lokaal útfierd; as wy it oer in transaksje hawwe, dan wurdt it omlaat nei de sintrale tsjinner.
  • De hannelsmotor ferwurket dan de transaksje, feroaret lokaal ûnthâld, en stjoert in antwurd op 'e transaksje en de transaksje sels foar replikaasje mei in aparte replikaasjemotor.
  • De Gateway ûntfangt it antwurd fan it sintrale knooppunt en stjoert it troch nei de kliïnt.
  • Nei in skoft ûntfangt de Gateway de transaksje fia it replikaasjemeganisme, en dizze kear fiert it lokaal út, en feroaret syn gegevensstruktueren sadat de folgjende ynformaasjeoanfragen de lêste gegevens werjaan.

Yn feite beskriuwt it in replikaasjemodel wêryn de Gateway de aksjes dy't útfierd binne yn it hannelssysteem folslein replikearre. In apart replikaasjekanaal soarge derfoar dat transaksjes yn deselde folchoarder waarden útfierd oer meardere tagongsknooppunten.

Sûnt de koade wie single-threaded, in klassyk skema mei proses foarken waard brûkt om tsjinje in protte kliïnten. It wie lykwols heul djoer om de folsleine databank te gabeljen, sadat lichtgewicht tsjinstprosessen waarden brûkt dy't pakketten sammele fan TCP-sesjes en oerdroegen se nei ien wachtrige (SystemV Message Queue). Gateway en Trade Engine wurken allinich mei dizze wachtrige, en naam transaksjes fan dêrút foar útfiering. It wie net mear mooglik om der in reaksje op te stjoeren, om't net dúdlik wie hokker tsjinstproses it lêze moast. Dus wy taflecht ta in trúk: elk forked proses makke in antwurd wachtrige foar himsels, en as in fersyk kaam yn de ynkommende wachtrige, in tag foar de antwurd wachtrige waard fuortendaliks tafoege oan it.

It konstant kopiearjen fan grutte hoemannichten gegevens fan wachtrige nei wachtrige makke problemen, benammen typysk foar ynformaasjeoanfragen. Dêrom hawwe wy in oare trúk brûkt: neist de antwurdwachtrige makke elk proses ek dielde ûnthâld (SystemV Shared Memory). De pakketten sels waarden pleatst yn it, en allinnich in tag waard opslein yn 'e wachtrige, sadat men kin fine it orizjinele pakket. Dit holp gegevens op te slaan yn 'e prosessor-cache.

SystemV IPC omfettet nutsfoarsjenningen foar it besjen fan de steat fan wachtrige, ûnthâld en semafoarobjekten. Wy hawwe dit aktyf brûkt om te begripen wat der op in bepaald momint yn it systeem bart, wêr't pakketten sammele, wat blokkearre, ensfh.

Earste modernisearring

As earste hawwe wy de Gateway mei ien proses kwyt. It signifikante nadeel wie dat it ien replikaasjetransaksje of ien ynformaasjefersyk fan in klant koe behannelje. En as de lading ferheget, sil Gateway langer duorje om fersiken te ferwurkjen en sil de replikaasjestream net kinne ferwurkje. Derneist, as de klant in transaksje stjoerde, dan hoege jo allinich de jildigens te kontrolearjen en it fierder troch te stjoeren. Dêrom, wy ferfongen de inkele Gateway proses mei meardere komponinten dy't kinne rinne parallel: multi-threaded ynformaasje en transaksje prosessen rinne ûnôfhinklik fan elkoar op in dielde ûnthâld gebiet mei help fan RW locking. En tagelyk hawwe wy ferstjoer- en replikaasjeprosessen yntrodusearre.

Ynfloed fan hannel mei hege frekwinsje

De boppesteande ferzje fan de arsjitektuer bestie oant 2010. Underwilens wiene wy ​​net mear tefreden mei de prestaasjes fan HP Superdome-tsjinners. Derneist wie de PA-RISC-arsjitektuer praktysk dea; de ferkeaper hat gjin wichtige updates oanbean. As gefolch, wy begûn te ferpleatsen fan HP UX / PA RISC nei Linux / x86. De oergong begûn mei de oanpassing fan tagongstsjinners.

Wêrom moasten wy de arsjitektuer wer feroarje? It feit is dat hannel mei hege frekwinsje it loadprofyl op 'e systeemkearn signifikant feroare hat.

Litte wy sizze dat wy in lytse transaksje hawwe dy't in wichtige priisferoaring feroarsake - immen kocht in heal miljard dollar. Nei in pear millisekonden merken alle merkdielnimmers dit en begjinne in korreksje te meitsjen. Natuerlik steane oanfragen yn in enoarme wachtrige, dy't it systeem lang duorret om te wiskjen.

De evolúsje fan 'e arsjitektuer fan it hannels- en ferwideringssysteem fan' e Moskouse Exchange. Diel 1

Op dit ynterval fan 50 ms is de gemiddelde snelheid sawat 16 tûzen transaksjes per sekonde. As wy it finster ferminderje nei 20 ms, krije wy in gemiddelde snelheid fan 90 tûzen transaksjes per sekonde, mei 200 tûzen transaksjes op 'e peak. Mei oare wurden, de lading is net konstant, mei hommelse bursts. En de wachtrige fan oanfragen moat altyd fluch ferwurke wurde.

Mar wêrom stiet der überhaupt in wachtrige? Dat, yn ús foarbyld, hawwe in protte brûkers de priisferoaring opmurken en transaksjes dêroer stjoerd. Se komme nei Gateway, it serialisearret se, stelt in bepaalde folchoarder en stjoert se nei it netwurk. Routers skodzje de pakketten en stjoere se troch. Waans pakket earst oankaam, dy transaksje "wûn". As gefolch, útwikseling kliïnten begûn te merken dat as deselde transaksje waard stjoerd út ferskate Gateways, dan de kânsen fan syn flugge ferwurking tanommen. Al gau begûnen útwikselingsrobots Gateway te bombardearjen mei oanfragen, en in lawine fan transaksjes ûntstie.

De evolúsje fan 'e arsjitektuer fan it hannels- en ferwideringssysteem fan' e Moskouse Exchange. Diel 1

In nije ronde fan evolúsje

Nei wiidweidich testen en ûndersyk binne wy ​​oergien nei de kernel fan it real-time bestjoeringssysteem. Hjirfoar hawwe wy keazen RedHat Enterprise MRG Linux, wêr't MRG stiet foar messaging real-time grid. It foardiel fan real-time patches is dat se it systeem optimisearje foar de fluchste mooglike útfiering: alle prosessen wurde opsteld yn in FIFO-wachtrige, kearnen kinne isolearre wurde, gjin útstjit, alle transaksjes wurde ferwurke yn strikte folchoarder.

De evolúsje fan 'e arsjitektuer fan it hannels- en ferwideringssysteem fan' e Moskouse Exchange. Diel 1
Red - wurkje mei in wachtrige yn in gewoane kernel, grien - wurkje yn in real-time kernel.

Mar it berikken fan lege latency op reguliere servers is net sa maklik:

  • De SMI-modus, dy't yn 'e x86-arsjitektuer de basis is foar it wurkjen mei wichtige perifeare apparaten, interfereart sterk. Ferwurkjen fan alle soarten hardware-eveneminten en behear fan komponinten en apparaten wurdt útfierd troch de firmware yn 'e saneamde transparante SMI-modus, wêryn it bestjoeringssysteem hielendal net sjocht wat de firmware docht. As regel biede alle grutte leveransiers spesjale tafoegings foar firmware-tsjinners dy't it ferminderjen fan it bedrach fan SMI-ferwurking mooglik meitsje.
  • D'r moat gjin dynamyske kontrôle wêze fan 'e prosessorfrekwinsje, dit liedt ta ekstra downtime.
  • As it logboek fan it bestânsysteem wurdt spoeld, komme bepaalde prosessen yn 'e kernel foar dy't ûnfoarspelbere fertragingen feroarsaakje.
  • Jo moatte omtinken jaan oan dingen lykas CPU Affinity, Interrupt affinity, NUMA.

Ik moat sizze dat it ûnderwerp fan it ynstellen fan Linux-hardware en kernel foar realtime ferwurking in apart artikel fertsjinnet. Wy hawwe in protte tiid bestege oan it eksperimintearjen en ûndersykjen foardat wy in goed resultaat helle.

By it ferpleatsen fan PA-RISC-tsjinners nei x86, hoege wy de systeemkoade praktysk net folle te feroarjen, wy hawwe it gewoan oanpast en opnij konfigureare. Tagelyk hawwe wy ferskate bugs repareare. Bygelyks, de gefolgen fan it feit dat PA RISC wie in Big endian systeem, en x86 wie in Little endian systeem, gau boppe: bygelyks, gegevens waarden lêzen ferkeard. De lestiger brek wie dat PA RISC brûkt konsekwint konsekwint (Sequentially konsekwint) ûnthâld tagong, wylst x86 lêsoperaasjes kin opnij oarderje, sadat koade dy't absolút jildich wie op ien platfoarm waard brutsen op in oar.

Nei it wikseljen nei x86, de prestaasjes tanommen hast trije kear, de gemiddelde transaksje ferwurkjen tiid fermindere nei 60 μs.

Litte wy no tichterby sjen hokker wichtige feroarings binne makke oan 'e systeemarsjitektuer.

Hot reserve epos

By it wikseljen nei commodity-tsjinners wiene wy ​​ús bewust dat se minder betrouber wiene. Dêrom, by it meitsjen fan in nije arsjitektuer, wy a priori oannommen de mooglikheid fan falen fan ien of mear knopen. Dêrom wie in hyt standby-systeem nedich dat hiel fluch oerskeakelje koe op reservekopymasines.

Dêrneist wiene der oare easken:

  • Under gjin omstannichheden moatte jo ferwurke transaksjes ferlieze.
  • It systeem moat absolút transparant wêze foar ús ynfrastruktuer.
  • Klanten moatte net falle ferbiningen sjen.
  • Reservearrings moatte gjin signifikante fertraging ynfiere, om't dit in krityske faktor is foar de útwikseling.

By it meitsjen fan in hot standby-systeem hawwe wy sokke senario's as dûbele mislearrings net beskôge (bygelyks it netwurk op ien tsjinner stoppe mei wurkjen en de haadtsjinner beferzen); net beskôgje de mooglikheid fan flaters yn de software omdat se wurde identifisearre tidens testen; en net beskôgje de ferkearde wurking fan de hardware.

As resultaat kamen wy ta it folgjende skema:

De evolúsje fan 'e arsjitektuer fan it hannels- en ferwideringssysteem fan' e Moskouse Exchange. Diel 1

  • De wichtichste tsjinner ynteraksje direkt mei de Gateway tsjinners.
  • Alle transaksjes ûntfongen op 'e haadtsjinner waarden direkt replikearre nei de reservekopytsjinner fia in apart kanaal. De skiedsrjochter (gûverneur) koördinearre de oerstap as der problemen wiene.

    De evolúsje fan 'e arsjitektuer fan it hannels- en ferwideringssysteem fan' e Moskouse Exchange. Diel 1

  • De haadtsjinner ferwurke elke transaksje en wachte op befêstiging fan 'e reservekopytsjinner. Om de wachttiid op in minimum te hâlden, hawwe wy foarkamen wachtsjen op 'e transaksje om te foltôgjen op' e reservekopytsjinner. Sûnt de tiid dy't it duorre foar in transaksje om te reizgjen oer it netwurk wie te fergelykjen mei de útfieringstiid, waard gjin ekstra latency tafoege.
  • Wy koenen allinich de ferwurkingsstatus fan 'e haad- en reservekopyservers kontrolearje foar de foarige transaksje, en de ferwurkingsstatus fan' e hjoeddeistige transaksje wie ûnbekend. Sûnt wy noch brûkten ien-threaded prosessen, wachtsje op in antwurd fan Reservekopy soe hawwe fertrage de hiele ferwurking stream, dus wy makken in ridlik kompromis: wy kontrolearre it resultaat fan de foarige transaksje.

De evolúsje fan 'e arsjitektuer fan it hannels- en ferwideringssysteem fan' e Moskouse Exchange. Diel 1

It skema wurke as folget.

Litte wy sizze dat de haadtsjinner ophâldt te reagearjen, mar de Gateways bliuwe kommunisearje. In time-out komt foar op de reservekopy tsjinner, it kontakt de Gûverneur, dy't jout it de rol fan 'e wichtichste tsjinner, en alle Gateways wikselje nei de nije wichtichste tsjinner.

As de haadtsjinner wer online komt, triggert it ek in ynterne time-out, om't d'r in bepaalde tiid gjin oproppen binne nei de tsjinner fan 'e Gateway. Dan wendt er him ek ta de Gûverneur, en dy slút him út fan it skema. As resultaat wurket de útwikseling mei ien server oant it ein fan 'e hannelsperioade. Sûnt de kâns op in tsjinner flater is frij leech, dit skema waard beskôge frij akseptabel; it befette gjin komplekse logika en wie maklik te testen.

To continue.

Boarne: www.habr.com

Add a comment