Apache Cassandran Hautakivet

hautakivien tyypit

Hautakivet voivat syntyä monella tavalla, ja on ratkaisevan tärkeää, että ymmärrät tietyt sudenkuopat, jotka voivat johtaa implisiittisesti sellaisten hautakivien luomiseen, jotka pysyvät piilossa ohjelmoijan näkökulmasta, kunnes ne nousevat pintaan uskottavana ongelmana, joka vaikuttaa klusteriisi. Siksi on tärkeää ymmärtää, millaisia hautakiviä Cassandrassa voi syntyä:

Soluhautakivet
Insert-lausekkeet voivat luoda hautakiviä, kun tietty soluarvo asetetaan kyselyssä nollaksi. Tämä voi tapahtua, kun tietokannan abstraktiokerros tai ORM-kehys abstrahoi kyselyn oliotason esityksellä ja null-arvot lähetetään implisiittisesti alas varsinaisessa kyselyssä Cassandralle. Harkitse esimerkiksi seuraavaa CQL-kyselyä:

INSERT INTO item_price ( store_number, item_id, price, replacements, product_code ) VALUES ( 'CA104', 'item104', 2.50, null , 'p104');

tämä loisi solun hautakiven tietueelle store_number CA104: llä.
harkitse nyt seuraavaa poistokyselyä:

DELETE replacements FROM item_price WHERE store_number = 'CA104';

näin syntyisi myös soluhautakivi vastaavaa tallennetta varten.

rivin hautakivet
kokonainen rivi merkitään hautakiveksi poistokyselyn tuloksena, joka tunnistaa rivin. Esimerkiksi:

DELETE FROM item_price WHERE store_number = 'CA101' and item_id='item101' and price = 1.80;

Sstabledump näyttäisi deletion_info rivitasolla klusterointi sarakkeet sisällä osio.

,
"position" : 0
},
"rows" : ,
"deletion_info" : {
"marked_deleted" : "2020-07-05T07:26:52.233374Z",
"local_delete_time" : "2020-07-05T07:26:52Z"
},
"cells" :
}
]
}
]

suuri määrä rivihautakiviä voi olla osoitus huonosta tietomallista, jossa sovellus usein poistaa tietueita taulukosta. Tällaisissa tapauksissa harkitse tietomallisi tarkistamista ja taulukoiden uudelleensuunnittelua kyselykuvioiden ja kardinaalisuuden perusteella.

Range tombstones
poistamalla koko rivivalikoima käyttäen WHERE-lauseketta, jossa on osionäppäin ja alue, jota edustaa ryhmittelysarake. Esimerkiksi:

DELETE FROM item_price WHERE store_number = 'CA101' AND item_id='item101' AND price > 2.0;

SSTabledump näkyisi,

,"position" : 0
},
"rows" : ,
"deletion_info" : { "marked_deleted" : "2020-07-05T06:53:50.671654Z", "local_delete_time" : "2020-07-05T06:53:50Z" }
}
},
{
"type" : "range_tombstone_bound",
"end" : {
"type" : "inclusive",
"clustering" : ,
"deletion_info" : { "marked_deleted" : "2020-07-05T06:53:50.671654Z", "local_delete_time" : "2020-07-05T06:53:50Z" }
}
}
]
}
}}

Sstabledump tulostaisi alueen hautakiviä tyypin range_tombstone_bound kanssa alku ja loppu clustering avain käytetään kuvaamaan erilaisia rivejä, jotka olivat tombstoned sisällä osio. Range-hautakiviä syntyy myös, kun koko kokoelma korvataan insertillä tai PÄIVITYSKYSELYLLÄ. On aina suositeltavaa korvata tiettyjä osia kokoelma sijaan korvaa koko kokoelma itse.

tämän tyyppiset Osiohautakivet luodaan, kun delete-kysely laukaistaan käyttäen vain WHERE-lausekkeen osionavainta. Esimerkiksi:

DELETE FROM item_price WHERE store_number = 'CA102';

kuten olet epäilemättä arvata, tämä poistaisi koko osio CA102 ja sstabledump näyttäisi osio deletion_info attribuutti marked_deleted aikaleima.

,
"position" : 0,
"deletion_info" : {
"marked_deleted" : "2020-07-05T22:11:48.367057Z",
"local_delete_time" : "2020-07-05T22:11:48Z"
}
},
"rows" :
}
]

TTL-hautakivet
nämä ovat hautakiviä, jotka syntyvät automaattisesti, kun tietyn rivin tai solun elinaika päättyy. Ne on kuitenkin merkitty eri tavalla kuin tavalliset hautakivet.

seuraava inserttilauseke loisi TTL-hautakiven 20 sekunnin kuluttua.

INSERT INTO item_price ( store_number, item_id, price, replacements, product_code) VALUES ( 'CA103', 'item103', 3.0, {'item101-r', 'item101'}, 'p103') using TTL 20;

sstabledump näyttäisi:

,
"position" : 78
},
"rows" : ,
"liveness_info" : { "tstamp" : "2020-07-05T06:47:51.458099Z", "ttl" : 20, "expires_at" : "2020-07-05T06:48:11Z", "expired" : true },
"cells" : }
]
}
]
}
]

Yhteenveto

  • Cassandra käsittelee poistokyselyä sisäisesti päivitysoperaationa, joka lisää Tombstone-nimisen merkin poistettaviin tietoihin.
  • Hautakivet voidaan konfiguroida vanhenemisajalla (gc_grace_seconds), ja ne puhdistetaan tiivistämisen aikana.
  • sstabledump-apuohjelmaa voidaan käyttää Sstabledump-tiedoston sisällön tarkasteluun ihmisen luettavassa muodossa.
  • Vältä kirjoittamasta taulukoihisi nollia, sillä siellä voi syntyä hautakiviä. Ole varovainen tehdessäsi kyselyjä, jotka ORM-kerroksesi abstrahoi.
  • Range tombstones on parempi kuin solu-tai rivihautakivet, koska se vain tallentaa alueen rajat säästäen levytilaa.
  • Vältä korvaamasta kokoelman kokonaisia osia, kuten sarjaa, luetteloa, karttaa, insertti-ja PÄIVITYSKYSELYILLÄ, koska tämä voi luoda alueen hautakiviä.

Vastaa

Sähköpostiosoitettasi ei julkaista.