హలో, హబ్ర్.
నా పేరు మిషా బుట్రిమోవ్, నేను మీకు కాసాండ్రా గురించి కొంచెం చెప్పాలనుకుంటున్నాను. NoSQL డేటాబేస్లను ఎన్నడూ ఎదుర్కోని వారికి నా కథనం ఉపయోగకరంగా ఉంటుంది - ఇది చాలా అమలు లక్షణాలు మరియు మీరు తెలుసుకోవలసిన ఆపదలను కలిగి ఉంది. మీరు ఒరాకిల్ లేదా మరే ఇతర రిలేషనల్ డేటాబేస్ తప్ప మరేదైనా చూడనట్లయితే, ఈ విషయాలు మీ జీవితాన్ని కాపాడతాయి.
కాసాండ్రాలో అంత మంచిది ఏమిటి? ఇది ఒక NoSQL డేటాబేస్, ఇది ఒక్క పాయింట్ వైఫల్యం లేకుండా రూపొందించబడింది, అది బాగా స్కేల్ అవుతుంది. మీరు కొన్ని డేటాబేస్ కోసం రెండు టెరాబైట్లను జోడించాల్సిన అవసరం ఉన్నట్లయితే, మీరు కేవలం రింగ్కు నోడ్లను జోడించండి. దాన్ని మరో డేటా సెంటర్కి విస్తరించాలా? క్లస్టర్కు నోడ్లను జోడించండి. ప్రాసెస్ చేయబడిన RPSని పెంచాలా? క్లస్టర్కు నోడ్లను జోడించండి. ఇది వ్యతిరేక దిశలో కూడా పనిచేస్తుంది.
ఆమె ఇంకా దేనిలో మంచిది? ఇది చాలా అభ్యర్థనలను నిర్వహించడం గురించి. అయితే చాలా ఎంత? సెకనుకు 10, 20, 30, 40 వేల అభ్యర్థనలు ఎక్కువ కాదు. రికార్డింగ్ కోసం సెకనుకు 100 వేల అభ్యర్థనలు - కూడా. సెకనుకు 2 మిలియన్ల అభ్యర్థనలను ఉంచుతామని చెప్పిన కంపెనీలు ఉన్నాయి. వారు బహుశా నమ్మవలసి ఉంటుంది.
మరియు సూత్రప్రాయంగా, కాసాండ్రా రిలేషనల్ డేటా నుండి ఒక పెద్ద వ్యత్యాసాన్ని కలిగి ఉంది - ఇది వారితో సమానంగా ఉండదు. మరియు ఇది గుర్తుంచుకోవడం చాలా ముఖ్యం.
ఒకేలా కనిపించే ప్రతిదీ ఒకేలా పనిచేయదు
ఒకసారి ఒక సహోద్యోగి నా దగ్గరకు వచ్చి ఇలా అడిగాడు: “ఇక్కడ ఒక CQL Cassandra ప్రశ్న భాష ఉంది మరియు దానికి ఎంపిక చేసిన ప్రకటన ఉంది, దానికి ఎక్కడ ఉంది, ఉంది మరియు. నేను ఉత్తరాలు వ్రాస్తాను మరియు అది పనిచేయదు. ఎందుకు?". కాసాండ్రాను రిలేషనల్ డేటాబేస్ లాగా పరిగణించడం హింసాత్మక ఆత్మహత్యకు సరైన మార్గం. మరియు నేను దానిని ప్రచారం చేయడం లేదు, ఇది రష్యాలో నిషేధించబడింది. మీరు ఏదో తప్పుగా డిజైన్ చేస్తారు.
ఉదాహరణకు, ఒక కస్టమర్ మా వద్దకు వచ్చి ఇలా అంటాడు: “టీవీ సిరీస్ల కోసం డేటాబేస్ లేదా రెసిపీ డైరెక్టరీ కోసం డేటాబేస్ను రూపొందిద్దాం. మేము అక్కడ ఆహార వంటకాలు లేదా టీవీ సిరీస్ మరియు నటీనటుల జాబితాను కలిగి ఉంటాము. మేము ఆనందంగా చెబుతున్నాము: "వెళ్దాం!" కేవలం రెండు బైట్లు, కొన్ని సంకేతాలను పంపండి మరియు మీరు పూర్తి చేసారు, ప్రతిదీ చాలా త్వరగా మరియు విశ్వసనీయంగా పని చేస్తుంది. కస్టమర్లు వచ్చి, గృహిణులు కూడా వ్యతిరేక సమస్యను పరిష్కరిస్తున్నారని చెప్పే వరకు ప్రతిదీ బాగానే ఉంటుంది: వారు ఉత్పత్తుల జాబితాను కలిగి ఉన్నారు మరియు వారు ఏ వంటకాన్ని ఉడికించాలనుకుంటున్నారో తెలుసుకోవాలనుకుంటున్నారు. నువ్వు చచ్చిపోయావ్.
ఎందుకంటే కాసాండ్రా ఒక హైబ్రిడ్ డేటాబేస్: ఇది ఏకకాలంలో కీలక విలువను అందిస్తుంది మరియు డేటాను విస్తృత నిలువు వరుసలలో నిల్వ చేస్తుంది. జావా లేదా కోట్లిన్లో, దీనిని ఇలా వర్ణించవచ్చు:
Map<RowKey, SortedMap<ColumnKey, ColumnValue>>
అంటే, క్రమబద్ధీకరించబడిన మ్యాప్ను కూడా కలిగి ఉన్న మ్యాప్. ఈ మ్యాప్కి మొదటి కీ రో కీ లేదా విభజన కీ - విభజన కీ. రెండవ కీ, ఇది ఇప్పటికే క్రమబద్ధీకరించబడిన మ్యాప్కి కీ, క్లస్టరింగ్ కీ.
డేటాబేస్ పంపిణీని వివరించడానికి, మూడు నోడ్లను గీయండి. ఇప్పుడు మీరు డేటాను నోడ్లుగా ఎలా కుళ్ళిపోవాలో అర్థం చేసుకోవాలి. ఎందుకంటే మనం అన్నింటినీ ఒకదానిలో ఒకటిగా కుదిస్తే (మార్గం ప్రకారం, వెయ్యి, రెండు వేలు, ఐదు - మీకు నచ్చినంత ఎక్కువ), ఇది నిజంగా పంపిణీకి సంబంధించినది కాదు. కాబట్టి, మనకు ఒక సంఖ్యను అందించే గణిత ఫంక్షన్ అవసరం. కేవలం ఒక సంఖ్య, కొంత పరిధిలోకి వచ్చే దీర్ఘ పూర్ణాంకం. మరియు మేము ఒక పరిధికి ఒక నోడ్ బాధ్యత వహిస్తాము, రెండవది రెండవది, nవది nవది.
ఈ సంఖ్య హాష్ ఫంక్షన్ని ఉపయోగించి తీసుకోబడుతుంది, ఇది మనం విభజన కీ అని పిలిచే దానికి వర్తించబడుతుంది. ఇది ప్రైమరీ కీ డైరెక్టివ్లో పేర్కొనబడిన నిలువు వరుస, మరియు ఇది మ్యాప్లోని మొదటి మరియు అత్యంత ప్రాథమిక కీ అయిన నిలువు వరుస. ఏ నోడ్ ఏ డేటాను స్వీకరిస్తుందో ఇది నిర్ణయిస్తుంది. SQLలో దాదాపు అదే వాక్యనిర్మాణంతో కాసాండ్రాలో పట్టిక సృష్టించబడింది:
CREATE TABLE users (
user_id uu id,
name text,
year int,
salary float,
PRIMARY KEY(user_id)
)
ఈ సందర్భంలో ప్రాథమిక కీ ఒక నిలువు వరుసను కలిగి ఉంటుంది మరియు ఇది విభజన కీ కూడా.
మా వినియోగదారులు ఎలా పని చేస్తారు? కొన్ని ఒక నోడ్కి, కొన్ని మరొకటి మరియు కొన్ని మూడవ భాగానికి వెళ్తాయి. ఫలితం ఒక సాధారణ హాష్ పట్టిక, దీనిని మ్యాప్ అని కూడా పిలుస్తారు, దీనిని పైథాన్లో నిఘంటువు అని కూడా పిలుస్తారు లేదా సాధారణ కీ విలువ నిర్మాణం, దీని నుండి మనం అన్ని విలువలను చదవవచ్చు, కీ ద్వారా చదవవచ్చు మరియు వ్రాయవచ్చు.
ఎంచుకోండి: ఫిల్టరింగ్ని అనుమతించినప్పుడు పూర్తి స్కాన్గా మారుతుంది లేదా ఏమి చేయకూడదు
కొన్ని ఎంపిక చేసిన స్టేట్మెంట్ని వ్రాద్దాం: select * from users where, userid =
. ఇది ఒరాకిల్లో వలె మారుతుంది: మేము ఎంపికను వ్రాస్తాము, షరతులను పేర్కొనండి మరియు ప్రతిదీ పని చేస్తుంది, వినియోగదారులు దాన్ని పొందుతారు. కానీ మీరు ఎంచుకున్నట్లయితే, ఉదాహరణకు, నిర్దిష్ట సంవత్సరం పుట్టిన వినియోగదారుని, అభ్యర్థనను నెరవేర్చలేమని కాసాండ్రా ఫిర్యాదు చేస్తుంది. పుట్టిన సంవత్సరానికి సంబంధించిన డేటాను మేము ఎలా పంపిణీ చేస్తాము అనే దాని గురించి ఆమెకు ఏమీ తెలియదు కాబట్టి - ఆమెకు కీగా సూచించబడిన ఒక నిలువు వరుస మాత్రమే ఉంది. అప్పుడు ఆమె, “సరే, నేను ఇప్పటికీ ఈ అభ్యర్థనను నెరవేర్చగలను. వడపోత అనుమతిని జోడించండి." మేము ఆదేశాన్ని జోడిస్తాము, ప్రతిదీ పని చేస్తుంది. మరియు ఈ సమయంలో భయంకరమైన ఏదో జరుగుతుంది.
మేము పరీక్ష డేటాను అమలు చేసినప్పుడు, ప్రతిదీ బాగానే ఉంటుంది. మరియు మీరు ఉత్పత్తిలో ఒక ప్రశ్నను అమలు చేసినప్పుడు, ఉదాహరణకు, 4 మిలియన్ రికార్డులు ఉన్న చోట, అప్పుడు ప్రతిదీ మాకు చాలా మంచిది కాదు. ఎందుకంటే ఫిల్టరింగ్ని అనుమతించడం అనేది అన్ని నోడ్లు, అన్ని డేటా సెంటర్ల నుండి (ఈ క్లస్టర్లో వాటిలో చాలా ఉంటే) ఈ టేబుల్ నుండి మొత్తం డేటాను సేకరించడానికి కాసాండ్రాను అనుమతించే ఆదేశం, ఆపై మాత్రమే ఫిల్టర్ చేయండి. ఇది పూర్తి స్కాన్ యొక్క అనలాగ్, మరియు దీనితో ఎవరూ సంతోషించరు.
మాకు ID ద్వారా వినియోగదారులు మాత్రమే అవసరమైతే, మేము దీనితో బాగానే ఉంటాము. కానీ కొన్నిసార్లు మనం ఇతర ప్రశ్నలను వ్రాయవలసి ఉంటుంది మరియు ఎంపికపై ఇతర పరిమితులను విధించాలి. కాబట్టి, మేము గుర్తుంచుకుంటాము: ఇదంతా విభజన కీని కలిగి ఉన్న మ్యాప్, కానీ దాని లోపల క్రమబద్ధీకరించబడిన మ్యాప్ ఉంటుంది.
మరియు ఆమె కూడా ఒక కీని కలిగి ఉంది, దానిని మేము క్లస్టరింగ్ కీ అని పిలుస్తాము. ఈ కీ, మేము ఎంచుకున్న నిలువు వరుసలను కలిగి ఉంటుంది, దీని సహాయంతో కాసాండ్రా దాని డేటా భౌతికంగా ఎలా క్రమబద్ధీకరించబడిందో మరియు ప్రతి నోడ్లో ఎలా ఉంటుందో అర్థం చేసుకుంటుంది. అంటే, కొన్ని విభజన కీ కోసం, క్లస్టరింగ్ కీ ఈ ట్రీలోకి డేటాను ఎలా పుష్ చేయాలో, అది అక్కడ ఏ స్థలం తీసుకుంటుందో మీకు తెలియజేస్తుంది.
ఇది నిజంగా ఒక చెట్టు, ఒక కంపారిటర్ను అక్కడ పిలుస్తారు, దానికి మనం ఒక నిర్దిష్ట నిలువు వరుసలను వస్తువు రూపంలో పాస్ చేస్తాము మరియు ఇది నిలువు వరుసల జాబితాగా కూడా పేర్కొనబడింది.
CREATE TABLE users_by_year_salary_id (
user_id uuid,
name text,
year int,
salary float,
PRIMARY KEY((year), salary, user_id)
ప్రాథమిక కీ ఆదేశానికి శ్రద్ధ వహించండి; దాని మొదటి వాదన (మా సందర్భంలో, సంవత్సరం) ఎల్లప్పుడూ విభజన కీ. ఇది ఒకటి లేదా అంతకంటే ఎక్కువ నిలువు వరుసలను కలిగి ఉంటుంది, ఇది పట్టింపు లేదు. అనేక నిలువు వరుసలు ఉన్నట్లయితే, దానిని మళ్లీ బ్రాకెట్లలో తీసివేయాలి, తద్వారా ఇది ప్రాథమిక కీ అని మరియు దాని వెనుక అన్ని ఇతర నిలువు వరుసలు క్లస్టరింగ్ కీ అని భాష ప్రిప్రాసెసర్ అర్థం చేసుకుంటుంది. ఈ సందర్భంలో, అవి కనిపించే క్రమంలో కంపారిటర్లో ప్రసారం చేయబడతాయి. అంటే, మొదటి కాలమ్ మరింత ముఖ్యమైనది, రెండవది తక్కువ ముఖ్యమైనది మరియు మొదలైనవి. మేము ఎలా వ్రాస్తాము, ఉదాహరణకు, డేటా తరగతుల కోసం ఫీల్డ్లకు సమానం: మేము ఫీల్డ్లను జాబితా చేస్తాము మరియు వాటి కోసం మేము ఏవి పెద్దవి మరియు చిన్నవి అని వ్రాస్తాము. కాసాండ్రాలో, ఇవి సాపేక్షంగా చెప్పాలంటే, డేటా క్లాస్ యొక్క ఫీల్డ్లు, దాని కోసం వ్రాసిన సమానాలు వర్తించబడతాయి.
మేము క్రమబద్ధీకరణను సెట్ చేసాము మరియు పరిమితులను విధిస్తాము
కీని సృష్టించినప్పుడు అదే సమయంలో క్రమబద్ధీకరణ క్రమం (అవరోహణ, ఆరోహణ, ఏదైనా) సెట్ చేయబడిందని మీరు గుర్తుంచుకోవాలి మరియు అది తర్వాత మార్చబడదు. ఇది డేటా ఎలా క్రమబద్ధీకరించబడుతుందో మరియు అది ఎలా నిల్వ చేయబడుతుందో భౌతికంగా నిర్ణయిస్తుంది. మీరు క్లస్టరింగ్ కీని లేదా క్రమబద్ధీకరణ క్రమాన్ని మార్చవలసి వస్తే, మీరు కొత్త పట్టికను సృష్టించి దానికి డేటాను బదిలీ చేయాలి. ఇది ఇప్పటికే ఉన్న దానితో పని చేయదు.
మేము మా టేబుల్ను వినియోగదారులతో నింపాము మరియు వారు మొదట పుట్టిన సంవత్సరం నాటికి రింగ్లో పడిపోయినట్లు చూశాము, ఆపై ప్రతి నోడ్లో జీతం మరియు వినియోగదారు ID ద్వారా. ఇప్పుడు మనం పరిమితులను విధించడం ద్వారా ఎంచుకోవచ్చు.
మా పని చేసే వ్యక్తి మళ్లీ కనిపిస్తుంది where, and
, మరియు మేము వినియోగదారులను పొందుతాము మరియు ప్రతిదీ మళ్లీ బాగానే ఉంది. కానీ మేము క్లస్టరింగ్ కీలో కొంత భాగాన్ని మాత్రమే ఉపయోగించాలని ప్రయత్నిస్తే, మరియు తక్కువ ప్రాముఖ్యత లేనిది, శూన్య కంపారిటర్ కోసం ఈ ఫీల్డ్లను కలిగి ఉన్న ఈ వస్తువు ఉన్న స్థలాన్ని మా మ్యాప్లో కనుగొనలేదని కాసాండ్రా వెంటనే ఫిర్యాదు చేస్తుంది. అది ఇప్పుడే సెట్ చేయబడింది - అతను ఎక్కడ ఉన్నాడు. నేను ఈ నోడ్ నుండి మొత్తం డేటాను మళ్లీ తీసి ఫిల్టర్ చేయాలి. మరియు ఇది నోడ్లోని పూర్తి స్కాన్ యొక్క అనలాగ్, ఇది చెడ్డది.
ఏదైనా అస్పష్టమైన పరిస్థితిలో, కొత్త పట్టికను సృష్టించండి
మేము ID ద్వారా లేదా వయస్సు ద్వారా లేదా జీతం ద్వారా వినియోగదారులను లక్ష్యంగా చేసుకోగలిగితే, మనం ఏమి చేయాలి? ఏమిలేదు. కేవలం రెండు పట్టికలను ఉపయోగించండి. మీరు మూడు విభిన్న మార్గాల్లో వినియోగదారులను చేరుకోవాల్సిన అవసరం ఉంటే, మూడు పట్టికలు ఉంటాయి. మేము స్క్రూలో స్థలాన్ని ఆదా చేసిన రోజులు పోయాయి. ఇది చౌకైన వనరు. ఇది ప్రతిస్పందన సమయం కంటే చాలా తక్కువ ఖర్చు అవుతుంది, ఇది వినియోగదారుకు హాని కలిగించవచ్చు. 10 నిమిషాల కంటే సెకనులో ఏదైనా స్వీకరించడం వినియోగదారుకు చాలా ఆహ్లాదకరంగా ఉంటుంది.
మేము బాగా స్కేల్ చేయగల మరియు విశ్వసనీయంగా పనిచేసే సామర్థ్యం కోసం అనవసరమైన స్థలాన్ని మరియు డీనార్మలైజ్ చేసిన డేటాను వ్యాపారం చేస్తాము. అన్నింటికంటే, వాస్తవానికి, మూడు డేటా సెంటర్లను కలిగి ఉన్న క్లస్టర్, ప్రతి ఒక్కటి ఐదు నోడ్లను కలిగి ఉంటుంది, ఆమోదయోగ్యమైన స్థాయి డేటా సంరక్షణతో (ఏమీ కోల్పోనప్పుడు), ఒక డేటా సెంటర్ మరణాన్ని పూర్తిగా తట్టుకోగలదు. మరియు మిగిలిన రెండింటిలో ప్రతిదానిలో మరో రెండు నోడ్లు. మరియు దీని తర్వాత మాత్రమే సమస్యలు ప్రారంభమవుతాయి. ఇది చాలా మంచి రిడెండెన్సీ, ఇది కొన్ని అదనపు SSD డ్రైవ్లు మరియు ప్రాసెసర్లకు విలువైనది. అందువల్ల, కాసాండ్రాను ఉపయోగించడానికి, ఇది ఎప్పుడూ SQL కాదు, దీనిలో సంబంధాలు, విదేశీ కీలు లేవు, మీరు సాధారణ నియమాలను తెలుసుకోవాలి.
మేము మీ అభ్యర్థన ప్రకారం ప్రతిదీ డిజైన్ చేస్తాము. ప్రధాన విషయం డేటా కాదు, కానీ అప్లికేషన్ దానితో ఎలా పని చేయబోతోంది. ఇది వేర్వేరు డేటాను వివిధ మార్గాల్లో లేదా అదే డేటాను వివిధ మార్గాల్లో స్వీకరించాల్సిన అవసరం ఉన్నట్లయితే, మేము దానిని అప్లికేషన్కు అనుకూలమైన విధంగా ఉంచాలి. లేకపోతే, మేము పూర్తి స్కాన్లో విఫలమవుతాము మరియు కాసాండ్రా మాకు ఎటువంటి ప్రయోజనాన్ని ఇవ్వదు.
డేటాను డీనార్మలైజ్ చేయడం ఆనవాయితీ. మేము సాధారణ ఫారమ్ల గురించి మరచిపోతాము, మాకు ఇకపై రిలేషనల్ డేటాబేస్లు లేవు. మనం దేనినైనా 100 సార్లు కింద పెడితే, అది 100 సార్లు పడుకుంటుంది. ఇది ఆపడం కంటే ఇప్పటికీ చౌకైనది.
విభజన కోసం మేము కీలను ఎంచుకుంటాము, తద్వారా అవి సాధారణంగా పంపిణీ చేయబడతాయి. మా కీల హాష్ ఒక ఇరుకైన పరిధిలోకి రావాలని మేము కోరుకోము. అంటే, పై ఉదాహరణలో పుట్టిన సంవత్సరం ఒక చెడ్డ ఉదాహరణ. మరింత ఖచ్చితంగా, మా వినియోగదారులు సాధారణంగా పుట్టిన సంవత్సరం ద్వారా పంపిణీ చేయబడితే మంచిది, మరియు మేము 5 వ తరగతి విద్యార్థుల గురించి మాట్లాడినట్లయితే చెడుగా ఉంటుంది - అక్కడ విభజన చాలా మంచిది కాదు.
క్లస్టరింగ్ కీ సృష్టి దశలో ఒకసారి సార్టింగ్ ఎంపిక చేయబడుతుంది. దీన్ని మార్చవలసి వస్తే, మేము మా పట్టికను వేరే కీతో నవీకరించాలి.
మరియు అతి ముఖ్యమైన విషయం: మనం ఒకే డేటాను 100 రకాలుగా తిరిగి పొందాలంటే, మనకు 100 విభిన్న పట్టికలు ఉంటాయి.
మూలం: www.habr.com