వ్యాసం యొక్క అనువాదం కోర్సు యొక్క విద్యార్థుల కోసం ప్రత్యేకంగా తయారు చేయబడింది
PostgreSQL మరియు కనెక్షన్-నిర్దిష్ట వ్రాత స్థిరత్వ సెట్టింగ్లు
కంపోజ్లో, మేము అనేక డేటాబేస్లతో వ్యవహరిస్తాము, ఇది వాటి ఫంక్షనాలిటీ మరియు లోపాలతో మరింత సుపరిచితులయ్యే అవకాశాన్ని ఇస్తుంది. కొత్త డేటాబేస్ల ఫీచర్లను ప్రేమించడం నేర్చుకున్నప్పుడు, మనం చాలా కాలంగా పని చేస్తున్న మరింత పరిణతి చెందిన టూల్స్లో ఇలాంటి ఫీచర్లు ఉంటే ఎంత బాగుంటుందో కొన్నిసార్లు ఆలోచించడం ప్రారంభిస్తాం. PostgreSQLలో నేను చూడాలనుకున్న కొత్త ఫీచర్లలో ఒకటి మొత్తం క్లస్టర్లో ప్రతి కనెక్షన్కి కాన్ఫిగర్ చేయగల రైట్ కాన్సిస్టెన్సీ. మరియు అది ముగిసినప్పుడు, మేము ఇప్పటికే దానిని కలిగి ఉన్నాము మరియు ఈ రోజు మీరు దీన్ని ఎలా ఉపయోగించవచ్చనే దాని గురించి సమాచారాన్ని మీతో భాగస్వామ్యం చేయాలనుకుంటున్నాము.
నాకు అది ఎందుకు అవసరం?
క్లస్టర్ ఎలా ప్రవర్తించాలి అనేది మీ దరఖాస్తుపై ఆధారపడి ఉంటుంది. ఉదాహరణకు, బిల్లు చెల్లింపు యాప్ను తీసుకోండి. మీకు క్లస్టర్లో XNUMX% స్థిరత్వం అవసరం, కాబట్టి మీరు సమకాలీకరణ కమిట్లను ప్రారంభించాలి, తద్వారా మీ డేటాబేస్ అన్ని మార్పులు చేయడానికి వేచి ఉంటుంది. అయితే, మీ అప్లికేషన్ వేగంగా అభివృద్ధి చెందుతున్న సోషల్ నెట్వర్క్ అయితే, మీరు బహుశా XNUMX% స్థిరత్వం కంటే వేగవంతమైన ప్రతిస్పందనను ఇష్టపడతారు. దీన్ని సాధించడానికి, మీరు మీ క్లస్టర్లో అసమకాలిక కమిట్లను ఉపయోగించవచ్చు.
రాజీని కలవండి
మీరు డేటా స్థిరత్వం మరియు పనితీరు మధ్య ట్రేడ్ఆఫ్లు చేయాలి. డిఫాల్ట్ కాన్ఫిగరేషన్ ఊహించదగినది మరియు ఊహించని ఆశ్చర్యం లేకుండా ఉంటుంది కాబట్టి PostgreSQL స్థిరత్వం నుండి దూరంగా ఉంటుంది. ఇప్పుడు రాజీలు చూద్దాం.
ట్రేడ్ఆఫ్ 1: పనితీరు
PostgreSQL క్లస్టర్కు అనుగుణ్యత అవసరం లేకపోతే, అది అసమకాలికంగా నడుస్తుంది. క్లస్టర్ లీడర్కి వ్రాయడం జరిగింది మరియు కొన్ని మిల్లీసెకన్ల తర్వాత దాని ప్రతిరూపాలకు నవీకరణలు పంపబడతాయి. PostgreSQL క్లస్టర్కు అనుగుణ్యత అవసరమైనప్పుడు, అది తప్పనిసరిగా సమకాలీకరించబడాలి. క్లస్టర్ లీడర్కి వ్రాత చేయబడుతుంది, ఇది ప్రతిరూపాలకు నవీకరణను పంపుతుంది మరియు అది విజయవంతం అయినట్లు వ్రాయడాన్ని ప్రారంభించిన క్లయింట్కు నిర్ధారణను పంపే ముందు ప్రతి ఒక్కరూ వ్రాసినట్లు నిర్ధారణ కోసం వేచి ఉండండి. ఈ విధానాల మధ్య ఆచరణాత్మక వ్యత్యాసం ఏమిటంటే, అసమకాలిక పద్ధతికి రెండు నెట్వర్క్ హాప్లు అవసరం, అయితే సింక్రోనస్ పద్ధతికి నాలుగు అవసరం.
ట్రేడ్ఆఫ్ 2: స్థిరత్వం
ఈ రెండు విధానాల్లో నాయకుడు విఫలమైతే ఫలితం కూడా భిన్నంగా ఉంటుంది. పని అసమకాలికంగా జరిగితే, అటువంటి లోపం సంభవించినట్లయితే, అన్ని రికార్డులు ప్రతిరూపాలచే కట్టుబడి ఉండవు. ఎంత పోతుంది? అప్లికేషన్ మరియు ప్రతిరూపణ సామర్థ్యంపై ఆధారపడి ఉంటుంది. కంపోజ్ రెప్లికేషన్ లీడర్లో ఉన్న సమాచారం కంటే 1 MB తక్కువగా ఉంటే ప్రతిరూపం లీడర్గా మారకుండా నిరోధిస్తుంది, అంటే అసమకాలిక ఆపరేషన్ సమయంలో 1 MB వరకు రికార్డులు కోల్పోయే అవకాశం ఉంది.
ఇది సింక్రోనస్ మోడ్లో జరగదు. నాయకుడు విఫలమైతే, అన్ని ప్రతిరూపాలు నవీకరించబడతాయి, ఎందుకంటే నాయకుడిపై ధృవీకరించబడిన ఏదైనా రాత ప్రతిరూపాలపై ధృవీకరించబడాలి. ఇది స్థిరత్వం.
బిల్లింగ్ అప్లికేషన్లో సింక్రోనస్ ప్రవర్తన అర్ధవంతంగా ఉంటుంది, ఇక్కడ స్థిరత్వం మరియు పనితీరు మధ్య ట్రేడ్-ఆఫ్లో స్థిరత్వం స్పష్టమైన ప్రయోజనాన్ని కలిగి ఉంటుంది. అటువంటి అప్లికేషన్ కోసం అత్యంత ముఖ్యమైన విషయం చెల్లుబాటు అయ్యే డేటా. వీలైనంత త్వరగా అభ్యర్థనలకు ప్రతిస్పందించడం ద్వారా వినియోగదారు దృష్టిని ఉంచడం ప్రధాన పని అయిన సోషల్ నెట్వర్క్ గురించి ఇప్పుడు ఆలోచించండి. ఈ సందర్భంలో, తక్కువ నెట్వర్క్ హాప్లతో పనితీరు మరియు కమిట్ల కోసం తక్కువ నిరీక్షణకు ప్రాధాన్యత ఉంటుంది. అయితే, పనితీరు మరియు అనుగుణ్యత మధ్య వర్తకం మాత్రమే మీరు ఆలోచించాల్సిన అవసరం లేదు.
ట్రేడ్-ఆఫ్ 3: క్రాష్లు
వైఫల్యం సమయంలో క్లస్టర్ ఎలా ప్రవర్తిస్తుందో అర్థం చేసుకోవడం చాలా ముఖ్యం. ఒకటి లేదా అంతకంటే ఎక్కువ ప్రతిరూపాలు విఫలమయ్యే పరిస్థితిని పరిగణించండి. కమిట్లు అసమకాలికంగా ప్రాసెస్ చేయబడినప్పుడు, నాయకుడు తప్పిపోయిన ప్రతిరూపాల కోసం వేచి ఉండకుండా, అంటే, అంగీకరించడం మరియు వ్రాసే ప్రక్రియలను కొనసాగించడం కొనసాగిస్తుంది. ప్రతిరూపాలు క్లస్టర్కి తిరిగి వచ్చినప్పుడు, అవి నాయకుడిని కలుసుకుంటాయి. సింక్రోనస్ రెప్లికేషన్తో, ప్రతిరూపాలు ప్రతిస్పందించకపోతే, నాయకుడికి ఎంపిక ఉండదు మరియు ప్రతిరూపం క్లస్టర్కి తిరిగి వచ్చే వరకు కమిట్ కన్ఫర్మేషన్ కోసం నిరీక్షిస్తూనే ఉంటుంది మరియు వ్రాతను అంగీకరించవచ్చు మరియు కట్టుబడి ఉంటుంది.
ఒక లావాదేవీకి ఒక కనెక్షన్?
ప్రతి అనువర్తనానికి అనుగుణ్యత మరియు పనితీరు యొక్క విభిన్న రకాల కలయిక అవసరం. వాస్తవానికి, ఇది మా బిల్-చెల్లింపు యాప్, ఇది పూర్తిగా స్థిరంగా ఉంటుందని మేము ఊహించుకుంటాము లేదా మా దాదాపు అశాశ్వతమైన సోషల్ నెట్వర్కింగ్ యాప్. అన్ని ఇతర సందర్భాలలో, కొన్ని కార్యకలాపాలు తప్పనిసరిగా సమకాలీకరించబడాలి మరియు కొన్ని అసమకాలికంగా ఉండాలి. చాట్కి పంపిన సందేశం కట్టుబడి ఉండే వరకు సిస్టమ్ వేచి ఉండకూడదని మీరు కోరుకోకపోవచ్చు, కానీ అదే అప్లికేషన్లో చెల్లింపు ప్రాసెస్ చేయబడితే, మీరు వేచి ఉండవలసి ఉంటుంది.
ఈ నిర్ణయాలన్నీ అప్లికేషన్ డెవలపర్ చేత తీసుకోబడతాయి. ప్రతి విధానాన్ని ఎప్పుడు ఉపయోగించాలో సరైన నిర్ణయాలు తీసుకోవడం వలన మీ క్లస్టర్ నుండి ఎక్కువ ప్రయోజనం పొందడంలో మీకు సహాయపడుతుంది. కనెక్షన్లు మరియు లావాదేవీల కోసం డెవలపర్ వాటి మధ్య SQL స్థాయిలో మారడం ముఖ్యం.
ఆచరణలో నియంత్రణను నిర్ధారించడం
డిఫాల్ట్గా, PostgreSQL స్థిరత్వాన్ని అందిస్తుంది. ఇది సర్వర్ పారామీటర్ ద్వారా నియంత్రించబడుతుంది synchronous_commit
. డిఫాల్ట్గా ఇది స్థానంలో ఉంది on
, కానీ దీనికి మూడు ఇతర ఎంపికలు ఉన్నాయి: local
, remote_write
లేదా off
.
పరామితిని సెట్ చేసినప్పుడు off
స్థానిక సిస్టమ్లో కూడా అన్ని సమకాలీకరణ కమిట్లు నిలిపివేయబడతాయి. స్థానిక పరామితి స్థానిక సిస్టమ్ కోసం సింక్రోనస్ మోడ్ను నిర్దేశిస్తుంది, కానీ ప్రతిరూపాలకు వ్రాయడం అసమకాలికంగా నిర్వహించబడుతుంది. Remote_write
ఇంకా ముందుకు వెళుతుంది: ప్రతిరూపాలకు వ్రాసేవి అసమకాలికంగా తయారు చేయబడతాయి, కానీ ప్రతిరూపం వ్రాయడాన్ని అంగీకరించినప్పుడు కానీ దానిని డిస్క్కు వ్రాయనప్పుడు తిరిగి ఇవ్వబడుతుంది.
అందుబాటులో ఉన్న ఎంపికల పరిధిని పరిగణనలోకి తీసుకోవడం ద్వారా, మేము ఒక ప్రవర్తనను ఎంచుకుంటాము మరియు దానిని దృష్టిలో ఉంచుకుని on
- ఇవి సింక్రోనస్ రికార్డింగ్లు, మేము ఎంచుకుంటాము local
నెట్వర్క్లో అసమకాలిక కమిట్ల కోసం, స్థానిక కమిట్లను సింక్రోనస్గా వదిలివేస్తుంది.
ఇప్పుడు, ఒక క్షణంలో దీన్ని ఎలా సెటప్ చేయాలో మేము మీకు చెప్తాము, కానీ మేము సెటప్ చేసినట్లు ఊహించుకోండి synchronous_commit
в local
సర్వర్ కోసం. పరామితిని మార్చడం సాధ్యమేనా అని మేము ఆశ్చర్యపోయాము synchronous_commit
ఫ్లైలో, మరియు ఇది సాధ్యం కాదని తేలింది, దీన్ని చేయడానికి రెండు మార్గాలు కూడా ఉన్నాయి. మొదటిది మీ కనెక్షన్ యొక్క సెషన్ను ఈ క్రింది విధంగా సెట్ చేయడం:
SET SESSION synchronous_commit TO ON;
// Your writes go here
సెషన్లోని అన్ని తదుపరి వ్రాతలు కనెక్ట్ చేయబడిన క్లయింట్కు సానుకూల ఫలితాన్ని అందించడానికి ముందు ప్రతిరూపాలకు వ్రాసిన వాటిని అంగీకరిస్తాయి. మీరు సెట్టింగ్ని మార్చకపోతే synchronous_commit
మళ్ళీ. మీరు భాగాన్ని వదిలివేయవచ్చు SESSION
ఆదేశంలో ఎందుకంటే అది డిఫాల్ట్ విలువలో ఉంటుంది.
మీరు ఒకే లావాదేవీకి సింక్రోనస్ రెప్లికేషన్ను పొందారని నిర్ధారించుకోవాలనుకున్నప్పుడు రెండవ పద్ధతి మంచిది. అనేక NoSQL జనరేషన్ డేటాబేస్లలో లావాదేవీల భావన ఉనికిలో లేదు, కానీ అది PostgreSQLలో ఉంది. ఈ సందర్భంలో మీరు లావాదేవీని ప్రారంభించి, ఆపై సెట్ చేయండి synchronous_commit
в on
లావాదేవీ కోసం ఎంట్రీని అమలు చేయడానికి ముందు. COMMIT
ఏదైనా పరామితి విలువను ఉపయోగించి లావాదేవీని చేస్తుంది synchronous_commit
, ఆ సమయంలో సెట్ చేయబడింది, అయితే ఇతర డెవలపర్లు వ్రాతలు అసమకాలికంగా లేవని అర్థం చేసుకోవడానికి వేరియబుల్ను ముందుగా సెట్ చేయడం ఉత్తమం.
BEGIN;
SET LOCAL synchronous_commit TO ON;
// Your writes go here
COMMIT;
కనెక్ట్ చేయబడిన క్లయింట్కు డేటాబేస్ సానుకూల ప్రతిస్పందనను అందించే ముందు అన్ని లావాదేవీ కమిట్లు ఇప్పుడు ప్రతిరూపాలకు వ్రాసినట్లు నిర్ధారించబడతాయి.
PostgreSQLని సెటప్ చేస్తోంది
దీనికి ముందు, మేము ఒక PostgreSQL వ్యవస్థను ఊహించాము synchronous_commit
, ఇన్స్టాల్ చేయబడింది local
. సర్వర్ వైపు దీన్ని వాస్తవికంగా చేయడానికి, మీరు రెండు సర్వర్ కాన్ఫిగరేషన్ ఎంపికలను సెట్ చేయాలి. మరో పరామితి synchronous_standby_names
ఎప్పుడు దానంతట అదే వస్తుంది synchronous_commit
లో ఉంటుంది on
. ఇది సమకాలీకరణ కమిట్లకు ఏ ప్రతిరూపాలు అర్హత కలిగి ఉన్నాయో నిర్ణయిస్తుంది మరియు మేము దానిని సెట్ చేస్తాము *
, అంటే అన్ని ప్రతిరూపాలు చేరి ఉన్నాయని అర్థం. ఈ విలువలు సాధారణంగా కాన్ఫిగర్ చేయబడతాయి
synchronous_commit = local
synchronous_standby_names='*'
పరామితిని సెట్ చేయడం ద్వారా synchronous_commit
అర్థం లోకి local
, మేము స్థానిక డిస్క్లు సింక్రోనస్గా ఉండే సిస్టమ్ను సృష్టిస్తాము, అయితే నెట్వర్క్ రెప్లికా కమిట్లు డిఫాల్ట్గా అసమకాలికంగా ఉంటాయి. వాస్తవానికి, పైన చూపిన విధంగా వీటిని సమకాలీకరించాలని మేము నిర్ణయించుకుంటే తప్ప.
మీరు అభివృద్ధిని అనుసరిస్తూ ఉంటే
మరికొన్ని మాటలు...
PostgreSQLని అంత చక్కగా ట్యూన్ చేయడం అసాధ్యమని ఒక వారం క్రితమే నేను మీకు చెప్పాను. కంపోజ్ ప్లాట్ఫారమ్ బృందంలోని సభ్యుడు కర్ట్ అలాంటి అవకాశం ఉందని నొక్కి చెప్పాడు. అతను నా అభ్యంతరాలను శాంతపరిచాడు మరియు PostgreSQL డాక్యుమెంటేషన్లో కనుగొన్నాడు
ఈ సెట్టింగ్ని ఎప్పుడైనా మార్చవచ్చు. ఏదైనా లావాదేవీకి సంబంధించిన ప్రవర్తన నిబద్ధత సమయంలో అమల్లో ఉన్న సెట్టింగ్ ద్వారా నిర్ణయించబడుతుంది. అందువల్ల, కొన్ని లావాదేవీలు సమకాలికంగా మరియు మరికొన్నింటికి అసమకాలికంగా చేయడం సాధ్యమవుతుంది మరియు ఉపయోగకరంగా ఉంటుంది. ఉదాహరణకు, ఒకరిని బలవంతం చేయడానికి multistatement
పరామితి యొక్క డిఫాల్ట్ విలువ ఎదురుగా ఉన్నప్పుడు, సెట్ చేయవలసిన లావాదేవీ అసమకాలికంగా జరుగుతుంది SET LOCAL synchronous_commit TO OFF
ఒక లావాదేవీలో.
కాన్ఫిగరేషన్ ఫైల్కి ఈ చిన్న మార్పుతో, మేము వినియోగదారులకు వారి స్థిరత్వం మరియు పనితీరుపై నియంత్రణను అందించాము.
మూలం: www.habr.com