Cassandra. Unsaon nga dili mamatay kung nahibal-an nimo ang Oracle

Uy Habr.

Ang akong ngalan mao si Misha Butrimov, gusto kong isulti kanimo ang gamay bahin sa Cassandra. Mapuslanon ang akong istorya sa mga wala pa nakasugat sa mga database sa NoSQL - kini adunay daghang mga bahin sa pagpatuman ug mga lit-ag nga kinahanglan nimong mahibal-an. Ug kung wala ka makakita bisan unsa gawas sa Oracle o bisan unsang uban pang database sa relasyon, kini nga mga butang makaluwas sa imong kinabuhi.

Unsa may maayo ni Cassandra? Kini usa ka database sa NoSQL nga gidisenyo nga wala’y usa ka punto sa kapakyasan nga maayo ang timbangan. Kung kinahanglan nimo nga magdugang usa ka pares nga terabytes alang sa pipila nga database, idugang ra nimo ang mga node sa singsing. Ipalapad kini sa laing sentro sa datos? Idugang ang mga node sa cluster. Dugangi ang giproseso nga RPS? Idugang ang mga node sa cluster. Naglihok usab kini sa atbang nga direksyon.

Cassandra. Unsaon nga dili mamatay kung nahibal-an nimo ang Oracle

Unsa pa may maayo niya? Mahitungod kini sa pagdumala sa daghang mga hangyo. Apan pila ang daghan? 10, 20, 30, 40 ka libo nga mga hangyo matag segundo dili kaayo. 100 ka libo nga mga hangyo matag segundo alang sa pagrekord - usab. Adunay mga kompanya nga nag-ingon nga gitipigan nila ang 2 milyon nga mga hangyo matag segundo. Tingali kinahanglan silang motuo niini.

Ug sa prinsipyo, si Cassandra adunay usa ka dako nga kalainan gikan sa relational data - kini dili susama kanila sa tanan. Ug kini hinungdanon kaayo nga hinumdoman.

Dili tanan nga parehas nga hitsura molihok parehas

Kas-a ang usa ka kauban miduol kanako ug nangutana: "Ania ang usa ka CQL Cassandra nga pangutana nga pinulongan, ug kini adunay usa ka pinili nga pahayag, kini adunay diin, kini adunay ug. Nagsulat ako ug dili kini molihok. Ngano man?" Ang pagtratar kang Cassandra sama sa usa ka relational database mao ang hingpit nga paagi sa paghimo og bayolenteng paghikog. Ug wala nako kini gipasiugda, kini gidili sa Russia. Maghimo ka lang og sayop nga disenyo.

Pananglitan, usa ka kustomer ang miduol kanamo ug miingon: “Magbuhat ta ug database para sa mga serye sa TV, o database para sa direktoryo sa resipe. Aduna kami mga pagkaon didto o usa ka lista sa mga serye sa TV ug mga aktor niini. Malipayon kaming moingon: “Mangadto ta!” Pagpadala lang og duha ka byte, usa ka magtiayon nga mga timailhan ug nahuman ka, ang tanan molihok nga dali ug kasaligan. Ug maayo ang tanan hangtod nga ang mga kostumer moabut ug moingon nga ang mga ginang sa balay nagsulbad usab sa kaatbang nga problema: sila adunay usa ka lista sa mga produkto, ug gusto nila mahibal-an kung unsang pinggan ang gusto nilang lutoon. Patay ka.

Kini tungod kay ang Cassandra usa ka hybrid nga database: kini dungan nga naghatag usa ka yawe nga kantidad ug nagtipig sa datos sa lapad nga mga kolum. Sa Java o Kotlin, kini mahimong gihulagway nga sama niini:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

Sa ato pa, usa ka mapa nga adunay usab usa ka gisunud nga mapa. Ang unang yawe niini nga mapa mao ang Row key o Partition key - ang partitioning key. Ang ikaduha nga yawe, nga mao ang yawe sa usa ka na-sort na nga mapa, mao ang Clustering key.

Sa pag-ilustrar sa pag-apod-apod sa database, magdrowing kita og tulo ka node. Karon kinahanglan nimo nga masabtan kung giunsa ang pag-decompose sa datos sa mga node. Tungod kay kung atong i-cram ang tanan sa usa (sa paagi, adunay usa ka libo, duha ka libo, lima - kutob sa imong gusto), dili kini bahin sa pag-apod-apod. Busa, nagkinahanglan kita ug mathematical function nga magbalik ug numero. Usa lang ka numero, usa ka taas nga int nga mahulog sa pila ka range. Ug aduna kitay usa ka node nga responsable sa usa ka range, ang ikaduha alang sa ikaduha, ang ika-nud alang sa ika-nud.

Cassandra. Unsaon nga dili mamatay kung nahibal-an nimo ang Oracle

Kini nga numero gikuha gamit ang hash function, nga gipadapat sa gitawag nato nga Partition key. Kini ang kolum nga gipiho sa Primary key nga direktiba, ug kini ang kolum nga mahimong una ug labing sukaranan nga yawe sa mapa. Gitino niini kung unsang node ang makadawat kung unsang datos. Ang usa ka lamesa gihimo sa Cassandra nga adunay halos parehas nga syntax sama sa SQL:

CREATE TABLE users (
	user_id uu id,
	name text,
	year int,
	salary float,
	PRIMARY KEY(user_id)

)

Ang Panguna nga yawe niini nga kaso naglangkob sa usa ka kolum, ug kini usab ang yawe sa pagbahin.

Sa unsa nga paagi ang among mga tiggamit molihok? Ang uban moadto sa usa ka node, ang uban sa lain, ug ang uban sa ikatulo. Ang resulta mao ang ordinaryo nga hash table, nailhan usab nga mapa, nailhan usab nga diksyonaryo sa Python, o usa ka yano nga Key value structure diin atong mabasa ang tanang value, basahon ug isulat pinaagi sa key.

Cassandra. Unsaon nga dili mamatay kung nahibal-an nimo ang Oracle

Pilia: kung tugotan ang pagsala nga mahimong bug-os nga pag-scan, o kung unsa ang dili buhaton

Atong isulat ang pipila ka pinili nga pahayag: select * from users where, userid = . Kini sama sa Oracle: gisulat namon ang pagpili, gipiho ang mga kondisyon ug ang tanan molihok, makuha kini sa mga tiggamit. Apan kung imong pilion, pananglitan, usa ka tiggamit nga adunay usa ka tuig nga natawhan, nagreklamo si Cassandra nga dili kini matuman ang hangyo. Tungod kay wala siyay nahibal-an bahin sa kung giunsa namo pag-apod-apod ang mga datos bahin sa tuig nga natawhan - adunay usa ra siya nga kolum nga gipakita ingon usa ka yawe. Dayon siya miingon, “Okay, matuman ko gihapon kini nga hangyo. Idugang ang pagtugot sa pagsala." Gidugang namon ang direktiba, ang tanan molihok. Ug niining higayona adunay makalilisang nga mahitabo.

Kung nagdagan kami sa datos sa pagsulay, maayo ang tanan. Ug kung maghimo ka usa ka pangutana sa produksiyon, diin kami adunay, pananglitan, 4 milyon nga mga rekord, nan ang tanan dili kaayo maayo alang kanamo. Tungod kay ang pagtugot sa pagsala usa ka direktiba nga nagtugot kang Cassandra sa pagkolekta sa tanan nga mga datos gikan niini nga lamesa gikan sa tanan nga mga node, tanan nga mga sentro sa datos (kung adunay daghan niini sa kini nga cluster), ug dayon isala kini. Kini usa ka analogue sa Full Scan, ug halos walay bisan kinsa nga nalipay niini.

Kung kinahanglan lang namon ang mga tiggamit pinaagi sa ID, maayo ra kami niini. Apan usahay kinahanglan namon nga magsulat sa ubang mga pangutana ug magpahamtang sa ubang mga pagdili sa pagpili. Busa, atong hinumdoman: kining tanan usa ka mapa nga adunay usa ka yawe sa partitioning, apan sa sulod niini usa ka gihan-ay nga mapa.

Ug aduna usab siyay yawe, nga gitawag namo og Clustering Key. Kini nga yawe, nga, sa baylo, naglangkob sa mga kolum nga among gipili, sa tabang nga nahibal-an ni Cassandra kung giunsa ang pisikal nga pagsunud sa datos niini ug mahimutang sa matag node. Kana mao, alang sa pipila nga yawe sa Partition, ang yawe sa Clustering mosulti kanimo sa eksakto kung giunsa ang pagduso sa datos sa kini nga kahoy, kung unsang lugar ang makuha didto.

Kini mao ang tinuod nga usa ka kahoy, ang usa ka comparator yano nga gitawag didto, diin kita moagi sa usa ka hugpong sa mga kolum sa porma sa usa ka butang, ug kini usab gipiho ingon nga usa ka listahan sa mga kolum.

CREATE TABLE users_by_year_salary_id (
	user_id uuid,
	name text,
	year int,
	salary float,
	PRIMARY KEY((year), salary, user_id)

Hatagi'g pagtagad ang Primary key directive; ang una nga argumento niini (sa among kaso, ang tuig) kanunay nga Partition key. Mahimo kini nga usa o daghang mga kolum, dili kini hinungdanon. Kung adunay daghang mga kolum, kinahanglan nga tangtangon kini sa mga bracket pag-usab aron masabtan sa preprocessor sa lengguwahe nga kini ang Primary nga yawe, ug sa luyo niini ang tanan nga uban nga mga kolum mao ang Clustering key. Sa kini nga kaso, sila ipadala sa comparator sa pagkasunod-sunod diin kini makita. Sa ato pa, ang una nga kolum mas hinungdanon, ang ikaduha dili kaayo hinungdanon, ug uban pa. Giunsa namo pagsulat, pananglitan, katumbas sa mga field para sa mga klase sa datos: among gilista ang mga field, ug alang kanila among isulat kung hain ang mas dako ug hain ang mas gamay. Sa Cassandra, kini, medyo nagsulti, ang mga natad sa klase sa datos, diin ang mga katumbas nga gisulat alang niini magamit.

Gibutang namon ang pagsunud ug gipahamtang ang mga pagdili

Kinahanglan nimong hinumdoman nga ang han-ay sa paghan-ay (nagpaubos, nagsaka, bisan unsa) gitakda sa parehas nga higayon kung gihimo ang yawe, ug dili kini mabag-o sa ulahi. Pisikal nga gitino niini kung giunsa ang pagsunud sa datos ug kung giunsa kini itago. Kung kinahanglan nimo nga usbon ang Clustering key o sort order, kinahanglan ka nga maghimo usa ka bag-ong lamesa ug ibalhin ang data niini. Dili kini molihok sa usa nga anaa na.

Cassandra. Unsaon nga dili mamatay kung nahibal-an nimo ang Oracle

Gipuno namo ang among lamesa sa mga tiggamit ug nakita nga nahulog sila sa usa ka singsing, una sa tuig sa pagkatawo, ug dayon sulod sa matag node pinaagi sa suweldo ug user ID. Karon makapili na kita pinaagi sa pagpahamtang og mga pagdili.

Ang among nagtrabaho nagpakita pag-usab where, and, ug nakakuha kami mga tiggamit, ug maayo na usab ang tanan. Apan kon kita mosulay sa paggamit lamang sa usa ka bahin sa Clustering yawe, ug ang usa ka dili kaayo mahinungdanon nga usa, unya Cassandra diha-diha dayon moreklamo nga kini dili makakaplag sa dapit sa atong mapa diin kini nga butang, nga adunay niini nga mga uma alang sa null comparator, ug kini usa nga gitakda na lang , - diin siya nahimutang. Kinahanglan nakong kuhaon pag-usab ang tanang datos gikan niini nga node ug i-filter kini. Ug kini usa ka analogue sa Full Scan sa sulod sa usa ka node, kini daotan.

Sa bisan unsang dili klaro nga sitwasyon, paghimo og bag-ong lamesa

Kung gusto namon nga maabot ang mga tiggamit pinaagi sa ID, o sa edad, o sa suweldo, unsa ang among buhaton? Wala. Gamita lang ang duha ka lamesa. Kung kinahanglan nimo nga maabot ang mga tiggamit sa tulo nga lainlaing mga paagi, adunay tulo nga mga lamesa. Wala na ang mga adlaw nga nakadaginot kami og luna sa screw. Kini ang labing barato nga kapanguhaan. Mas mubu ang gasto kaysa oras sa pagtubag, nga mahimong makadaot sa tiggamit. Mas makapahimuot alang sa tiggamit nga makadawat usa ka butang sa usa ka segundo kaysa sa 10 minuto.

Gibaligya namon ang wala kinahanglana nga wanang ug gi-denormalize nga datos alang sa katakus sa pag-scale nga maayo ug pag-operate nga kasaligan. Human sa tanan, sa pagkatinuod, ang usa ka cluster nga naglangkob sa tulo ka mga data centers, nga ang matag usa adunay lima ka nodes, uban sa usa ka madawat nga lebel sa data pagpreserbar (sa diha nga walay bisan unsa nga nawala), makahimo sa mabuhi sa kamatayon sa usa ka data center sa hingpit. Ug duha pa ka node sa matag usa sa nahabilin nga duha. Ug human lamang niini ang mga problema magsugod. Kini usa ka maayo kaayo nga redundancy, kini nagkantidad og usa ka magtiayon nga dugang nga SSD drive ug mga processor. Busa, aron magamit ang Cassandra, nga dili gayud SQL, diin walay mga relasyon, langyaw nga mga yawe, kinahanglan nimo nga mahibal-an ang yano nga mga lagda.

Gidisenyo namo ang tanan sumala sa imong hangyo. Ang panguna nga butang dili ang datos, apan kung giunsa ang pagtrabaho niini. Kung kini kinahanglan nga makadawat sa lain-laing mga data sa lain-laing mga paagi o sa sama nga data sa lain-laing mga paagi, kita kinahanglan nga ibutang kini sa usa ka paagi nga sayon ​​alang sa aplikasyon. Kay kon dili, kita mapakyas sa Full Scan ug Cassandra dili mohatag kanato sa bisan unsa nga bentaha.

Ang pag-denormalize sa datos mao ang naandan. Nakalimot kami sa mga normal nga porma, wala na kami mga relational database. Kung atong ibutang ang usa ka butang 100 ka beses, kini mohigda 100 ka beses. Mas barato pa kay sa paghunong.

Gipili namon ang mga yawe alang sa pagbahinbahin aron kini maapod-apod nga normal. Dili namo gusto nga ang hash sa among mga yawe mahulog sa usa ka pig-ot nga range. Sa ato pa, ang tuig sa pagkatawo sa panig-ingnan sa ibabaw usa ka dili maayo nga panig-ingnan. Sa mas tukma, maayo kung ang among mga tiggamit kasagarang giapod-apod sa tuig nga natawhan, ug dili maayo kung maghisgot kami bahin sa mga estudyante sa ika-5 nga baitang - ang pagbahin didto dili kaayo maayo.

Ang paghan-ay gipili kausa sa yugto sa paghimo sa Clustering Key. Kung kinahanglan kini usbon, kinahanglan namon nga i-update ang among lamesa gamit ang lain nga yawe.

Ug ang labing hinungdanon nga butang: kung kinahanglan namon nga makuha ang parehas nga datos sa 100 nga lainlaing mga paagi, nan kami adunay 100 nga lainlaing mga lamesa.

Source: www.habr.com

Idugang sa usa ka comment