Preporuke za otvrdnjavanje zraka, Dio 3: Konzistentnost

Autori: Devin Thomson | Olovo, pomoćni inženjer, Xiaohu Li | Voditelj, Backend inženjering, Daniel Geng | Backend inženjer, Frank Ren | Direktor, Backend inženjering

Uvod

Ovo je treći dio naše trodijelne serije o Geosharded preporukama. U prethodnim postovima, 1. i 2. dio, pokrili smo mehanizam za rezanje i arhitekturu skalabilnog, geoshardiranog skupa za pretraživanje. U ovom zadnjem obroku opisat ćemo probleme usklađenosti podataka koji se vide u mjerilu i kako ih riješiti.

Dosljednost

Kada se bavimo distribuiranim sustavom s nekoliko baza podataka, pitanje dosljednosti mora se riješiti. U našem slučaju uporabe, imamo podatkovnu trgovinu za mapiranje za mapiranje ID-a dokumenta u geoshardu i samih geosharded indeksa.

Što se može dogoditi ako ne dizajnirate za dosljednost? Zapisivanje i / ili ustaljeni podaci nisu uspjeli.

Obratit ćemo se sljedećim rješenjima za pitanja dosljednosti:

  • Osigurajte zajamčeno naručivanje pisanja.
  • Osigurajte čvrsto dosljedna čitanja iz svih prodavaonica.

Zajamčeno naručivanje

U dizajnu geoskračenih indeksa dokumenti se mogu kretati od indeksa do indeksa. U svijetu Tinder-a, najjednostavniji primjer bio bi korisnik koji koristi prednost "Putovnice", gdje se oni smještaju negdje drugo na Zemlji i odmah prelaze prstom preko lokalnih korisnika.

Dokument se na odgovarajući način mora premjestiti u taj geoshard kako bi lokalni korisnici mogli pronaći korisnika Passportinga i mogu se stvoriti utakmice. Sasvim je uobičajeno da se višestruko pisanje za isti dokument događa unutar milisekundi jedno od drugog.

Jasno je da je to vrlo loše stanje. Korisnik je najavio da se želi vratiti na prvobitno mjesto, ali dokument je na drugom mjestu.

Kafka nudi skalabilno rješenje ovog problema. Particije se mogu odrediti za temu koja dopušta paralelizam s dosljednim miješanjem tipki na određene particije. Dokumenti s istim ključevima uvijek će se slati istim particijama, a potrošači mogu steći brave na particijama koje troše kako bi izbjegli svađu.

Utvrdili smo da je za uklanjanje ove varijable potrebno prelazak na Kafku.

Napomena o drugim opcijama - mnoge tehnologije čekanja koriste narudžbu sa "najboljim naporima", koja neće udovoljiti našim zahtjevima ili pružaju FIFO red čekanja, ali imaju samo vrlo malu propusnost. To nije problem u Kafki, ali ovisno o obrascu prometa može biti prikladna druga tehnologija.

Dosljednost podataka

Elasticsearch je klasificiran kao gotovo pretraživač u stvarnom vremenu. To u praksi znači da se upisi postavljaju u red memorijskog međuspremnika (i dnevnik transakcija radi oporavka pogrešaka) prije nego što se "osvježe" za segment u predmemoriji datotečnog sustava i postanu pretraživi. Segment će na kraju biti „ispražnjen“ na disk i trajno pohranjen, ali nije potrebno pretraživati. Pojedinosti potražite na ovoj stranici.

Slika 1 (lijevo), Slika 2 (desno)

Na slici 1, upis je dodan u memorijski međuspremnik, ali ga još nije moguće pretraživati.

Na slici 2, međuspremnik memorije osvježen je kao novi segment u predmemoriji datotečnog sustava, koji se sada može pretraživati.

Država nije u skladu s podacima o mapiranju podataka i indeksom pretraživanja, a dokument će ostati u geoshardu B.

Rješenje za to je korištenje tijeka rada koji jamči čvrstu dosljednost unutar indeksa pretraživanja. Najprirodniji API za pomicanje dokumenta iz indeksa u indeks je Reindex API, no oslanja se na isto očekivanje pretraživanja u stvarnom vremenu i stoga je neprihvatljivo.

Međutim, Elasticsearch pruža Get API, koji prema zadanim postavkama dolazi s funkcijom koja će osvježiti indeks ako pokušavate dohvatiti dokument koji ima čekano pisanje i koji se tek treba osvježiti.

Korištenje GET api-ja koji osvježava indeks ako postoje čekanja za čekanje dokumenta koji se učitava eliminira problem dosljednosti. Lagano povećanje aplikacijskog koda radi izvođenja GET + indeksa, a ne samo Reindexa, vrijedno je izbjegavanja problema.

Završna napomena - mapa podataka podataka može također imati na kraju dosljedan model podataka. Ako je to slučaj, moraju se uzeti i ista razmatranja (osigurati čvrsto dosljedna čitanja), u suprotnom preslikavanje može ukazivati ​​na to da je dokument različit geoshard nego što zapravo jest, što rezultira neuspjelim pisanjem budućnosti.

Očekujte neuspjeh

Čak i uz najbolje moguće probleme u dizajnu će se dogoditi. Možda nešto usred obrade nije uspjelo, što uzrokuje da se dokument nikad ne pravilno indeksira ili premješta. Možda se postupak koji izvodi operacije pisanja indeksa pretraživanja ruši usred zbog nekog hardverskog problema. U svakom slučaju, ključno je biti spreman za najgore. U nastavku su navedene neke strategije za ublažavanje neuspjeha.

ponovnog pokušaja:

Kako bi se osiguralo uspješno pisanje tijekom neočekivanog razdoblja velike kašnjenja ili neuspjeha, potrebno je uspostaviti neku vrstu logike pokušaja. Ovo se uvijek treba primijeniti koristeći eksponencijalni algoritam za povrat s podrhtavanjem (detalje potražite u ovom postu na blogu). Ugađanje logike pokušaja ovisi o aplikaciji - na primjer, ako se pisanje događa unutar zahtjeva pokrenutog od klijentske aplikacije, tada može kasniti velika zastoja.

Ako se pisanje događa asinkrono od radnika koji čita teme iz kafke, kao što je već spomenuto, kašnjenje u pisanju je manje briga. Kafka (i većina rješenja za strujanje) nude kontrolnu točku kako bi se osiguralo da u slučaju pada procesa aplikacija može nastaviti s obradom s razumne početne točke. Imajte na umu da to nije moguće iz sinkronog zahtjeva i klijentska aplikacija morat će ponovno pokušati što potencijalno blokira protok klijentske aplikacije.

Refeeding:

Kao što je gore spomenuto, u nekim slučajevima nešto može uspjeti uzvodno i uzrokovati da podaci budu nedosljedni između prodavaonice i drugih podataka. Da bi se to ublažilo, aplikacija može prenijeti podatke o pretraživanju iz podataka iz „izvora istine“.

Jedna bi strategija bila referencija u istom procesu koji piše u podatkovnu trgovinu za pretraživanje, primjerice kada se očekuje da dokument bude prisutan, ali nije. Drugi bi način bio povremeno referenciranje pomoću pozadinskog posla kako bi se pohranjivala podatkovna prodavaonica u sinkro. Trebat ćete analizirati troškove bilo kojeg pristupa koji uzimate jer prečesto pozivanje može na vašem sustavu dovesti do neupravnih troškova, ali prečesto pozivanje može dovesti do neprihvatljivih razina dosljednosti.

Ključni odvodi Geosharding serije

  • Za uslugu temeljenu na lokaciji koja je suočena s izazovom opterećenja, razmislite o geo-izoštrenju.
  • S2 je dobra knjižnica za geo-oštrenje, a krivulja hilberta je fantastična za očuvanje lokaliteta.
  • Razmislite kako izmjeriti opterećenje (rezultat opterećenja) prije nego što pokušate izbrisati da biste postigli bolju ravnotežu opterećenja.
  • Testiranje performansi presudno je za uvođenje nove infrastrukture.
  • Razmislite o korištenju slučajnosti za rješavanje teških problema u inženjerskoj praksi.
  • Osigurajte dosljednost podataka zajamčenim redoslijedom pisanja i strogo dosljednim očitavanjima.
  • Očekujte pogreške i dizajnirajte ih u skladu s tim.