Kā mēs izlauzāmies cauri Lielajam Ķīnas ugunsmūrim (2. daļa)

Hi!

Ņikita atkal ir ar jums, sistēmas inženieris no uzņēmuma SEMrush. Un ar Å”o rakstu es turpinu stāstu par to, kā mēs nonācām pie risinājuma ĶīnieÅ”u ugunsmÅ«ris mÅ«su pakalpojumam semrush.com.

Š’ iepriekŔējā daļa ES teicu:

  • kādas problēmas rodas pēc lēmuma pieņemÅ”anas ā€œMums jāpanāk, lai mÅ«su serviss darbotos Ķīnāā€
  • Kādas problēmas ir Ķīnas internetam?
  • kāpēc jums ir nepiecieÅ”ama ICP licence?
  • kā un kāpēc mēs nolēmām pārbaudÄ«t mÅ«su testÄ“Å”anas vietas ar Catchpoint
  • kāds bija mÅ«su pirmā risinājuma rezultāts, kas balstÄ«ts uz Cloudflare China Network
  • Kā mēs atklājām kļūdu Cloudflare DNS

Šī daļa, manuprāt, ir visinteresantākā, jo tā ir vērsta uz konkrētiem iestudējuma tehniskajiem izpildījumiem. Un mēs sāksim vai drīzāk turpināsim ar Alibaba Cloud.

Alibaba Cloud

Alibaba Cloud ir diezgan liels mākoņa pakalpojumu sniedzējs, kuram ir visi pakalpojumi, kas ļauj godīgi saukt sevi par mākoņpakalpojumu sniedzēju. Ir labi, ka viņiem ir iespēja reģistrēties ārvalstu lietotājiem un ka lielākā daļa vietnes ir tulkota angļu valodā (Ķīnai tā ir greznība). Šajā mākonī varat strādāt ar daudziem pasaules reģioniem, kontinentālo Ķīnu, kā arī Okeāna Āziju (Honkongu, Taivānu utt.).

IPSEC

Mēs sākām ar Ä£eogrāfiju. Tā kā mÅ«su testa vietne atradās pakalpojumā Google Cloud, mums bija jāsaista Alibaba Cloud ar GCP, tāpēc mēs atvērām to atraÅ”anās vietu sarakstu, kurās atrodas Google. Tajā brÄ«dÄ« viņiem vēl nebija sava datu centra Honkongā.
Tuvākais reģions izrādījās Āzija-austrumi1 (Taivāna). Ali izrādījās Taivānai tuvākais kontinentālās Ķīnas reģions cn-Shenzhen (Šenžeņa).

Ar terraform aprakstÄ«ja un paaugstināja visu infrastruktÅ«ru GCP un Ali. 100 Mbit/s tunelis starp mākoņiem pacēlās gandrÄ«z uzreiz. Å enženas un Taivānas pusē tika izvirzÄ«tas starpniekservera virtuālās maŔīnas. Å enžeņā lietotāju trafika tiek pārtraukta, caur tuneli tiek nosÅ«tÄ«ta starpniekserveri uz Taivānu, un no turienes tā nonāk tieÅ”i mÅ«su pakalpojuma ārējā IP adresē. asv-austrumi (ASV austrumu krasts). Ping starp virtuālajām maŔīnām, izmantojot tuneli 24ms, kas nav nemaz tik slikti.

Tajā paŔā laikā mēs ievietojām testa laukumu Alibaba mākoņa DNS. Pēc zonas deleģēŔanas NS Ali izŔķirtspējas laiks samazinājās no 470 ms lÄ«dz 50 ms. Pirms tam zona atradās arÄ« Cloudlfare.

Paralēli tunelim uz Āzija-austrumi1 pacēla vēl vienu tuneli no Å enženas tieÅ”i uz asv-austrumi4. Tur viņi izveidoja vairāk starpniekservera virtuālo maŔīnu un sāka testēt abus risinājumus, marÅ”rutējot testa trafiku, izmantojot sÄ«kfailus vai DNS. Testu stends shematiski aprakstÄ«ts Å”ajā attēlā:

Tuneļu latentums izrādījās Ŕāds:
Ali cn-Shenzhen <ā€”> GCP asia-east1 ā€” 24 ms
Ali cn-shenzhen <ā€”> GCP us-east4 ā€” 200 ms

Catchpoint pārlūkprogrammas testi ziņoja par izciliem uzlabojumiem.

Salīdziniet divu risinājumu testa rezultātus:

Å Ä·Ä«dums
Uptime
Median
75 procentile
95 procentile

Cloudflare
86.6
18s
30s
60s

IPsec
99.79
18s
21s
30s

Å ie ir dati no risinājuma, kas izmanto IPSEC tuneli, izmantojot Āzija-austrumi1. Izmantojot us-east4, rezultāti bija sliktāki, un bija vairāk kļūdu, tāpēc rezultātus nesniegÅ”u.

Pamatojoties uz Ŕī divu tuneļu testa rezultātiem, no kuriem viens beidzas Ķīnai tuvākajā reÄ£ionā, bet otrs galamērÄ·Ä«, kļuva skaidrs, ka ir svarÄ«gi ā€œizkļūtā€ no Ķīnas ugunsmÅ«ra zem iespējams, un pēc tam izmantojiet ātros tÄ«klus (CDN nodroÅ”inātājus, mākoņpakalpojumu sniedzējus utt.). Nav nepiecieÅ”ams mēģināt tikt cauri ugunsmÅ«rim un vienā rāvienā nokļūt galamērÄ·Ä«. Tas nav ātrākais veids.

Kopumā rezultāti nav slikti, tomēr semrush.com vidējā vērtÄ«ba ir 8.8 s un 75 procentile 9.4 s (tajā paŔā testā).
Un pirms turpināt, es gribētu izdarīt nelielu lirisku atkāpi.

Liriskā novirze

Pēc tam, kad lietotājs ir ienācis vietnē www.semrushchina.cn, kas tiek atrisināts, izmantojot ā€œÄtrosā€ Ä·Ä«nieÅ”u DNS serverus, HTTP pieprasÄ«jums tiek caur mÅ«su ātro risinājumu. Atbilde tiek atgriezta pa to paÅ”u ceļu, bet domēns ir norādÄ«ts visos JS skriptos, HTML lapās un citos tÄ«mekļa lapas elementos semrush.com papildu resursiem, kas jāielādē, kad lapa tiek renderēta. Tas ir, klients atrisina ā€œgalvenoā€ A ierakstu www.semrushchina.cn un ieiet ātrajā tunelÄ«, ātri saņem atbildi - HTML lapu, kurā teikts:

  • lejupielādējiet Ŕādus un Ŕādus js no sso.semrush.com,
  • IegÅ«stiet CSS failus no cdn.semrush.com,
  • un arÄ« uzņemiet dažas bildes no dab.semrush.com
  • un tā tālāk.

PārlÅ«kprogramma Å”iem resursiem sāk pāriet uz ā€œÄrējoā€ internetu, katru reizi izejot cauri ugunsmÅ«rim, kas patērē reakcijas laiku.

Bet iepriekŔējā pārbaude parāda rezultātus, kad lapā nav resursu semrush.comtikai semrushchina.cn, un *.semrushchina.cn atrisina uz virtuālās maŔīnas adresi Å eņdžeņā, lai pēc tam iekļūtu tunelÄ«.

Tikai Ŕādā veidā, maksimāli izspiežot visu iespējamo trafiku, izmantojot savu risinājumu ātrai Ķīnas ugunsmÅ«ra ŔķērsoÅ”anai, jÅ«s varat iegÅ«t pieņemamus ātrumus un vietņu pieejamÄ«bas rādÄ«tājus, kā arÄ« godÄ«gus risinājumu testu rezultātus.
Mēs to izdarÄ«jām bez neviena koda rediģēŔanas komandas produkta pusē.

ApakŔfiltrs

Risinājums radās gandrÄ«z uzreiz pēc Ŕīs problēmas parādÄ«Å”anās. Mums vajadzēja PoC (Proof of Concept), ka mÅ«su ugunsmÅ«ra iespieÅ”anās risinājumi patieŔām darbojas labi. Lai to izdarÄ«tu, Å”ajā risinājumā, cik vien iespējams, ir jāietver visa vietnes trafika. Un mēs pieteicāmies apakÅ”filtrs nginx.

ApakÅ”filtrs ir diezgan vienkārÅ”s modulis nginx, kas ļauj mainÄ«t vienu rindiņu atbildes pamattekstā uz citu rindiņu. Tāpēc mēs mainÄ«jām visus notikumus semrush.com par semrushchina.cn visās atbildēs.

Un... tas nedarbojās, jo saņēmām saspiestu saturu no aizmugursistēmām, tāpēc apakÅ”filtrs neatrada vajadzÄ«go rindiņu. Man bija jāpievieno vēl viens vietējais serveris nginx, kas atspieda atbildi un nodeva to nākamajam lokālajam serverim, kurÅ” jau bija aizņemts ar virknes nomaiņu, saspieÅ”anu un nosÅ«tÄ«Å”anu uz nākamo starpniekserveri ķēdē.

Rezultātā, kur klients saņemtu .semrush.com, viņŔ saņēma .semrushchina.cn un paklausÄ«gi izgāja cauri mÅ«su lēmumam.

Tomēr nepietiek tikai ar domēna maiņu vienā virzienā, jo aizmugursistēmas joprojām sagaida semrush.com nākamajos klienta pieprasÄ«jumos. AttiecÄ«gi tajā paŔā serverÄ«, kurā tiek veikta vienvirziena aizstāŔana, izmantojot vienkārÅ”u regulāro izteiksmi, mēs iegÅ«stam apakÅ”domēnu no pieprasÄ«juma un pēc tam darām starpniekserveris ar mainÄ«go $ saimnieks, izstādÄ«ts $subdomain.semrush.com. Tas var Ŕķist mulsinoÅ”i, bet tas darbojas. Un tas darbojas labi. AtseviŔķiem domēniem, kuriem nepiecieÅ”ama atŔķirÄ«ga loÄ£ika, vienkārÅ”i izveidojiet savus servera blokus un veiciet atseviŔķu konfigurāciju. Zemāk ir saÄ«sinātas nginx konfigurācijas Ŕīs shēmas skaidrÄ«bai un demonstrÄ“Å”anai.

Šī konfigurācija apstrādā visus pieprasījumus no Ķīnas uz .semrushchina.cn:

    listen 80;

    server_name ~^(?<subdomain>[w-]+).semrushchina.cn$;

    sub_filter '.semrush.com' '.semrushchina.cn';
    sub_filter_last_modified on;
    sub_filter_once off;
    sub_filter_types *;

    gzip on;
    gzip_proxied any;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

    location / {
        proxy_pass http://127.0.0.1:8083;
        proxy_set_header Accept-Encoding "";
        proxy_set_header Host $subdomain.semrush.com;
        proxy_set_header X-Accept-Encoding $http_accept_encoding;
    }
}

Šī konfigurācija nodroŔina starpniekserveri localhost uz portu 83, un tur gaida Ŕāda konfigurācija:

    listen 127.0.0.1:8083;

    server_name *.semrush.com;

    location / {
        resolver 8.8.8.8 ipv6=off;
        gunzip on;
        proxy_pass https://$host;
        proxy_set_header Accept-Encoding gzip;
    }
}

Es atkārtoju, Ŕīs ir apgrieztas konfigurācijas.

Tādi. Tas var izskatÄ«ties sarežģīti, bet tas ir vārdos. PatiesÄ«bā viss ir vienkārŔāk par tvaicētiem rāceņiem :)

Atkāpes beigas

Kādu laiku bijām priecÄ«gi, jo mÄ«ts par krÄ«toÅ”iem IPSEC tuneļiem neapstiprinājās. Bet tad tuneļi sāka krist. Vairākas reizes dienā dažas minÅ«tes. Mazliet, bet tas mums nederēja. Tā kā abi tuneļi tika izbeigti Ali pusē vienā marÅ”rutētājā, mēs nolēmām, ka, iespējams, tā ir reÄ£ionāla problēma, un mums ir jāpaaugstina rezerves reÄ£ions.

Viņi to pacēla. Tuneļi sāka bojāties dažādos laikos, taču kļūmju pārslēgÅ”anās mums darbojās labi nginx augÅ”teces lÄ«menÄ«. Bet tad tuneļi sāka krist aptuveni tajā paŔā laikā šŸ™‚ Un atkal sākās 502 un 504. DarbÄ«bas laiks sāka pasliktināties, tāpēc mēs sākām strādāt pie opcijas ar Alibaba CEN (Cloud Enterprise Network).

CEN

CEN - Ŕī ir divu VPC savienojamÄ«ba no dažādiem Alibaba Cloud reÄ£ioniem, tas ir, jÅ«s varat savienot jebkuru mākoņa reÄ£ionu privātos tÄ«klus savā starpā. Un pats galvenais: Å”im kanālam ir diezgan stingri noteikumi SLA. Tas ir ļoti stabils gan ātrumā, gan darbÄ«bas laikā. Bet tas nekad nav tik vienkārÅ”i:

  • to ir Ä»OTI grÅ«ti iegÅ«t, ja neesat Ķīnas pilsonis vai juridiska persona,
  • Jums ir jāmaksā par katru kanāla joslas platuma megabitu.

Ir iespēja pieslēgties Kontinentālā Ķīna Šø Overseas, mēs izveidojām CEN starp diviem Ali reÄ£ioniem: cn-Shenzhen Šø asv-austrumi-1 (tuvākais punkts mums-austrumi4). In Ali asv-austrumi-1 pacēla vēl vienu virtuālo maŔīnu, lai bÅ«tu vēl viena hop.

Tas izrādījās Ŕādi:

Pārlūkprogrammas testa rezultāti ir zemāk:

Å Ä·Ä«dums
Uptime
Median
75 procentile
95 procentile

Cloudflare
86.6
18s
30s
60s

IPsec
99.79
18s
21s
30s

CEN
99.75
16s
21s
27s

Veiktspēja ir nedaudz labāka nekā IPSEC. Bet, izmantojot IPSEC, jūs potenciāli varat lejupielādēt ar ātrumu 100 Mbit/s, bet caur CEN tikai ar ātrumu 5 Mbit/s un vairāk.

Izklausās pēc hibrīda, vai ne? Apvienojiet IPSEC ātrumu un CEN stabilitāti.

Tas ir tas, ko mēs darÄ«jām, ļaujot satiksmi gan caur IPSEC, gan CEN IPSEC tuneļa kļūmes gadÄ«jumā. DarbÄ«bas laiks ir kļuvis daudz lielāks, taču vietnes ielādes ātrums joprojām atstāj daudz vēlamo. Tad es uzzÄ«mēju visas shēmas, kuras jau bijām izmantojuÅ”i un pārbaudÄ«juÅ”i, un nolēmu mēģināt pievienot Å”ai shēmai nedaudz vairāk GCP, proti vāciņŔ.

vāciņŔ

vāciņŔ -Å o Globālais slodzes balansētājs (vai Google Cloud Load Balancer). Tam ir svarÄ«ga priekÅ”rocÄ«ba: CDN kontekstā Anycast IP, kas ļauj novirzÄ«t trafiku uz klientam tuvāko datu centru, lai trafika ātri nokļūtu Google ātrajā tÄ«klā un mazāk iet caur ā€œparastoā€ internetu.

Divreiz nedomājot, paaugstinājām HTTP/HTTPS LB Mēs instalējām savas virtuālās maŔīnas ar apakÅ”filtru GCP un kā aizmugursistēmu.

Bija vairākas shēmas:

  • Lietot Cloudflare Ķīnas tÄ«kls, bet Å”oreiz Origin jānorāda globāls IP GLB.
  • Pārtraukt klientus plkst cn-Shenzhen, un no turienes starpniekserveri trafiku tieÅ”i uz vāciņŔ.
  • Dodieties tieÅ”i no Ķīnas uz vāciņŔ.
  • Pārtraukt klientus plkst cn-Shenzhen, no turienes starpniekserveris uz Āzija-austrumi1 izmantojot IPSEC (in asv-austrumi4 caur CEN), no turienes dodieties uz GLB (mierÄ«gi, zemāk bÅ«s bilde un paskaidrojums)

Mēs pārbaudÄ«jām visas Ŕīs iespējas un vēl vairākas hibrÄ«da iespējas:

  • Cloudflare + GLB

Å Ä« shēma mums nebija piemērota darbÄ«bas laika un DNS kļūdu dēļ. Bet tests tika veikts pirms kļūdas novērÅ”anas CF pusē, iespējams, tagad tas ir labāk (tomēr tas neizslēdz HTTP taimautus).

  • Ali + GLB

Å Ä« shēma mums nebija piemērota arÄ« darbÄ«bas laika ziņā, jo GLB bieži izkrita no augÅ”puses, jo nebija iespējams izveidot savienojumu pieņemamā laikā vai taimautā, jo serverÄ«, kas atrodas Ķīnā, GLB adrese paliek ārpusē un tādējādi aiz ĶīnieÅ”u ugunsmÅ«ris. MaÄ£ija nenotika.

  • Tikai GLB

Opcija, kas lÄ«dzÄ«ga iepriekŔējai, tikai tajā paŔā Ķīnā netika izmantoti serveri: trafiks nonāca tieÅ”i uz GLB (tika mainÄ«ti DNS ieraksti). AttiecÄ«gi rezultāti nebija apmierinoÅ”i, jo parastajiem Ķīnas klientiem, kuri izmanto parasto interneta pakalpojumu sniedzēju pakalpojumus, ir daudz sliktāka situācija ar ugunsmÅ«ra izieÅ”anu nekā Ali Cloud.

  • Shenzhen -> (CEN/IPSEC) -> Starpniekserveris ā€”> GLB

Šeit mēs nolēmām izmantot labāko no visiem risinājumiem:

  • stabilitāte un garantēta SLA no CEN
  • liels ātrums no IPSEC
  • Google ā€œÄtrsā€ tÄ«kls un tā anycast.

Shēma izskatās apmēram Ŕādi: lietotāja trafika tiek pārtraukta virtuālajā maŔīnā ch-Shenzhen. Tur ir konfigurēti Nginx augŔējie serveri, no kuriem daži norāda uz privātiem IP serveriem, kas atrodas IPSEC tuneļa otrā galā, un daži augŔējie serveri norāda uz serveru privātajām adresēm CEN otrā pusē. IPSEC konfigurēts reÄ£ionam Āzija-austrumi1 GSP (risinājuma izveides laikā tas bija Ķīnai tuvākais reÄ£ions. Tagad GCP ir pārstāvēta arÄ« Honkongā). CEN - uz reÄ£ionu asv-austrumi1 Ali mākonÄ«.

Tad satiksme no abiem galiem tika novirzīta uz Anycast IP GLB, tas ir, līdz tuvākajam Google klātbūtnes punktam un caur tā tīkliem devās uz reģionu asv-austrumi4 GCP, kurā bija rezerves virtuālās maŔīnas (ar apakŔfiltru nginx).

Å is hibrÄ«dais risinājums, kā mēs gaidÄ«jām, izmantoja katras tehnoloÄ£ijas priekÅ”rocÄ«bas. Parasti satiksme notiek caur ātru IPSEC, taču, ja sākas problēmas, mēs ātri un uz dažām minÅ«tēm izstumjam Å”os serverus no augÅ”puses un nosÅ«tām trafiku tikai caur CEN, lÄ«dz tunelis stabilizējas.

IevieÅ”ot ceturto risinājumu no iepriekÅ” minētā saraksta, mēs panācām to, ko vēlējāmies un ko no mums tajā brÄ«dÄ« prasÄ«ja bizness.

PārlÅ«kprogrammas testa rezultāti jaunajam risinājumam salÄ«dzinājumā ar iepriekŔējiem:

Å Ä·Ä«dums
Uptime
Median
75 procentile
95 procentile

Cloudflare
86.6
18s
30s
60s

IPsec
99.79
18s
21s
30s

CEN
99.75
16s
21s
27s

CEN/IPsec + GLB
99.79
13s
16s
25s

CDN

MÅ«su ieviestajā risinājumā viss ir labi, taču nav CDN, kas varētu paātrināt satiksmi reÄ£ionālā un pat pilsētas lÄ«menÄ«. Teorētiski tam vajadzētu paātrināt vietni galalietotājiem, izmantojot CDN nodroÅ”inātāja ātros sakaru kanālus. Un mēs par to visu laiku domājām. Un tagad ir pienācis laiks nākamajai projekta atkārtoÅ”anai: CDN pakalpojumu sniedzēju meklÄ“Å”ana un testÄ“Å”ana Ķīnā.

Un par to pastāstÄ«Å”u nākamajā, pēdējā daļā :)

Avots: www.habr.com

Pievieno komentāru