Scalable, Distributed Secondary Indexing in Scylla
the data model in Scylla and Apache Cassandra osioi datan klusterisolmujen välillä käyttäen osioavainta, joka on määritelty tietokantakaaviossa. Osioavaimen käyttäminen tarjoaa tehokkaan tavan etsiä rivejä osioavaimen avulla, koska voit löytää rivin omistavan solmun tiivistämällä osioavaimen. Valitettavasti tämä tarkoittaa myös sitä, että rivin löytäminen osioimattomalla näppäimellä vaatii täyden taulukon skannauksen, joka on tehotonta. Toissijaiset indeksit ovat Apache Cassandrassa esiintyvä mekanismi, joka mahdollistaa tehokkaiden hakujen tekemisen osiottomista avaimista luomalla indeksin.
tässä blogikirjoituksessa opit:
- miten Apache Cassandra toteuttaa toissijaiset indeksit paikallisella indeksoinnilla
- miksi päätimme ottaa erilaisen toteutusstrategian Scyllalle globaalilla indeksoinnilla
- miten globaali indeksointi vaikuttaa siihen, miten sinun tulisi käyttää toissijaista indeksointia
- miten luoda omat toissijaiset indeksit ja käyttää niitä sovelluksessasi CQL-kyselyt
tausta
indeksin koko on verrannollinen indeksoitujen tietojen kokoon. Koska Scyllan ja Apache Cassandran tiedot jaetaan useisiin solmuihin, on epäkäytännöllistä tallentaa koko indeksi yhdelle solmulle. Apache Cassandra toteuttaa toissijaiset indeksit paikallisina indekseinä, mikä tarkoittaa, että indeksi tallennetaan samalle solmulle kuin kyseisestä solmusta indeksoitavat tiedot. Paikallisen indeksin etu on, että kirjoittaa ovat erittäin nopeita, mutta haittapuolena on, että lukee on mahdollisesti kysellä jokainen solmu löytää indeksin suorittaa haun päälle, mikä tekee paikallisista indekseistä unscalable suurille klustereille. Native secondary indexes-indeksien lisäksi Apache Cassandralla on myös toinen paikallinen indeksointijärjestelmä, SSTable Attached Secondary Index (SASI), joka tukee monimutkaisia kyselyjä ja hakuja. Skaalautuvuuden kannalta sillä on kuitenkin täsmälleen samat ominaisuudet kuin alkuperäisillä toissijaisilla indekseillä.
toteutuneet näkymät scyllassa ja Apache Cassandrassa ovat mekanismi, joka automaattisesti denormalisoi tiedot kantataulukosta katselutaulukoksi käyttämällä eri osionavainta. Tämä ratkaisee skaalautuvuusongelman paikallisten indeksien mutta tulee tallennuskustannuksiin, koska sinun täytyy kopioida koko taulukko pahimmassa tapauksessa. Materialisoidut näkemykset eivät siis korvaa toissijaisia indeksejä kaikissa käyttötapauksissa. Toteutuneet näkemykset tarjoavat kuitenkin tarvittavan infrastruktuurin toissijaisten indeksien toteuttamiseen globaalilla indeksoinnilla, joka on Scyllan toteutustapa.
Global Indexing
Scylla noudattaa erilaista lähestymistapaa kuin Apache Cassandra ja toteuttaa toissijaiset indeksit globaalia indeksointia käyttäen. Globaalin indeksoinnin avulla jokaiselle indeksille luodaan Materialisoitu näkymä. Materialisoidussa näkymässä indeksoitu sarake on osionavain ja ensisijainen avain (osionavain ja ryhmittelynäppäimet) indeksoidun rivin ryhmittelynavaimina. Scylla jakaa indeksoidut kyselyt kahteen osaan: (1) indeksitaulukon kysely indeksoidun taulukon osionavainten hakemiseksi ja (2) indeksoidun taulukon kysely haettujen osionavainten avulla. Tämän lähestymistavan etuna on, että voimme käyttää indeksoidun sarakkeen arvoa löytääksemme vastaavan indeksitaulukon rivin klusterissa niin lukee ovat skaalautuvia. Huono puoli lähestymistapa on, että kirjoittaa ovat hitaampia kuin paikallinen indeksointi, koska kaikki yleiskustannukset pitää indeksinäkymä ajan tasalla.
indeksoidun sarakkeen kyselyssä katsotaan seuraavaa. Oletetaan taulukko, joka näyttää tältä:
ja kysely email
– sarakkeesta, joka ei ole osionäppäin, vaan siinä on indeksi:
vaiheessa (1) kysely saapuu solmuun 7, joka toimii kyselyn koordinaattorina. Solmu huomaa, että olemme kyselyssä indeksoitu sarake ja siksi vaiheessa (2), antaa lukea indeksitaulukon solmu 2, joka on indeksitaulukon rivi “”. Kysely palauttaa joukon käyttäjätunnuksia, joita käytetään vaiheessa (3) indeksoidun taulukon sisällön hakemiseen.
esimerkki
ensin on luotava skeema. Tässä esimerkissä meillä on taulukko, joka esittää käyttäjän tiedot userid-osion avaimena ja nimi, sähköposti ja maa tavallisina sarakkeina:
sitten kansoitamme taulukon Mockaroo-ohjelmalla tuotetuilla testitiedoilla:
Toisioindeksit on suunniteltu mahdollistamaan osiottomien avainsarakkeiden tehokas kyselytutkimus. Vaikka Apache Cassandra tukee myös ei-osioiden avainpalstoja koskevia kyselyitä käyttäen ALLOW FILTERING
, se on hyvin tehotonta (vaatii koko taulukon skannaamista) eikä tällä hetkellä tue Scyllaa (KS.numero #2200).
voit indeksoida taulukon sarakkeita käyttämällä CREATE INDEX statementia. Jos haluat esimerkiksi luoda indeksejä sähköposti-ja maasarakkeille, suorita seuraavat CQL-lausekkeet:
Scylla luo automaattisesti toteutuneen näkymän, jossa indeksoitu sarake on osionavain ja kohdetaulukon ensisijainen avain (osionavain ja ryhmittelynäppäimet) ryhmittelynavaimina.
esimerkiksi email
sarakkeen indeksin toteutunut näkymä näyttää seuraavanlaiselta:
jos yllä oleva näkymä luotaisiin tavalliseksi taulukoksi, se näyttäisi käytännössä seuraavasti:
email
saraketta käytetään indeksitaulukon osioavaimena ja userid
on mukana ryhmittelyavaimena, jonka avulla voidaan tehokkaasti löytää kohdetaulukon osioavaimet vain email
.
komennon DESCRIBE
avulla voit nähdä ks.users
taulukon koko skeeman, mukaan lukien luodut indeksit ja näkymät:
nyt kun Toisioindeksi on paikallaan, voit kysellä indeksoituja sarakkeita ikään kuin ne olisivat osionäppäimiä:
olemme valmiita esimerkillä!
milloin käytetään toissijaisia indeksejä?
toissijaiset hakemistot ovat (enimmäkseen) avoimia hakemuksen kannalta. Kyselyillä on pääsy kaikkiin taulukon sarakkeisiin, ja voit lisätä ja poistaa indeksejä muuttamatta sovellusta. Toissijaisilla indekseillä voi myös olla vähemmän tallennustilaa kuin Materialisoiduilla näkymillä, koska toissijaisten indeksien tarvitsee vain kopioida indeksoitu sarake ja ensisijainen avain, ei kysytyt sarakkeet kuten Materialisoidulla näkymällä. Lisäksi samasta syystä päivitykset voivat olla tehokkaampia toissijaisilla indekseillä, koska vain muutokset ensisijaiseen avaimeen ja indeksoituun sarakkeeseen aiheuttavat päivityksen indeksinäkymässä. Jos näkymä on toteutunut, minkä tahansa näkymässä näkyvän sarakkeen päivitys edellyttää taustanäkymän päivittämistä.
kuten aina, päätös siitä, käytetäänkö toissijaisia indeksejä vai toteutuneita näkemyksiä, riippuu todella sovelluksesi vaatimuksista. Jos tarvitset maksimaalista suorituskykyä ja todennäköisesti kyselet tiettyä sarakesarjaa, käytä Materialisoituja näkymiä. Kuitenkin, Jos sovellus on kysellä eri sarjojen sarakkeita, toissijaiset indeksit ovat parempi valinta, koska ne voidaan lisätä ja poistaa vähemmän tallennustilaa yläpuolella riippuen sovelluksen tarpeisiin.
Haluatko oppia lisää toissijaisista indekseistä? Tutustu esitykseeni Skylla Summit 2017: stä Slidesharessa. Jos haluat kokeilla tätä ominaisuutta, sen odotetaan olevan tulevassa Scylla 2.2-julkaisussa.