Cassandra Indexing: the Good, the Bad and The Ugly

NoSQL: n sisällä indeksoinnin, hakemisen ja tiedon etsimisen toiminnot ovat läheisesti sidoksissa fyysisiin tallennusmekanismeihin. On tärkeää muistaa, että rivit tallennetaan isäntien kesken, mutta yksi rivi tallennetaan yhdelle isännälle. (replikoiden kanssa) sarakkeiden perheet tallennetaan lajiteltuun järjestykseen, mikä tekee sarakkeiden joukon kyselystä tehokasta (edellyttäen, että jonotat rivejä).

The Bad : Osiointi

yksi kova asioita tottua aluksi on, että ilman indeksit kyselyt että span rivit voi (hyvin) olla huono. Muistellen meidän varastointi malli kuitenkin, että ei ole yllättävää. Strategiaa, jolla Cassandra jakaa rivit isännille, kutsutaan Osioinniksi.

osiointi on teko veistämällä jopa valikoima rowkeys antaa ne ”token ring”, joka myös antaa vastuun segmentin (eli osio) rowkey range kullekin isännälle. Olet luultavasti nähnyt tämän, kun alustit klusterin ”token”. Token antaa isännälle sijainnin token Ringin varrella, joka antaa vastuun token Rangen osasta. Osiointi on teko kartoitus rowkey osaksi token alue.

on olemassa kaksi ensisijaista partioijaa: Satunnainen ja järjestyksen säilyttäminen. Ne on nimetty sopivasti. Randompartioner yhdistää rowkeysit poleteiksi. Randompartitionerilla poletti on rowkeyn hasis. Tämä tekee hyvää työtä jakaa tasaisesti tietoja eri solmuja, mutta tekee kyselyt eri rowkey tilaa uskomattoman vaikeaa. Vain ”start rowkey” – arvosta ja” end rowkey ” – arvosta Cassandra ei voi määrittää, mitä tilaa tarvitset. Sen on pohjimmiltaan suoritettava ” taulukon skannaus ”vastatakseen kyselyyn, ja” taulukon skannaus ” Cassandrassa on huono, koska sen on mentävä jokaiseen koneeseen (todennäköisesti kaikki koneet, jos sinulla on hyvä hajautustoiminto) vastaamaan kyselyyn.

nyt, suuret kustannukset jopa tietojen jakelu, voit käyttää Orderpreservingpartiotor (OPP). En ole OPP: n puolella. OPP säilyttää tilauksen, koska se kääntää rowkeys poletteihin. Nyt, koska alku rowkey arvo ja loppu rowkey arvo, Cassandra *voi* määrittää tarkalleen, mitkä isännät ovat tietoja etsit. Se laskee alkuarvon tokeniin loppuarvon tokeniin ja yksinkertaisesti valitsee ja palauttaa kaiken siltä väliltä. Mutta säilyttämällä järjestyksessä, ellei rowkeys ovat tasaisesti jakautunut koko tilaan, polettejasi ei joko ja saat vino klusteri, joka lisää huomattavasti kustannuksia kokoonpano ja hallinnon klusterin. (ei sen arvoista)

The Good: Secondary Indexes

Cassandra does provide a native indexing mechanism in Secondary Indexes. Toissijaiset indeksit toimivat sarakkeiden arvoista. Ilmoitat sivuhakemiston sarakkeen perheeseen. Datastaxilla on hyvä dokumentaatio käytöstä. Hupun alla Cassandra ylläpitää indeksinä ”piilopalstaperhettä”. (Katso ed Anuffin esitys yksityiskohtien osalta) koska Cassandra ei säilytä sarakkeen arvotietoja yhdessäkään solmussa, ja toissijaiset indeksit ovat sarakkeiden arvolla (eikä rowkeys), kysely on silti lähetettävä kaikkiin solmuihin. Lisäksi toissijaisia indeksejä ei suositella korkean kardinaalisuuden sarjoille. En ole vielä etsinyt, mutta oletan, että tämä johtuu tietomallista, jota käytetään ”piilotetun sarakkeen perheessä”. Jos piilotettu sarakkeen perhe tallentaa rivin kutakin yksittäistä arvoa kohti (rowkeys sarakkeina), se merkitsisi rivien skannaamista sen määrittämiseksi, ovatko ne kyselyn alueella.
ED: n esityksestä:

  • ei suositella korkeille kardinaaliarvoille (esim.aikaleimat,syntymäpäivät,avainsanat jne.)
  • vaatii vähintään yhden tasa-arvovertailun kyselyssä–ei suuri alle / suurempi-kuin / vaihteluväli-kyselyissä
  • Lajittelemattomat-tulokset ovat token-järjestyksessä, ei kyselyarvon järjestyksessä
  • rajoitettu datatyyppien hakuun, Cassandra ymmärtää natiivisti

kaiken tämän sanottua, toissijaiset indeksit toimivat laatikosta ja meillä on ollut hyvä menestys käyttämällä niitä yksinkertaisia arvoja.

The Ugly: tee-se-itse (DIY) / Wide-Rows

kauneus on katsojan silmässä. Yksi NoSQL: n kauniista puolista on yksinkertaisuus. Konstruktiot ovat yksinkertaisia: avainpaikat, Pylväsperheet, rivit ja sarakkeet. Pitää se yksinkertainen kuitenkin tarkoittaa joskus sinun täytyy ottaa asioita omiin käsiinsä.

tämä pätee leveärivisiin indekseihin. Cassandran tallennusmallia hyödyntäen on helppo rakentaa omat indeksit, joissa jokainen rivinäppäin muuttuu indeksin sarakkeeksi. Tämä on joskus vaikea saada pään noin, mutta kuvitellaan meillä on tapaus, jossa haluamme valita kaikki käyttäjät Postinumeron. Pääkäyttäjien sarakeperhe on näppäilty käyttäjätunnuksella, postinumero on sarake jokaisella käyttäjärivillä. Voisimme käyttää toissijaisia indeksejä, mutta postinumeroita on paljon. Sen sijaan voisimme ylläpitää sarakeperhettä, jossa on yksi rivi nimeltään ”idx_zipcode”. Voisimme sitten kirjoittaa sarakkeita tähän riviin muodossa ”zipcode_userid”. Koska sarakkeet tallennetaan lajiteltuun järjestykseen, on nopeaa kysellä kaikki sarakkeet, jotka alkavat ”18964”: lla (esimerkiksi voisimme käyttää 18964_ ja 18964_zzzzzz alku-ja loppuarvoina).

yksi ilmeinen haittapuoli tässä lähestymistavassa on, että rivit ovat itsenäisiä isäntä. (jälleen paitsi jäljennöksiä) tämä tarkoittaa, että kaikki kyselyt tulevat osumaan yhteen solmuun. En ole vielä löytänyt tähän hyvää vastausta.

lisäksi, ja IMHO, rumin osa DIY laaja-rivinen indeksointi on asiakkaan näkökulmasta. Toteutuksessamme olemme tehneet parhaamme ollaksemme kieliagnostikkoja asiakaspuolella, jolloin ihmiset voivat valita parhaan työkalun työhön vuorovaikutuksessa Cassandran tietojen kanssa. Tällä mentaliteetilla DIY-indeksit aiheuttavat jonkin verran ongelmia. Wide-rivit käyttävät usein komposiittiavaimia(Kuvittele, jos sinulla olisi idx_state_zip, jonka avulla voit kysellä valtion sitten zip). Vaikka komposiittiavaimille on olemassa” native ” – tuki, kaikki asiakaskirjastot toteuttavat niistä oman versionsa (Hector, Astyanax ja Thrift). Tämä tarkoittaa sitä, että asiakkaan, joka tarvitsee kysellä tietoja, on lisättävä logiikkaa indeksin ensimmäiseen kyselyyn, ja lisäksi kaikkien asiakkaiden on rakennettava komposiittiavain samalla tavalla.

Teen Siitä Paremman…

juuri tästä syystä olemme päättäneet julkaista kaksi avoimen lähdekoodin projektia, jotka auttavat työntämään tämän logiikan palvelinpuolelle. Ensimmäinen projekti on Cassandra-Triggers. Näin voit liittää asynkronista toimintaa kirjoittaa Cassandra. (yksi tällainen toiminta voisi olla indeksointi) olemme myös julkaisseet Cassandra-indeksointi. Tämä on kuumaa tavaraa ja on vielä lapsenkengissä (esim.se tukee vain ut8types indeksissä), mutta tarkoituksena on tarjota yleinen palvelinpuolen mekanismi, joka indeksoi tiedot sen kirjoitettuna Cassandralle. Käyttämällä samaa palvelinpuolen tekniikkaa, jota käytimme Cassandra-indeksoinnissa, voit yksinkertaisesti määrittää sarakkeet, jotka haluat indeksoida, ja AOP-koodi tekee loput, kun kirjoitat kohteeseen CF. Kuten aina, kysymykset, kommentit ja ajatukset ovat tervetulleita. (varsinkin jos olen muualla kuin tukikohdassa)

Vastaa

Sähköpostiosoitettasi ei julkaista.