பவர் செயலிழப்பின் போது கோப்பு எழுதும் ஆயுளைப் புரிந்துகொள்வது
நீங்கள் ஒரு கோப்பில் இரண்டு முக்கியமான தரவுகளை எழுதுகிறீர்கள் என்று கற்பனை செய்து பாருங்கள், திடீரென்று மின்சாரம் தடைபடுகிறது. லினக்ஸ் அல்லது நீங்கள் தேர்ந்தெடுத்த கோப்பு முறைமை உங்கள் இரண்டாவது எழுத்துச் சேமிப்பகத்தில் முதல் எழுதும் வரை தோன்றாது என்பதை உறுதிப்படுத்துமா? பேரழிவு ஏற்படும் வரை பல டெவலப்பர்கள் கவனிக்காத கேள்வி இது. 🛑
தரவு ஒருமைப்பாட்டைக் கையாளும் போது, குறிப்பாக மின் தோல்விகள் அல்லது செயலிழப்புகள் ஏற்படும் போது, கோப்பு நீடித்து நிலைத்திருப்பது முக்கியமானது. POSIX-இணக்கமான அமைப்புகள் அல்லது ext4 போன்ற பொதுவான கோப்பு முறைமைகளுடன் பணிபுரியும் போது இந்த கேள்வி இன்னும் அழுத்தமாகிறது. எழுதப்பட்டவை வரிசையாகவும் அணுவாகவும் இருக்கும் என்று உத்தரவாதம் அளிக்கப்படுகிறதா அல்லது கூடுதல் முன்னெச்சரிக்கைகள் தேவையா?
உதாரணமாக, ஒரு பெரிய பயன்பாடு எழுதும் பதிவுகள் அல்லது கட்டமைக்கப்பட்ட தரவை ஒரு கோப்பில் ஒன்றுடன் ஒன்று அல்லாத இரண்டு பகுதிகளாகக் கருதுங்கள். தெளிவான உத்தரவாதங்கள் இல்லாமல், இரண்டாவது எழுத்தின் ஒரு பகுதி வட்டுக்குள் ஊடுருவி, கோப்பை சீரற்ற நிலையில் விட்டுவிடும் அபாயம் உள்ளது. இது சிதைந்த தரவுத்தளங்கள், இழந்த பரிவர்த்தனைகள் அல்லது முழுமையற்ற பதிவுகளுக்கு வழிவகுக்கும். 😓
இந்தக் கட்டுரை POSIX, Linux அல்லது ext4 போன்ற நவீன கோப்பு முறைமைகள் கோப்பு எழுதும் ஆயுள் மற்றும் வரிசைப்படுத்தலுக்கு உத்தரவாதம் அளிக்குமா என்பதை ஆராய்கிறது. எழுதுதல்களுக்கு இடையில் fsync() அல்லது fdatasync() பயன்படுத்துவது தரவு முரண்பாட்டைத் தடுப்பதற்கான ஒரே நம்பகமான தீர்வாகுமா என்பதையும் நாங்கள் தீர்மானிப்போம்.
கட்டளை | பயன்பாட்டின் உதாரணம் |
---|---|
pwrite | pwrite செயல்பாடு கோப்பு சுட்டிக்காட்டியை மாற்றாமல் ஒரு குறிப்பிட்ட ஆஃப்செட்டில் ஒரு குறிப்பிட்ட கோப்பு விளக்கத்திற்கு தரவை எழுதுகிறது. எடுத்துக்காட்டாக: pwrite(fd, data1, size1, offset1). இது துல்லியமான நிலைகளில் எழுதுவதை உறுதி செய்கிறது, ஆர்டர் எழுதுவதற்கு பயனுள்ளதாக இருக்கும். |
fsync | fsync கட்டளை ஒரு கோப்பு விளக்கத்திற்கான அனைத்து இடையக தரவையும் வட்டில் எழுதும்படி கட்டாயப்படுத்துகிறது. தரவு பாதுகாப்பாக நிலைத்திருப்பதற்கு இது உத்தரவாதம் அளிக்கிறது. உதாரணமாக: fsync(fd). |
O_RDWR | ஓபன் சிஸ்டம் அழைப்பில் உள்ள O_RDWR கொடியானது ஒரு கோப்பை வாசிப்பதற்கும் எழுதுவதற்கும் திறக்க அனுமதிக்கிறது. எடுத்துக்காட்டாக: open(பாதை, O_RDWR). |
O_SYNC | O_SYNC ஆனது, கோப்பிற்கான ஒவ்வொரு எழுத்தையும் உடனடியாக வட்டுக்குத் தரவை ஃப்ளஷ் செய்வதை உறுதிசெய்கிறது, இது நீடித்த தன்மைக்கு உத்தரவாதம் அளிக்கிறது. எடுத்துக்காட்டாக: open(பாதை, O_SYNC). |
errno | தோல்வியுற்ற கணினி அழைப்பின் போது பிழைக் குறியீடுகளைப் பிழைக் குறியீடு பிடிக்கும். பிழை செய்திகளைக் காட்ட இது பெரும்பாலும் perror உடன் பயன்படுத்தப்படுகிறது. எடுத்துக்காட்டு: perror("எழுதுவதில் தோல்வி"). |
off_t | ஆஃப்_டி தரவு வகை கோப்பு ஆஃப்செட்களைக் குறிக்கிறது, பொதுவாக கோப்பு நிலைப்படுத்தல் செயல்பாடுகளில் பயன்படுத்தப்படுகிறது. எடுத்துக்காட்டு: off_t ஆஃப்செட் = 0. |
assert | உறுதியான செயல்பாடு யூனிட் சோதனைகளில் நிலைமைகளை சரிபார்க்கிறது, எதிர்பார்த்த முடிவுகள் ஏற்படுவதை உறுதி செய்கிறது. எடுத்துக்காட்டு: உள்ளடக்கத்தில் "டேட்டா பிளாக் 1" ஐ உறுதிப்படுத்தவும். |
fcntl.h | fcntl.h கோப்பு விளக்கங்களை நிர்வகிப்பதற்கும் குறைந்த-நிலை I/O ஐச் செயல்படுத்துவதற்கும் அவசியமான கோப்பு கட்டுப்பாட்டு செயல்பாடுகளை உள்ளடக்கியது. எடுத்துக்காட்டு: #include |
O_CREAT | O_CREAT கொடி திறக்கும் போது கோப்பு இல்லை என்றால் அதை உருவாக்கும். எடுத்துக்காட்டு: திறந்த (பாதை, O_RDWR | O_CREAT). |
perror | தோல்வியுற்ற கணினி அழைப்புகளுடன் தொடர்புடைய விளக்கமான பிழை செய்திகளை perror செயல்பாடு அச்சிடுகிறது. எடுத்துக்காட்டு: perror("திறந்த தோல்வி"). |
கோப்பு எழுதுதல் நீடித்து நிலைத்தன்மை மற்றும் தரவு நிலைத்தன்மையை உறுதி செய்தல்
முன்னர் வழங்கப்பட்ட ஸ்கிரிப்ட்களில், மின்சார செயலிழப்பு போன்ற எதிர்பாராத நிகழ்வுகள் நிகழும்போது லினக்ஸ் கோப்பில் எழுதும் ஆயுள் உத்தரவாதங்கள் சிக்கலை நாங்கள் எடுத்துரைத்தோம். தரவுகளின் இரண்டாவது தொகுதி என்பதை உறுதி செய்வதில் கவனம் செலுத்தப்பட்டது, தரவு2, முதல் தொகுதி வரை சேமிப்பில் நிலைத்திருக்காது, தரவு1, ஏற்கனவே முழுமையாக எழுதப்பட்டது. தீர்வு, கவனமாக தேர்ந்தெடுக்கப்பட்ட கணினி அழைப்புகளின் கலவையை நம்பியிருந்தது எழுது மற்றும் fsync, மற்றும் கோப்பு முறைமை நடத்தைகள். முதல் ஸ்கிரிப்ட் பயன்படுத்தப்பட்டது fsync தரவு2 எழுதுவதற்கு முன், தரவு1 வட்டில் ஃப்ளஷ் செய்யப்படுவதற்கு உத்தரவாதம் அளிக்க இரண்டு தொடர் எழுத்துகளுக்கு இடையில். முதல் எழுத்துக்குப் பிறகு கணினி செயலிழந்தாலும், இது தரவு ஒருமைப்பாட்டை உறுதி செய்கிறது.
அதை மேலும் உடைப்போம்: தி எழுது செயல்பாடு கோப்பு சுட்டியை மாற்றாமல் ஒரு கோப்பிற்குள் குறிப்பிட்ட ஆஃப்செட்டில் எழுதுகிறது. இரண்டு தரவுத் தொகுதிகள் தனித்தனி ஆஃப்செட்டுகளுக்கு எழுதப்பட்டிருக்கும் இங்கே காட்டப்பட்டுள்ளபடி, ஒன்றுடன் ஒன்று அல்லாத எழுத்துகளுக்கு இது மிகவும் பயனுள்ளதாக இருக்கும். வெளிப்படையாகப் பயன்படுத்துவதன் மூலம் fsync முதல் எழுத்துக்குப் பிறகு, கோப்பின் இடையக உள்ளடக்கத்தை வட்டில் ஃப்ளஷ் செய்ய இயக்க முறைமையை கட்டாயப்படுத்துகிறோம், இது நிலைத்தன்மையை உறுதி செய்கிறது. fsync இல்லாமல், தரவு நினைவகத்தில் இருக்கக்கூடும், மின்சாரம் செயலிழக்கும்போது இழப்புக்கு ஆளாகலாம். ஒரு முக்கியமான பதிவு உள்ளீட்டை எழுதுவது அல்லது தரவுத்தளத்தின் ஒரு பகுதியை சேமிப்பது போன்றவற்றை கற்பனை செய்து பாருங்கள்—முதல் பகுதி மறைந்துவிட்டால், தரவு சீரற்றதாகிவிடும். 😓
இரண்டாவது ஸ்கிரிப்ட்டில், நாங்கள் பயன்படுத்துவதை ஆராய்ந்தோம் O_SYNC உள்ள கொடி திறந்த அமைப்பு அழைப்பு. இந்தக் கொடி இயக்கப்பட்டால், ஒவ்வொரு எழுதும் செயல்பாடும் உடனடியாகத் தரவை சேமிப்பகத்திற்கு அனுப்புகிறது, கையேடு தேவையை நீக்குகிறது fsync அழைப்புகள். இது குறியீட்டை எளிதாக்குகிறது, அதே நேரத்தில் ஆயுள் உத்தரவாதத்தை உறுதி செய்கிறது. இருப்பினும், ஒரு பரிமாற்றம் உள்ளது: O_SYNC ஐப் பயன்படுத்துவது செயல்திறன் அபராதத்தை அறிமுகப்படுத்துகிறது, ஏனெனில் ஒத்திசைவான எழுதுதல்கள் இடையக எழுத்துகளுடன் ஒப்பிடும்போது அதிக நேரம் எடுக்கும். நிதி அமைப்புகள் அல்லது நிகழ்நேர தரவு பதிவு போன்ற செயல்திறன் கவலைகளை விட நம்பகத்தன்மை அதிகமாக இருக்கும் அமைப்புகளுக்கு இந்த அணுகுமுறை சிறந்தது. உதாரணமாக, நீங்கள் சென்சார் தரவு அல்லது பரிவர்த்தனை பதிவுகளைச் சேமிக்கிறீர்கள் என்றால், ஒவ்வொரு எழுத்தும் முற்றிலும் நம்பகமானதாக இருக்க வேண்டும். 🚀
பைத்தானில் எழுதப்பட்ட யூனிட் டெஸ்ட் ஸ்கிரிப்ட், சி நிரலை இயக்கிய பிறகு கோப்பின் உள்ளடக்கங்களைச் சரிபார்ப்பதன் மூலம் இந்தத் தீர்வுகளைச் சரிபார்க்கிறது. டேட்டா1 மற்றும் டேட்டா2 இரண்டும் எதிர்பார்த்தபடி எழுதப்பட்டிருப்பதை உறுதி செய்தது. பல்வேறு நிபந்தனைகளின் கீழ் கோப்பு செயல்பாடுகளைச் சோதிப்பதன் முக்கியத்துவத்தை இந்தப் படி எடுத்துக்காட்டுகிறது. உற்பத்தி சேவையகத்தில் இதேபோன்ற தீர்வை நீங்கள் பயன்படுத்தினால், உங்கள் எழுத்துகளின் நேர்மையை சரிபார்க்க அலகு சோதனைகள் முக்கியமானதாக இருக்கும். சோதனைகள் மூலம் சரிபார்ப்புடன் fsync பயன்பாடு போன்ற வலுவான குறியீட்டு நடைமுறைகளை இணைப்பதன் மூலம், POSIX-இணக்கமான கணினிகளில் எழுதும் உங்கள் கோப்புகளின் ஆயுள் மற்றும் நிலைத்தன்மையை நீங்கள் நம்பிக்கையுடன் உறுதி செய்யலாம்.
பவர் செயலிழப்பின் போது POSIX/Linux கணினிகளில் கோப்பு எழுதும் ஆயுளை உறுதி செய்தல்
தீர்வு 1: C நிரலாக்க அணுகுமுறை fsync ஐப் பயன்படுத்தி உத்தரவாதமான எழுதும் வரிசைப்படுத்தல்
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main() {
int fd;
const char *path = "example_file.txt";
const char *data1 = "First write block";
const char *data2 = "Second write block";
size_t size1 = strlen(data1);
size_t size2 = strlen(data2);
off_t offset1 = 0;
off_t offset2 = size1;
// Open the file
fd = open(path, O_RDWR | O_CREAT, 0666);
if (fd == -1) {
perror("Failed to open file");
return 1;
}
// Perform first write
if (pwrite(fd, data1, size1, offset1) == -1) {
perror("Failed to write data1");
close(fd);
return 1;
}
// Use fsync to flush the first write to disk
if (fsync(fd) == -1) {
perror("fsync failed after data1");
close(fd);
return 1;
}
// Perform second write
if (pwrite(fd, data2, size2, offset2) == -1) {
perror("Failed to write data2");
close(fd);
return 1;
}
// Final fsync to ensure data2 is flushed
if (fsync(fd) == -1) {
perror("fsync failed after data2");
close(fd);
return 1;
}
// Close the file
if (close(fd) == -1) {
perror("Failed to close file");
return 1;
}
printf("Writes completed and synced successfully.\n");
return 0;
}
எளிமையான பயன்பாட்டு நிகழ்வுகளுக்கு fsync இல்லாமல் ஆர்டர் செய்யப்பட்ட எழுத்துகளை உறுதி செய்தல்
தீர்வு 2: மென்மையான உத்தரவாதங்களுக்கான ext4 இயல்புநிலை ஜர்னலிங் கொண்ட சி நிரலாக்கம்
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main() {
int fd;
const char *path = "simple_ordered_file.txt";
const char *data1 = "Data block 1";
const char *data2 = "Data block 2";
size_t size1 = strlen(data1);
size_t size2 = strlen(data2);
// Open file with O_SYNC for synchronous writes
fd = open(path, O_RDWR | O_CREAT | O_SYNC, 0666);
if (fd == -1) {
perror("Open failed");
return 1;
}
// Write first data
if (write(fd, data1, size1) == -1) {
perror("Write data1 failed");
close(fd);
return 1;
}
// Write second data
if (write(fd, data2, size2) == -1) {
perror("Write data2 failed");
close(fd);
return 1;
}
// Close file
close(fd);
printf("Writes completed with O_SYNC.\n");
return 0;
}
ஃபைல் ரைட் ஆர்டர் செய்வதற்கான யூனிட் டெஸ்ட்
தீர்வு 3: ஆயுள் மற்றும் வரிசைப்படுத்தலைச் சரிபார்க்க பைத்தானைப் பயன்படுத்தி அலகு சோதனை
import os
def validate_file_content(path):
try:
with open(path, 'r') as f:
content = f.read()
assert "Data block 1" in content
assert "Data block 2" in content
print("Test passed: Both writes are present.")
except AssertionError:
print("Test failed: Writes are inconsistent.")
except Exception as e:
print(f"Error: {e}")
# File validation after running a C program
validate_file_content("simple_ordered_file.txt")
லினக்ஸில் தரவு நிலைத்தன்மையை உறுதி செய்தல்: ஜர்னலிங் மற்றும் பஃபர்டு ரைட்ஸ்
புரிதலின் ஒரு முக்கியமான அம்சம் ஆயுள் உத்தரவாதம் ext4 போன்ற லினக்ஸ் கோப்பு முறைமைகளில் ஜர்னலிங் பங்கு உள்ளது. ஜர்னலிங் கோப்பு முறைமைகள் மின்சாரம் செயலிழப்பு போன்ற எதிர்பாராத நிகழ்வுகளின் போது ஊழலைத் தடுக்க உதவுகின்றன, அவை முக்கிய சேமிப்பகத்திற்கு உறுதியளிக்கும் முன் மாற்றங்களின் பதிவை (அல்லது ஜர்னல்) பராமரிப்பதன் மூலம். உங்கள் தரவை சீராக வைத்து, முழுமையடையாத செயல்பாடுகள் திரும்பப் பெறப்படுவதை ஜர்னல் உறுதி செய்கிறது. இருப்பினும், அழைப்பு போன்ற கூடுதல் முன்னெச்சரிக்கைகள் இல்லாமல் ஆர்டர் செய்யப்பட்ட எழுத்துகளுக்கு ஜர்னலிங் இயல்பாக உத்தரவாதம் அளிக்காது fsync. எங்கள் எடுத்துக்காட்டில், ஜர்னலிங் கோப்பு சிதைக்கப்படாமல் இருப்பதை உறுதிசெய்யும் போது, அதன் பகுதிகள் தரவு2 முன்பு இன்னும் நீடிக்க முடியும் தரவு1.
லினக்ஸ் பஃபர்ஸ் கோப்பு எவ்வாறு எழுதுகிறது என்பது மற்றொரு கருத்தாகும். நீங்கள் பயன்படுத்தும் போது pwrite அல்லது write, தரவு பெரும்பாலும் நினைவக இடையகத்திற்கு எழுதப்படுகிறது, நேரடியாக வட்டில் அல்ல. இந்த இடையகமானது செயல்திறனை மேம்படுத்துகிறது ஆனால் பஃபர் ஃப்ளஷ் செய்யப்படுவதற்கு முன்பு கணினி செயலிழந்தால் தரவு இழப்பு ஏற்படும் அபாயத்தை உருவாக்குகிறது. அழைப்பு fsync அல்லது உடன் கோப்பைத் திறக்கவும் O_SYNC கொடி இடையக தரவு பாதுகாப்பாக வட்டில் சுத்தப்படுத்தப்படுவதை உறுதிசெய்கிறது, முரண்பாடுகளைத் தடுக்கிறது. இந்த நடவடிக்கைகள் இல்லாமல், தரவு ஓரளவு எழுதப்பட்டதாகத் தோன்றும், குறிப்பாக மின்சாரம் செயலிழந்தால். ⚡
பெரிய கோப்புகள் அல்லது முக்கியமான அமைப்புகளுடன் பணிபுரியும் டெவலப்பர்களுக்கு, நீடித்துழைப்பை மனதில் கொண்டு நிரல்களை வடிவமைப்பது அவசியம். எடுத்துக்காட்டாக, இருக்கை கிடைக்கும் தரவை எழுதும் விமான முன்பதிவு முறையை கற்பனை செய்து பாருங்கள். விமான விவரங்களைக் குறிக்கும் முதல் பிளாக் முழுமையாக எழுதப்படாமல், இரண்டாவது பிளாக் தொடர்ந்தால், அது டேட்டா சிதைவு அல்லது இரட்டை முன்பதிவுகளுக்கு வழிவகுக்கும். பயன்படுத்தி fsync அல்லது fdatasync முக்கியமான கட்டங்களில் இந்த ஆபத்துக்களை தவிர்க்கிறது. நம்பகத்தன்மையை உறுதிப்படுத்த உண்மையான தோல்வி உருவகப்படுத்துதல்களின் கீழ் நடத்தையை எப்போதும் சோதிக்கவும். 😊
லினக்ஸில் கோப்பு ஆயுள் பற்றி அடிக்கடி கேட்கப்படும் கேள்விகள்
- என்ன செய்கிறது fsync செய்ய, நான் எப்போது பயன்படுத்த வேண்டும்?
- fsync ஒரு கோப்பிற்கான அனைத்து தரவுகளும் மெட்டாடேட்டாவும் நினைவக பஃபர்களில் இருந்து வட்டுக்கு சுத்தப்படுத்தப்படுவதை உறுதி செய்கிறது. ஆயுளுக்கு உத்தரவாதம் அளிக்க விமர்சன எழுத்துகளுக்குப் பிறகு அதைப் பயன்படுத்தவும்.
- என்ன வித்தியாசம் fsync மற்றும் fdatasync?
- fdatasync கோப்பு அளவு புதுப்பிப்புகள் போன்ற மெட்டாடேட்டாவைத் தவிர்த்து, கோப்புத் தரவை மட்டும் பறிக்கும். fsync தரவு மற்றும் மெட்டாடேட்டா இரண்டையும் பறிக்கிறது.
- ext4 இல் ஜர்னலிங் ஆர்டர் செய்யப்பட்ட எழுத்துகளுக்கு உத்தரவாதம் அளிக்குமா?
- இல்லை, ext4 ஜர்னலிங் நிலைத்தன்மையை உறுதி செய்கிறது ஆனால் வெளிப்படையாகப் பயன்படுத்தாமல் எழுதுதல்கள் வரிசையாக நிகழும் என்பதற்கு உத்தரவாதம் அளிக்காது fsync அல்லது O_SYNC.
- எப்படி செய்கிறது O_SYNC வழக்கமான கோப்பு எழுதுவதில் இருந்து வேறுபட்டதா?
- உடன் O_SYNC, ஒவ்வொரு எழுத்தும் உடனடியாக வட்டில் ஃப்ளஷ் செய்யப்படுகிறது, இது நீடித்த தன்மையை உறுதி செய்கிறது ஆனால் செயல்திறனுக்கான செலவில்.
- எனது கணினியில் கோப்பு எழுதும் தன்மையை நான் சோதிக்க முடியுமா?
- ஆம், மெய்நிகர் இயந்திரங்கள் அல்லது கருவிகளைப் பயன்படுத்தி மின் தோல்விகளை உருவகப்படுத்தலாம் fio கோப்பு எழுதும் விதத்தை கவனிக்க.
கோப்பு எழுதும் ஒருமைப்பாட்டை உறுதி செய்வதற்கான இறுதி எண்ணங்கள்
மின்சாரம் செயலிழக்கும் போது கோப்பு நீடித்து உத்திரவாதமளிக்க வேண்டுமென்றே வடிவமைப்பு தேவைப்படுகிறது. போன்ற கருவிகள் இல்லாமல் fsync அல்லது O_SYNC, Linux கோப்பு முறைமைகள் சீரற்ற நிலைகளில் கோப்புகளை விடலாம். முக்கியமான பயன்பாடுகளுக்கு, முக்கிய கட்டங்களில் எழுதும் சோதனை மற்றும் சுத்தப்படுத்துதல் ஆகியவை அத்தியாவசிய நடைமுறைகளாகும்.
செயலிழப்பின் போது பதிவு கோப்பின் பகுதிகளை இழப்பதை கற்பனை செய்து பாருங்கள். தரவு2 ஊழலைத் தடுக்கும் முன் தரவு1 முழுமையாகச் சேமிக்கப்பட்டிருப்பதை உறுதிசெய்கிறது. கணிக்க முடியாத தோல்விகளில் கூட, சிறந்த நடைமுறைகளைப் பின்பற்றுவது வலுவான தரவு ஒருமைப்பாட்டை உறுதி செய்கிறது. ⚡
மேலும் வாசிப்பு மற்றும் குறிப்புகள்
- லினக்ஸில் கோப்பு முறைமை நீடித்து நிலைத்தன்மை மற்றும் ஜர்னலிங் கருத்துக்கள் பற்றி விரிவாகக் கூறுகிறது: லினக்ஸ் கர்னல் ஆவணப்படுத்தல் - ext4
- POSIX கோப்பு செயல்பாடுகள் பற்றிய விவரங்கள், உட்பட fsync மற்றும் fdatasync: POSIX விவரக்குறிப்பு
- ஜர்னலிங் கோப்பு முறைமைகளில் தரவு நிலைத்தன்மையைப் புரிந்துகொள்வது: ArchWiki - கோப்பு முறைமைகள்