Cassandra
L-Ewwel Ħsibijiet tiegħi Wara li Tgħallimt dwar Cassandra
Ġej minn SQL Server, is-sorpriżi ma kinux dwar l-iskala. L-ebda joins, denormalizzazzjoni deliberata, tiddisinja l-primary key qabel ma t-tabella teżisti, u lingwa ta' query li tidher bħal SQL iżda tirrifjuta affarijiet li SQL jippermetti.
Użajt Cassandra għall-ewwel darba f'URL shortener li bnejt biex naħdem ma' video ta' system design. Kull ma kont qrajt dwarha qabel tkellem dwar l-iskala u d-distribuzzjoni. L-affarijiet li verament sorprenduni waqt li kont nużaha kienu ħafna aktar bażiċi minn dan.
CQL tidher bħal SQL, li hija trappola
Il-lingwa tal-query hija qrib biżżejjed ta' SQL li ktibt l-ewwel stqarrijiet tiegħi mingħajr ma naħseb:
var stmt = await _session.PrepareAsync(
"SELECT code, id, long_url, short_url, created_on_utc " +
"FROM shortened_urls WHERE code = ?");
Dik hija sempliċiment SQL sa fejn nista' ngħid billi naqraha. Il-familjarità ġagħlitni nassumi li kont naf x'kont qed nagħmel, sakemm ippruvajt xi ħaġa ordinarja u ġiet irrifjutata.
M'hemm l-ebda joins. Mhux "il-joins huma bil-mod, evitahom" bil-mod kif in-nies jgħidu dwar databases relazzjonali. Sempliċiment ma jeżistux. L-istess bil-klawsoli WHERE arbitrarji: ma tistax tiffiltra skont kwalunkwe kolonna konvenjenti, għax tista' tagħmel query biss bil-modi li l-istruttura tal-key tat-tabella tappoġġa. Ġej minn SQL Server, fejn kwalunkwe kolonna hija ġusta u l-query planner isolviha, dan ħassu inqas bħal limitazzjoni u aktar bħal database miksura.
Mhix miksura. Sempliċiment ma tħallikx tikteb query li ma tistax twieġeb b'mod effiċjenti fuq cluster distribwit, li huwa argumentabbilment aktar onest milli tħallik tiktibha u jkollha ssir kwietament terribbli.
Il-primary key hija deċiżjoni ta' disinn, mhux kolonna ta' ID
F'SQL inżid kolonna Id l-aktar minħabba drawwa u naħseb dwar il-query aktar tard. F'Cassandra l-key tiddetermina f'liema node id-dejta tgħix, u għalhekk x'tista' tfittex b'mod effiċjenti.
It-tabella tiegħi spiċċat sempliċi kemm jista' jkun:
CREATE TABLE IF NOT EXISTS url_shortener.shortened_urls
(code text PRIMARY KEY, id uuid, long_url text, short_url text, created_on_utc timestamp)
Il-kodiċi qasir huwa l-primary key, mhux l-uuid. Dak huwa l-oppost ta' dak li kont nagħmel istintivament f'SQL, fejn il-GUID kien ikun il-key u code kien jieħu index. Iżda kull qari f'din l-applikazzjoni huwa "agħtini r-row għal dan il-kodiċi," għalhekk il-kodiċi jrid ikun il-key. L-uuid huwa sempliċiment dejta li tinsab hemm.
Li nasal għal dik id-deċiżjoni tajba kien faċli hawn għax il-pattern ta' aċċess huwa trivjali. Fuq xi ħaġa b'aktar minn forma waħda ta' query, kont ikolli naħseb ħafna aktar bir-reqqa minn qabel, u nissuspetta li dak hu fejn Cassandra verament issir diffiċli.
Tiddenormalizza deliberatament
Il-parir li bqajt niltaqa' miegħu huwa li jekk teħtieġ l-istess dejta disponibbli b'żewġ keys differenti, taħżinha darbtejn, f'żewġ tabelli, kull waħda mmarkata bil-mod li dik il-query teħtieġ.
Kull istint li kont bnejt jgħid li li tidduplika dejta hija kif tmur ħażin, għax issa hemm żewġ kopji li jistgħu ma jaqblux. F'Cassandra dak huwa d-disinn mistenni, u li żżomm il-kopji sinkronizzati hija x-xogħol tal-applikazzjoni minflok tad-database. Nifhem għaliex, peress li m'hemm ebda joins biex jerġgħu jgħaqqdu affarijiet fost in-nodi, iżda xorta ħassitha ħażina biex tikteb.
Is-setup jinvolvi keyspaces, u r-replikazzjoni hija numru li tagħżel
Qabel ma toħloq tabella, hemm keyspace, li hija bejn wieħed u ieħor database, u trid tkun taf kemm kopji tad-dejta għandha żżomm:
session.Execute(
"CREATE KEYSPACE IF NOT EXISTS url_shortener " +
"WITH replication = {'class':'SimpleStrategy','replication_factor':1}");
Fattur ta' replikazzjoni ta' wieħed ifisser kopja waħda, li hija tajba fuq il-laptop tiegħi u kienet tkun idea ħażina fil-produzzjoni, fejn tkun trid id-dejta fuq diversi nodi biex li titlef wieħed ma titlifx dejta.
Dak li laqatni huwa li din hija deċiżjoni li kelli nagħmel fl-ewwel linja tas-setup. F'SQL Server, kemm kopji tad-dejta tiegħi jeżistu hija kwistjoni ta' infrastruttura li qatt ma nmiss fil-kodiċi tal-applikazzjoni. Hawn hija parti mill-iskema.
Kienet l-għażla t-tajba għal dan il-proġett?
Għat-tagħlim, iva. Għall-proġett fuq il-merti tiegħu stess, onestament le. URL shortener bit-traffiku tiegħi kien ikun servut perfettament minn SQLite. Cassandra hija mibnija għal skala li m'għandix, u r-raġuni kollha li użajtha kienet biex naħdem mad-database li jaqbel mal-verżjoni tal-problema fid-dinja reali minflok il-verżjoni li verament kelli.
X'ħadt minnha
Il-bidla utli ma kinitx li nitgħallem Cassandra speċifikament. Kienet li ninduna li f'database relazzjonali niddisinja d-dejta u nsib il-queries wara, u hawn niddisinja l-queries u l-layout tad-dejta jsegwi. Dik hija triq verament differenti biex tibda, u tispjega l-biċċa l-kbira tar-restrizzjonijiet li fil-bidu dehru arbitrarji.