పెద్ద వాల్యూమ్ల డేటాతో పని చేస్తున్నప్పుడు, డిస్క్ స్థలం లేకపోవడం సమస్య కొన్నిసార్లు తలెత్తవచ్చు. ఈ సమస్యను పరిష్కరించడానికి ఒక మార్గం కుదింపు, దీనికి ధన్యవాదాలు, అదే పరికరాలలో, మీరు నిల్వ వాల్యూమ్లను పెంచుకోవచ్చు. ఈ కథనంలో, అపాచీ ఇగ్నైట్లో డేటా కంప్రెషన్ ఎలా పనిచేస్తుందో చూద్దాం. ఈ వ్యాసం ఉత్పత్తిలో అమలు చేయబడిన డిస్క్ కంప్రెషన్ పద్ధతులను మాత్రమే వివరిస్తుంది. డేటా కంప్రెషన్ యొక్క ఇతర పద్ధతులు (నెట్వర్క్ ద్వారా, మెమరీలో), అమలు చేయబడినా లేదా అమలు చేయకపోయినా, పరిధి వెలుపల ఉంటాయి.
కాబట్టి, పెర్సిస్టెన్స్ మోడ్ ప్రారంభించబడితే, కాష్లలో డేటాలో మార్పుల ఫలితంగా, ఇగ్నైట్ డిస్క్కి వ్రాయడం ప్రారంభిస్తుంది:
- కాష్ల కంటెంట్లు
- ముందు లాగ్ వ్రాయండి (ఇకపై కేవలం WAL)
WAL కంప్రెషన్ కోసం చాలా కాలంగా ఒక మెకానిజం ఉంది, దీనిని WAL కంపాక్షన్ అని పిలుస్తారు. ఇటీవల విడుదలైన అపాచీ ఇగ్నైట్ 2.8 డిస్క్లోని డేటాను కుదించడానికి మిమ్మల్ని అనుమతించే మరో రెండు మెకానిజమ్లను పరిచయం చేసింది: కాష్ల కంటెంట్లను కంప్రెస్ చేయడానికి డిస్క్ పేజీ కంప్రెషన్ మరియు కొన్ని WAL ఎంట్రీలను కుదించడానికి WAL పేజీ స్నాప్షాట్ కంప్రెషన్. ఈ మూడు మెకానిజమ్ల గురించి మరిన్ని వివరాలు దిగువన ఉన్నాయి.
డిస్క్ పేజీ కుదింపు
ఎలా పని చేస్తుంది
ముందుగా, ఇగ్నైట్ డేటాను ఎలా నిల్వ చేస్తుందో చాలా క్లుప్తంగా చూద్దాం. నిల్వ కోసం పేజీ మెమరీ ఉపయోగించబడుతుంది. పేజీ పరిమాణం నోడ్ ప్రారంభంలో సెట్ చేయబడింది మరియు తదుపరి దశలలో మార్చబడదు; అలాగే, పేజీ పరిమాణం తప్పనిసరిగా రెండు పవర్ మరియు ఫైల్ సిస్టమ్ బ్లాక్ పరిమాణంలో మల్టిపుల్ అయి ఉండాలి. అవసరమైన విధంగా డిస్క్ నుండి పేజీలు RAMలోకి లోడ్ చేయబడతాయి; డిస్క్లోని డేటా పరిమాణం కేటాయించిన RAM మొత్తాన్ని మించి ఉండవచ్చు. డిస్క్ నుండి పేజీని లోడ్ చేయడానికి RAMలో తగినంత స్థలం లేకపోతే, పాత, ఇకపై ఉపయోగించని పేజీలు RAM నుండి తొలగించబడతాయి.
డేటా క్రింది రూపంలో డిస్క్లో నిల్వ చేయబడుతుంది: ప్రతి కాష్ సమూహం యొక్క ప్రతి విభజన కోసం ఒక ప్రత్యేక ఫైల్ సృష్టించబడుతుంది; ఈ ఫైల్లో, పేజీలు ఆరోహణ సూచిక క్రమంలో ఒకదాని తర్వాత ఒకటి కనిపిస్తాయి. పూర్తి పేజీ ఐడెంటిఫైయర్ ఫైల్లోని కాష్ గ్రూప్ ఐడెంటిఫైయర్, విభజన సంఖ్య మరియు పేజీ సూచికను కలిగి ఉంటుంది. అందువల్ల, పూర్తి పేజీ ఐడెంటిఫైయర్ని ఉపయోగించి, ప్రతి పేజీకి సంబంధించిన ఫైల్ని మరియు ఫైల్లోని ఆఫ్సెట్ను మనం ప్రత్యేకంగా గుర్తించవచ్చు. మీరు Apache Ignite Wiki కథనంలో పేజింగ్ మెమరీ గురించి మరింత చదువుకోవచ్చు:
డిస్క్ పేజీ కంప్రెషన్ మెకానిజం, మీరు పేరు నుండి ఊహించినట్లుగా, పేజీ స్థాయిలో పని చేస్తుంది. ఈ మెకానిజం ప్రారంభించబడినప్పుడు, ర్యామ్లోని డేటా ఎటువంటి కుదింపు లేకుండా ప్రాసెస్ చేయబడుతుంది, అయితే పేజీలు RAM నుండి డిస్క్కు సేవ్ చేయబడినప్పుడు, అవి కంప్రెస్ చేయబడతాయి.
కానీ ప్రతి పేజీని ఒక్కొక్కటిగా కుదించడం సమస్యకు పరిష్కారం కాదు; మీరు ఫలిత డేటా ఫైల్ల పరిమాణాన్ని ఎలాగైనా తగ్గించాలి. పేజీ పరిమాణం ఇకపై పరిష్కరించబడకపోతే, మేము ఇకపై ఫైల్కి పేజీలను ఒకదాని తర్వాత ఒకటి వ్రాయలేము, ఎందుకంటే ఇది అనేక సమస్యలను సృష్టించగలదు:
- పేజీ సూచికను ఉపయోగించి, మేము ఫైల్లో ఉన్న ఆఫ్సెట్ను లెక్కించలేము.
- ఫైల్ చివరిలో లేని మరియు వాటి పరిమాణాన్ని మార్చే పేజీలను ఏమి చేయాలో స్పష్టంగా లేదు. పేజీ పరిమాణం తగ్గితే, అది ఖాళీ చేసిన స్థలం అదృశ్యమవుతుంది. పేజీ పరిమాణం పెరిగితే, మీరు దాని కోసం ఫైల్లో కొత్త స్థలం కోసం వెతకాలి.
- ఫైల్ సిస్టమ్ బ్లాక్ పరిమాణంలో మల్టిపుల్ లేని అనేక బైట్ల ద్వారా పేజీ కదులుతున్నట్లయితే, దాన్ని చదవడం లేదా వ్రాయడం కోసం మరొక ఫైల్ సిస్టమ్ బ్లాక్ను తాకడం అవసరం, ఇది పనితీరు క్షీణతకు దారితీస్తుంది.
ఈ సమస్యలను దాని స్వంత స్థాయిలో పరిష్కరించకుండా నివారించడానికి, అపాచీ ఇగ్నైట్లోని డిస్క్ పేజీ కంప్రెషన్ స్పేర్స్ ఫైల్స్ అనే ఫైల్ సిస్టమ్ మెకానిజంను ఉపయోగిస్తుంది. కొన్ని సున్నాతో నిండిన ప్రాంతాలను "రంధ్రాలు"గా గుర్తించగలిగే ఒక చిన్న ఫైల్. ఈ సందర్భంలో, ఈ రంధ్రాలను నిల్వ చేయడానికి ఫైల్ సిస్టమ్ బ్లాక్లు ఏవీ కేటాయించబడవు, ఫలితంగా డిస్క్ స్థలం ఆదా అవుతుంది.
ఫైల్ సిస్టమ్ బ్లాక్ను విడిపించడానికి, రంధ్రం యొక్క పరిమాణం తప్పనిసరిగా ఫైల్ సిస్టమ్ బ్లాక్ కంటే ఎక్కువగా ఉండాలి లేదా సమానంగా ఉండాలి, ఇది పేజీ పరిమాణం మరియు Apache Ignite పై అదనపు పరిమితిని విధిస్తుంది: కుదింపు ఏదైనా ప్రభావం చూపడానికి, ఫైల్ సిస్టమ్ బ్లాక్ పరిమాణం కంటే పేజీ పరిమాణం ఖచ్చితంగా పెద్దదిగా ఉండాలి. పేజీ పరిమాణం బ్లాక్ పరిమాణానికి సమానంగా ఉంటే, మేము ఎప్పటికీ ఒకే బ్లాక్ని విడిపించలేము, ఎందుకంటే ఒకే బ్లాక్ను ఖాళీ చేయడానికి, కంప్రెస్ చేయబడిన పేజీ 0 బైట్లను ఆక్రమించాలి. పేజీ పరిమాణం 2 లేదా 4 బ్లాక్ల పరిమాణానికి సమానంగా ఉన్నట్లయితే, మా పేజీని వరుసగా కనీసం 50% లేదా 75%కి కుదించినట్లయితే మేము ఇప్పటికే కనీసం ఒక బ్లాక్ని ఖాళీ చేయగలుగుతాము.
ఈ విధంగా, మెకానిజం ఎలా పనిచేస్తుందనే దాని యొక్క చివరి వివరణ: డిస్క్కి పేజీని వ్రాసేటప్పుడు, పేజీని కుదించడానికి ప్రయత్నం చేయబడుతుంది. కంప్రెస్ చేయబడిన పేజీ యొక్క పరిమాణం ఒకటి లేదా అంతకంటే ఎక్కువ ఫైల్ సిస్టమ్ బ్లాక్లను విడుదల చేయడానికి అనుమతిస్తే, అప్పుడు పేజీ కంప్రెస్డ్ రూపంలో వ్రాయబడుతుంది మరియు ఫ్రీడ్ బ్లాక్ల స్థానంలో “రంధ్రం” తయారు చేయబడుతుంది (సిస్టమ్ కాల్ అమలు చేయబడుతుంది fallocate()
పంచ్ హోల్ జెండాతో). కంప్రెస్ చేయబడిన పేజీ యొక్క పరిమాణం బ్లాక్లను విముక్తి చేయడానికి అనుమతించకపోతే, పేజీ అలాగే, కంప్రెస్ చేయని విధంగా సేవ్ చేయబడుతుంది. పేజీ సూచికను పేజీ పరిమాణంతో గుణించడం ద్వారా అన్ని పేజీ ఆఫ్సెట్లు కుదింపు లేకుండా అదే విధంగా గణించబడతాయి. మీ స్వంతంగా పేజీలను మార్చాల్సిన అవసరం లేదు. పేజీ ఆఫ్సెట్లు, కుదింపు లేకుండా, ఫైల్ సిస్టమ్ బ్లాక్ల సరిహద్దులపై వస్తాయి.
ప్రస్తుత అమలులో, Linux OS క్రింద ఉన్న చిన్న ఫైల్లతో మాత్రమే ఇగ్నైట్ పని చేయగలదు; తదనుగుణంగా, ఈ ఆపరేటింగ్ సిస్టమ్లో ఇగ్నైట్ ఉపయోగిస్తున్నప్పుడు మాత్రమే డిస్క్ పేజీ కంప్రెషన్ ప్రారంభించబడుతుంది.
డిస్క్ పేజీ కంప్రెషన్ కోసం ఉపయోగించే కంప్రెషన్ అల్గారిథమ్లు: ZSTD, LZ4, Snappy. అదనంగా, ఒక ఆపరేటింగ్ మోడ్ (SKIP_GARBAGE) ఉంది, దీనిలో పేజీలోని ఉపయోగించని స్థలం మాత్రమే మిగిలిన డేటాపై కుదింపును వర్తింపజేయకుండా విసిరివేయబడుతుంది, ఇది గతంలో జాబితా చేయబడిన అల్గారిథమ్లతో పోలిస్తే CPUపై లోడ్ను తగ్గిస్తుంది.
పనితీరు ప్రభావం
దురదృష్టవశాత్తూ, ఉత్పత్తిలో ఈ యంత్రాంగాన్ని ఉపయోగించాలని మేము ప్లాన్ చేయనందున, నేను నిజమైన స్టాండ్లపై వాస్తవ పనితీరు కొలతలను నిర్వహించలేదు, అయితే మనం ఎక్కడ ఓడిపోతామో మరియు ఎక్కడ గెలుస్తామో సిద్ధాంతపరంగా ఊహించవచ్చు.
దీన్ని చేయడానికి, యాక్సెస్ చేసినప్పుడు పేజీలు ఎలా చదవబడతాయి మరియు వ్రాయబడతాయి అనే విషయాన్ని మనం గుర్తుంచుకోవాలి:
- రీడ్ ఆపరేషన్ చేస్తున్నప్పుడు, అది మొదట RAMలో శోధించబడుతుంది; శోధన విజయవంతం కాకపోతే, రీడ్ చేసే అదే థ్రెడ్ ద్వారా పేజీ డిస్క్ నుండి RAMలోకి లోడ్ చేయబడుతుంది.
- వ్రాత ఆపరేషన్ చేసినప్పుడు, RAMలోని పేజీ మురికిగా గుర్తించబడుతుంది, అయితే థ్రెడ్ రైట్ చేయడం ద్వారా పేజీ భౌతికంగా డిస్క్లో వెంటనే సేవ్ చేయబడదు. ప్రత్యేక థ్రెడ్లలో చెక్పాయింట్ ప్రక్రియలో అన్ని మురికి పేజీలు డిస్క్లో సేవ్ చేయబడతాయి.
కాబట్టి రీడ్ ఆపరేషన్లపై ప్రభావం:
- పాజిటివ్ (డిస్క్ IO), రీడ్ ఫైల్ సిస్టమ్ బ్లాక్ల సంఖ్య తగ్గడం వల్ల.
- ప్రతికూల (CPU), స్పేర్ ఫైల్లతో పనిచేయడానికి ఆపరేటింగ్ సిస్టమ్కు అవసరమైన అదనపు లోడ్ కారణంగా. మరింత సంక్లిష్టమైన చిన్న ఫైల్ నిర్మాణాన్ని సేవ్ చేయడానికి అదనపు IO ఆపరేషన్లు ఇక్కడ పరోక్షంగా కనిపించే అవకాశం ఉంది (దురదృష్టవశాత్తూ, స్పేర్స్ ఫైల్లు ఎలా పని చేస్తాయో అన్ని వివరాలతో నాకు తెలియదు).
- ప్రతికూల (CPU), పేజీలను విడదీయాల్సిన అవసరం కారణంగా.
- వ్రాత కార్యకలాపాలపై ఎటువంటి ప్రభావం ఉండదు.
- చెక్పాయింట్ ప్రాసెస్పై ప్రభావం (ఇక్కడ ప్రతిదీ రీడ్ ఆపరేషన్ల మాదిరిగానే ఉంటుంది):
- పాజిటివ్ (డిస్క్ IO), వ్రాసిన ఫైల్ సిస్టమ్ బ్లాక్ల సంఖ్య తగ్గడం వల్ల.
- ప్రతికూల (CPU, బహుశా డిస్క్ IO), చిన్న ఫైల్లతో పని చేయడం వలన.
- ప్రతికూల (CPU), పేజీ కుదింపు అవసరం కారణంగా.
స్కేల్లోని ఏ వైపు స్కేల్ను చిట్కా చేస్తుంది? ఇదంతా చాలా పర్యావరణంపై ఆధారపడి ఉంటుంది, అయితే డిస్క్ పేజీ కంప్రెషన్ చాలా సిస్టమ్లలో పనితీరు క్షీణతకు దారితీస్తుందని నేను నమ్ముతున్నాను. అంతేకాకుండా, ఇతర DBMSల మీద పరీక్షలు చిన్న ఫైల్లతో ఇదే విధానాన్ని ఉపయోగిస్తాయి, కుదింపు ప్రారంభించబడినప్పుడు పనితీరు తగ్గుతుంది.
ఎలా ప్రారంభించాలి మరియు కాన్ఫిగర్ చేయాలి
పైన పేర్కొన్నట్లుగా, డిస్క్ పేజీ కంప్రెషన్కు మద్దతిచ్చే అపాచీ ఇగ్నైట్ యొక్క కనీస వెర్షన్ 2.8 మరియు కేవలం Linux ఆపరేటింగ్ సిస్టమ్కు మాత్రమే మద్దతు ఉంది. కింది విధంగా ప్రారంభించండి మరియు కాన్ఫిగర్ చేయండి:
- క్లాస్-పాత్లో తప్పనిసరిగా ఇగ్నైట్-కంప్రెషన్ మాడ్యూల్ ఉండాలి. డిఫాల్ట్గా, ఇది లిబ్స్/ఐచ్ఛిక డైరెక్టరీలోని అపాచీ ఇగ్నైట్ డిస్ట్రిబ్యూషన్లో ఉంది మరియు క్లాస్-పాత్లో చేర్చబడలేదు. మీరు డైరెక్టరీని ఒక స్థాయి పైకి లిబ్స్కి తరలించవచ్చు మరియు మీరు దానిని ignite.sh ద్వారా అమలు చేసినప్పుడు అది స్వయంచాలకంగా ప్రారంభించబడుతుంది.
- పట్టుదల తప్పనిసరిగా ప్రారంభించబడాలి (ద్వారా ప్రారంభించబడింది
DataRegionConfiguration.setPersistenceEnabled(true))
. - పేజీ పరిమాణం తప్పనిసరిగా ఫైల్ సిస్టమ్ బ్లాక్ పరిమాణం కంటే పెద్దదిగా ఉండాలి (మీరు దీన్ని ఉపయోగించి సెట్ చేయవచ్చు
DataStorageConfiguration.setPageSize()
). - డేటా కంప్రెస్ చేయాల్సిన ప్రతి కాష్ కోసం, మీరు తప్పనిసరిగా కంప్రెషన్ పద్ధతిని మరియు (ఐచ్ఛికంగా) కుదింపు స్థాయిని (పద్ధతులు) కాన్ఫిగర్ చేయాలి
CacheConfiguration.setDiskPageCompression() , CacheConfiguration.setDiskPageCompressionLevel()
).
WAL సంపీడనం
ఎలా పని చేస్తుంది
WAL అంటే ఏమిటి మరియు అది ఎందుకు అవసరం? చాలా క్లుప్తంగా: ఇది పేజీ నిల్వను చివరికి మార్చే అన్ని ఈవెంట్లను కలిగి ఉన్న లాగ్. పతనం విషయంలో కోలుకోవడానికి ఇది ప్రాథమికంగా అవసరం. ఏదైనా ఆపరేషన్, వినియోగదారుకు నియంత్రణను ఇచ్చే ముందు, ముందుగా WALలో ఈవెంట్ను రికార్డ్ చేయాలి, తద్వారా విఫలమైతే, అది లాగ్లో తిరిగి ప్లే చేయబడుతుంది మరియు ఈ ఆపరేషన్లు అయినప్పటికీ, వినియోగదారు విజయవంతమైన ప్రతిస్పందనను అందుకున్న అన్ని కార్యకలాపాలను పునరుద్ధరించవచ్చు. డిస్క్లోని పేజీ నిల్వలో ప్రతిబింబించేలా సమయం లేదు (ఇప్పటికే పేజీ స్టోర్కి అసలు రాయడం "చెక్పాయింటింగ్" అనే ప్రక్రియలో ప్రత్యేక థ్రెడ్ల ద్వారా కొంత ఆలస్యంగా జరుగుతుందని వివరించబడింది).
WALలోని ఎంట్రీలు లాజికల్ మరియు ఫిజికల్గా విభజించబడ్డాయి. బూలియన్ వారే కీలు మరియు విలువలు. భౌతిక - పేజీ స్టోర్లోని పేజీలకు మార్పులను ప్రతిబింబిస్తుంది. లాజికల్ రికార్డ్లు కొన్ని ఇతర సందర్భాల్లో ఉపయోగపడతాయి, క్రాష్ అయినప్పుడు రికవరీ కోసం మాత్రమే భౌతిక రికార్డులు అవసరమవుతాయి మరియు చివరి విజయవంతమైన చెక్పాయింట్ నుండి మాత్రమే రికార్డులు అవసరమవుతాయి. ఇక్కడ మేము వివరంగా చెప్పము మరియు ఇది ఎందుకు ఈ విధంగా పనిచేస్తుందో వివరించము, అయితే ఆసక్తి ఉన్నవారు Apache Ignite Wikiలో ఇప్పటికే పేర్కొన్న కథనాన్ని చూడవచ్చు:
ఒక్కో తార్కిక రికార్డుకు తరచుగా అనేక భౌతిక రికార్డులు ఉంటాయి. అంటే, ఉదాహరణకు, కాష్లోకి ఒక పుట్ ఆపరేషన్ పేజీ మెమరీలోని అనేక పేజీలను ప్రభావితం చేస్తుంది (డేటాతో కూడిన పేజీ, సూచికలతో కూడిన పేజీలు, ఉచిత-జాబితాలతో పేజీలు). కొన్ని సింథటిక్ పరీక్షలలో, WAL ఫైల్లో 90% వరకు భౌతిక రికార్డులు ఆక్రమించబడి ఉన్నాయని నేను కనుగొన్నాను. అయినప్పటికీ, అవి చాలా తక్కువ సమయం వరకు అవసరమవుతాయి (డిఫాల్ట్గా, చెక్పోస్టుల మధ్య విరామం 3 నిమిషాలు). దాని ఔచిత్యాన్ని కోల్పోయిన తర్వాత ఈ డేటాను వదిలించుకోవటం తార్కికంగా ఉంటుంది. WAL కంపాక్షన్ మెకానిజం సరిగ్గా ఇదే చేస్తుంది: ఇది భౌతిక రికార్డులను తొలగిస్తుంది మరియు జిప్ ఉపయోగించి మిగిలిన తార్కిక రికార్డులను కంప్రెస్ చేస్తుంది, అయితే ఫైల్ పరిమాణం చాలా గణనీయంగా తగ్గుతుంది (కొన్నిసార్లు పదుల సార్లు).
భౌతికంగా, WAL అనేక విభాగాలను (డిఫాల్ట్గా 10) స్థిర పరిమాణంలో (డిఫాల్ట్గా 64MB) కలిగి ఉంటుంది, ఇవి వృత్తాకార పద్ధతిలో ఓవర్రైట్ చేయబడతాయి. ప్రస్తుత సెగ్మెంట్ నిండిన వెంటనే, తదుపరి సెగ్మెంట్ కరెంట్గా కేటాయించబడుతుంది మరియు నింపిన సెగ్మెంట్ ప్రత్యేక థ్రెడ్ ద్వారా ఆర్కైవ్కు కాపీ చేయబడుతుంది. WAL కాంపాక్షన్ ఇప్పటికే ఆర్కైవ్ విభాగాలతో పని చేస్తుంది. అలాగే, ప్రత్యేక థ్రెడ్గా, ఇది చెక్పాయింట్ యొక్క అమలును పర్యవేక్షిస్తుంది మరియు భౌతిక రికార్డులు ఇకపై అవసరం లేని ఆర్కైవ్ విభాగాలలో కుదింపును ప్రారంభిస్తుంది.
పనితీరు ప్రభావం
WAL సంపీడనం ఒక ప్రత్యేక థ్రెడ్గా నడుస్తుంది కాబట్టి, నిర్వహించబడుతున్న కార్యకలాపాలపై ప్రత్యక్ష ప్రభావం ఉండకూడదు. కానీ ఇది ఇప్పటికీ CPU (కంప్రెషన్) మరియు డిస్క్పై అదనపు బ్యాక్గ్రౌండ్ లోడ్ను ఉంచుతుంది (ఆర్కైవ్ నుండి ప్రతి WAL విభాగాన్ని చదవడం మరియు కంప్రెస్ చేయబడిన విభాగాలను వ్రాయడం), కాబట్టి సిస్టమ్ గరిష్ట సామర్థ్యంతో నడుస్తుంటే, అది పనితీరు క్షీణతకు కూడా దారి తీస్తుంది.
ఎలా ప్రారంభించాలి మరియు కాన్ఫిగర్ చేయాలి
మీరు ప్రాపర్టీని ఉపయోగించి WAL కాంపాక్షన్ని ప్రారంభించవచ్చు WalCompactionEnabled
в DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)
) అలాగే, DataStorageConfiguration.setWalCompactionLevel() పద్ధతిని ఉపయోగించి, మీరు డిఫాల్ట్ విలువ (BEST_SPEED)తో సంతృప్తి చెందకపోతే కంప్రెషన్ స్థాయిని సెట్ చేయవచ్చు.
WAL పేజీ స్నాప్షాట్ కుదింపు
ఎలా పని చేస్తుంది
WAL రికార్డులు తార్కిక మరియు భౌతికంగా విభజించబడిందని మేము ఇప్పటికే కనుగొన్నాము. ప్రతి పేజీకి ప్రతి మార్పు కోసం, పేజీ మెమరీలో భౌతిక WAL రికార్డ్ సృష్టించబడుతుంది. భౌతిక రికార్డులు కూడా 2 ఉప రకాలుగా విభజించబడ్డాయి: పేజీ స్నాప్షాట్ రికార్డ్ మరియు డెల్టా రికార్డ్. మేము పేజీలో ఏదైనా మార్చిన ప్రతిసారీ మరియు దానిని శుభ్రమైన స్థితి నుండి మురికి స్థితికి బదిలీ చేసినప్పుడు, ఈ పేజీ యొక్క పూర్తి కాపీ WAL (పేజీ స్నాప్షాట్ రికార్డ్)లో నిల్వ చేయబడుతుంది. మేము WALలో ఒక బైట్ను మాత్రమే మార్చినప్పటికీ, రికార్డ్ పేజీ పరిమాణం కంటే కొంచెం పెద్దదిగా ఉంటుంది. మేము ఇప్పటికే మురికిగా ఉన్న పేజీలో ఏదైనా మార్చినట్లయితే, WALలో డెల్టా రికార్డ్ ఏర్పడుతుంది, ఇది పేజీ యొక్క మునుపటి స్థితితో పోలిస్తే మార్పులను మాత్రమే ప్రతిబింబిస్తుంది, కానీ మొత్తం పేజీ కాదు. చెక్పాయింట్ ప్రారంభమైన వెంటనే, చెక్పాయింట్ ప్రక్రియలో పేజీల స్థితిని డర్టీ నుండి క్లీన్కి రీసెట్ చేయడం జరుగుతుంది కాబట్టి, దాదాపు అన్ని భౌతిక రికార్డులు పేజీల స్నాప్షాట్లను మాత్రమే కలిగి ఉంటాయి (చెక్పాయింట్ ప్రారంభమైన వెంటనే అన్ని పేజీలు శుభ్రంగా ఉంటాయి కాబట్టి) , తర్వాత మేము తదుపరి చెక్పాయింట్కి చేరుకున్నప్పుడు, డెల్టా రికార్డ్ భిన్నం పెరగడం ప్రారంభమవుతుంది మరియు తదుపరి చెక్పాయింట్ ప్రారంభంలో మళ్లీ రీసెట్ చేయబడుతుంది. కొన్ని సింథటిక్ పరీక్షల్లోని కొలతలు భౌతిక రికార్డుల మొత్తం వాల్యూమ్లో పేజీ స్నాప్షాట్ల వాటా 90%కి చేరుకుందని చూపించింది.
WAL పేజీ స్నాప్షాట్ కంప్రెషన్ ఆలోచన ఏమిటంటే, రెడీమేడ్ పేజీ కంప్రెషన్ సాధనాన్ని ఉపయోగించి పేజీ స్నాప్షాట్లను కుదించడం (డిస్క్ పేజీ కంప్రెషన్ చూడండి). అదే సమయంలో, WALలో, రికార్డులు అనుబంధం-మాత్రమే మోడ్లో వరుసగా సేవ్ చేయబడతాయి మరియు ఫైల్ సిస్టమ్ బ్లాక్ల సరిహద్దులకు రికార్డ్లను బంధించాల్సిన అవసరం లేదు, కాబట్టి ఇక్కడ, డిస్క్ పేజీ కంప్రెషన్ మెకానిజం వలె కాకుండా, మనకు ఇక్కడ చిన్న ఫైల్లు అవసరం లేదు అన్నీ; తదనుగుణంగా, ఈ విధానం OS Linuxలో మాత్రమే పని చేస్తుంది. అదనంగా, మేము పేజీని ఎంత వరకు కుదించగలిగాము అనేది ఇకపై మాకు ముఖ్యమైనది కాదు. మేము 1 బైట్ను విడుదల చేసినప్పటికీ, ఇది ఇప్పటికే సానుకూల ఫలితం మరియు మేము డిస్క్ పేజీ కంప్రెషన్ వలె కాకుండా WALలో కంప్రెస్ చేయబడిన డేటాను సేవ్ చేయవచ్చు, ఇక్కడ మనం 1 ఫైల్ సిస్టమ్ బ్లాక్లను విడిచిపెట్టినట్లయితే మాత్రమే కంప్రెస్ చేయబడిన పేజీని సేవ్ చేస్తాము.
పేజీలు అత్యంత కుదించదగిన డేటా, మొత్తం WAL వాల్యూమ్లో వాటి వాటా చాలా ఎక్కువగా ఉంటుంది, కాబట్టి WAL ఫైల్ ఫార్మాట్ను మార్చకుండానే మనం దాని పరిమాణంలో గణనీయమైన తగ్గింపును పొందవచ్చు. లాజికల్ రికార్డ్లతో సహా కంప్రెషన్కు ఫార్మాట్లో మార్పు మరియు అనుకూలత కోల్పోవడం అవసరం, ఉదాహరణకు, లాజికల్ రికార్డ్లపై ఆసక్తి ఉన్న బాహ్య వినియోగదారుల కోసం, కానీ ఫైల్ పరిమాణంలో గణనీయమైన తగ్గింపుకు దారితీయదు.
డిస్క్ పేజీ కంప్రెషన్ మాదిరిగానే, WAL పేజీ స్నాప్షాట్ కంప్రెషన్ ZSTD, LZ4, Snappy కంప్రెషన్ అల్గారిథమ్లను అలాగే SKIP_GARBAGE మోడ్ను ఉపయోగించవచ్చు.
పనితీరు ప్రభావం
WAL పేజీ స్నాప్షాట్ కంప్రెషన్ను నేరుగా ప్రారంభించడం అనేది పేజీ మెమరీకి డేటాను వ్రాసే థ్రెడ్లను మాత్రమే ప్రభావితం చేస్తుందని గమనించడం కష్టం కాదు, అంటే కాష్లలో డేటాను మార్చే థ్రెడ్లు. WAL నుండి భౌతిక రికార్డులను చదవడం ఒక్కసారి మాత్రమే జరుగుతుంది, ఆ సమయంలో నోడ్ పడిపోయిన తర్వాత పైకి లేస్తుంది (మరియు అది చెక్పాయింట్ సమయంలో పడిపోయినప్పుడు మాత్రమే).
ఇది క్రింది విధంగా డేటాను మార్చే థ్రెడ్లను ప్రభావితం చేస్తుంది: డిస్క్కి వ్రాసే ముందు ప్రతిసారీ పేజీని కుదించాల్సిన అవసరం కారణంగా మేము ప్రతికూల ప్రభావాన్ని (CPU) పొందుతాము మరియు మొత్తంలో తగ్గుదల కారణంగా సానుకూల ప్రభావం (డిస్క్ IO) డేటా వ్రాయబడింది. దీని ప్రకారం, ఇక్కడ ప్రతిదీ సులభం: సిస్టమ్ పనితీరు CPU ద్వారా పరిమితం చేయబడితే, మేము కొంచెం క్షీణతను పొందుతాము, అది డిస్క్ I / O ద్వారా పరిమితం చేయబడితే, మేము పెరుగుదలను పొందుతాము.
పరోక్షంగా, WAL పరిమాణాన్ని తగ్గించడం అనేది ఆర్కైవ్ మరియు WAL కాంపాక్షన్ స్ట్రీమ్లలోకి WAL విభాగాలను డంప్ చేసే స్ట్రీమ్లను (పాజిటివ్గా) ప్రభావితం చేస్తుంది.
సింథటిక్ డేటాను ఉపయోగించి మా వాతావరణంలో వాస్తవ పనితీరు పరీక్షలు స్వల్ప పెరుగుదలను చూపించాయి (త్రూపుట్ 10% -15% పెరిగింది, జాప్యం 10% -15% తగ్గింది).
ఎలా ప్రారంభించాలి మరియు కాన్ఫిగర్ చేయాలి
కనిష్ట అపాచీ ఇగ్నైట్ వెర్షన్: 2.8. కింది విధంగా ప్రారంభించండి మరియు కాన్ఫిగర్ చేయండి:
- క్లాస్-పాత్లో తప్పనిసరిగా ఇగ్నైట్-కంప్రెషన్ మాడ్యూల్ ఉండాలి. డిఫాల్ట్గా, ఇది లిబ్స్/ఐచ్ఛిక డైరెక్టరీలోని అపాచీ ఇగ్నైట్ డిస్ట్రిబ్యూషన్లో ఉంది మరియు క్లాస్-పాత్లో చేర్చబడలేదు. మీరు డైరెక్టరీని ఒక స్థాయి పైకి లిబ్స్కి తరలించవచ్చు మరియు మీరు దానిని ignite.sh ద్వారా అమలు చేసినప్పుడు అది స్వయంచాలకంగా ప్రారంభించబడుతుంది.
- పట్టుదల తప్పనిసరిగా ప్రారంభించబడాలి (ద్వారా ప్రారంభించబడింది
DataRegionConfiguration.setPersistenceEnabled(true)
). - కంప్రెషన్ మోడ్ తప్పనిసరిగా పద్ధతిని ఉపయోగించి సెట్ చేయాలి
DataStorageConfiguration.setWalPageCompression()
, కుదింపు డిఫాల్ట్గా నిలిపివేయబడింది (డిసేబుల్ మోడ్). - ఐచ్ఛికంగా, మీరు పద్ధతిని ఉపయోగించి కుదింపు స్థాయిని సెట్ చేయవచ్చు
DataStorageConfiguration.setWalPageCompression()
, ప్రతి మోడ్ కోసం చెల్లుబాటు అయ్యే విలువల కోసం పద్ధతి కోసం javadoc చూడండి.
తీర్మానం
అపాచీ ఇగ్నైట్లో పరిగణించబడే డేటా కంప్రెషన్ మెకానిజమ్లు ఒకదానికొకటి స్వతంత్రంగా ఉపయోగించబడతాయి, అయితే వాటి కలయిక కూడా ఆమోదయోగ్యమైనది. అవి ఎలా పని చేస్తాయో అర్థం చేసుకోవడం మీ వాతావరణంలో మీ పనులకు ఎంత అనుకూలంగా ఉందో మరియు వాటిని ఉపయోగించినప్పుడు మీరు ఏమి త్యాగం చేయాల్సి ఉంటుందో నిర్ణయించడానికి మిమ్మల్ని అనుమతిస్తుంది. డిస్క్ పేజీ కంప్రెషన్ ప్రధాన నిల్వను కుదించడానికి రూపొందించబడింది మరియు మధ్యస్థ కుదింపు నిష్పత్తిని ఇవ్వగలదు. WAL పేజీ స్నాప్షాట్ కంప్రెషన్ WAL ఫైల్ల కోసం సగటు స్థాయి కంప్రెషన్ను ఇస్తుంది మరియు చాలా మటుకు పనితీరును మెరుగుపరుస్తుంది. WAL సంపీడనం పనితీరుపై సానుకూల ప్రభావాన్ని చూపదు, కానీ భౌతిక రికార్డులను తీసివేయడం ద్వారా WAL ఫైల్ల పరిమాణాన్ని వీలైనంత వరకు తగ్గిస్తుంది.
మూలం: www.habr.com