1.1 பகிர்தல் என்றால் என்ன?

நீங்கள் தொடர்ந்து கூகிள் செய்தால், பகிர்வு என்று அழைக்கப்படுவதற்கும் ஷார்டிங் என்று அழைக்கப்படுவதற்கும் இடையில் ஒரு மங்கலான எல்லை இருப்பதாக மாறிவிடும். ஒவ்வொருவரும் தங்களுக்கு என்ன வேண்டுமானாலும், என்ன வேண்டுமானாலும் அழைக்கிறார்கள். சிலர் கிடைமட்ட பகிர்வு மற்றும் ஷார்டிங் ஆகியவற்றை வேறுபடுத்துகிறார்கள். மற்றவர்கள் ஷார்டிங் என்பது ஒரு குறிப்பிட்ட வகையான கிடைமட்ட பகிர்வு என்று கூறுகிறார்கள்.

ஸ்தாபக தந்தைகளால் அங்கீகரிக்கப்பட்ட மற்றும் ISO ஆல் சான்றளிக்கப்பட்ட ஒரு சொற்களஞ்சிய தரநிலையை நான் காணவில்லை. தனிப்பட்ட உள் நம்பிக்கை இது போன்றது: சராசரியாக பிரித்தல் என்பது தன்னிச்சையாக எடுக்கப்பட்ட வழியில் "அடிப்படையை துண்டுகளாக வெட்டுவது".

  • செங்குத்து பகிர்வு - நெடுவரிசை மூலம். எடுத்துக்காட்டாக, 60 நெடுவரிசைகளில் இரண்டு பில்லியன் பதிவுகளைக் கொண்ட ஒரு மாபெரும் அட்டவணை உள்ளது. அத்தகைய ஒரு பெரிய அட்டவணையை வைத்திருப்பதற்குப் பதிலாக, ஒவ்வொன்றும் 2 பில்லியன் பதிவுகள் கொண்ட 60 மாபெரும் அட்டவணைகளை வைத்திருக்கிறோம் - இது ஒரு நெடுவரிசை அடிப்படை அல்ல, ஆனால் செங்குத்து பகிர்வு (சொற்களின் உதாரணம்).
  • கிடைமட்ட பகிர்வு - சேவையகத்தின் உள்ளே இருக்கலாம்.

இங்கே மோசமான தருணம் கிடைமட்ட பகிர்வு மற்றும் ஷார்டிங் இடையே உள்ள நுட்பமான வித்தியாசம். நான் துண்டுகளாக வெட்டப்படலாம், ஆனால் அது என்னவென்று என்னால் உறுதியாகச் சொல்ல முடியாது. ஷார்டிங் மற்றும் கிடைமட்ட பகிர்வு ஆகியவை ஒரே விஷயத்தைப் பற்றியது என்ற உணர்வு உள்ளது.

ஷார்டிங் என்பது பொதுவாக, தரவுத்தளங்களின் அடிப்படையில் ஒரு பெரிய அட்டவணை அல்லது ஆவணங்களின் சார்பு சேகரிப்பு, பொருள்கள், உங்களிடம் தரவுத்தளம் இல்லையென்றால், ஆனால் ஒரு ஆவணக் கடை, பொருள்களால் சரியாக வெட்டப்படும். அதாவது, 2 பில்லியன் பொருட்களிலிருந்து, துண்டுகள் எந்த அளவாக இருந்தாலும் தேர்ந்தெடுக்கப்படுகின்றன. ஒவ்வொரு பொருளின் உள்ளேயும் உள்ள பொருள்கள் துண்டுகளாக வெட்டப்படுவதில்லை, அவற்றை தனித்தனி நெடுவரிசைகளாக இடுவதில்லை, அதாவது, அவற்றை வெவ்வேறு இடங்களில் தொகுதிகளாக இடுகிறோம்.

நுட்பமான சொல் வேறுபாடுகள் உள்ளன. எடுத்துக்காட்டாக, ஒப்பீட்டளவில் பேசினால், போஸ்ட்கிரெஸ் டெவலப்பர்கள் கிடைமட்ட பகிர்வு என்று கூறலாம், முக்கிய அட்டவணை பிரிக்கப்பட்ட அனைத்து அட்டவணைகளும் ஒரே திட்டத்தில் இருக்கும், மேலும் வெவ்வேறு கணினிகளில் இருக்கும்போது, ​​​​இது ஏற்கனவே ஷார்டிங் ஆகும்.

ஒரு பொதுவான அர்த்தத்தில், ஒரு குறிப்பிட்ட தரவுத்தளத்தின் சொற்களஞ்சியம் மற்றும் ஒரு குறிப்பிட்ட தரவு மேலாண்மை அமைப்புடன் பிணைக்கப்படாமல், ஷார்டிங் என்பது வரிக்கு வரி / ஆவணம் மூலம் ஆவணம் மற்றும் பலவற்றை வெட்டுவது என்ற உணர்வு உள்ளது - அவ்வளவுதான்.

நான் வழக்கமான வலியுறுத்துகிறேன். 2 பில்லியன் ஆவணங்களை 20 அட்டவணைகளாக வெட்டுவதற்கு மட்டும் அல்ல, அவை ஒவ்வொன்றும் மிகவும் கையாளக்கூடியதாக இருக்கும், ஆனால் அதை பல கோர்கள், பல வட்டுகள் அல்லது பலவிதமான இயற்பியல் அல்லது மெய்நிகர் சேவையகங்களில் விநியோகிப்பதற்காக இவை அனைத்தையும் செய்கிறோம்.

1.2 பிரிக்க முடியாததை வகுக்கவும்

ஒவ்வொரு துண்டையும் - ஒவ்வொரு தரவுத் துண்டையும் - பல முறை நகலெடுக்கும் வகையில் இதைச் செய்கிறோம் என்பது புரிகிறது. ஆனால் உண்மையில், இல்லை.

INSERT INTO docs00 
SELECT * FROM documents WHERE (id%16)=0 
... 
 
INSERT INTO docs15 
SELECT * FROM documents WHERE (id%16)=15 

உண்மையில், நீங்கள் அத்தகைய தரவுகளை வெட்டினால், உங்கள் வீரம் வாய்ந்த மடிக்கணினியில் MySQL இல் உள்ள ஒரு பெரிய SQL அட்டவணையில் இருந்து, நீங்கள் 16 சிறிய அட்டவணைகளை உருவாக்குவீர்கள், ஒரு மடிக்கணினிக்கு அப்பால் செல்லாமல், ஒரு ஸ்கீமா, ஒரு தரவுத்தளம் போன்றவை இல்லை. . மற்றும் பல. - அவ்வளவுதான், உங்களிடம் ஏற்கனவே பகிர்வு உள்ளது.

இது பின்வருவனவற்றில் விளைகிறது:

  • அலைவரிசை அதிகரிக்கிறது.
  • தாமதம் மாறாது, அதாவது, ஒவ்வொருவரும், இந்த விஷயத்தில் தொழிலாளி அல்லது நுகர்வோர் தனக்குச் சொந்தமாகப் பெறுகிறார்கள். வெவ்வேறு கோரிக்கைகள் ஒரே நேரத்தில் சேவை செய்யப்படுகின்றன.
  • அல்லது இரண்டும், மற்றொன்று, மேலும் அதிக கிடைக்கும் தன்மை (பிரதி).

அலைவரிசை ஏன்? சில சமயங்களில் பொருந்தாத தரவுகளின் தொகுதிகளை நாம் வைத்திருக்கலாம் - எங்கே என்பது தெளிவாகத் தெரியவில்லை, ஆனால் அவை பொருந்தாது - 1 {kernel | வட்டு | சர்வர் | ...}. போதுமான ஆதாரங்கள் இல்லை, அவ்வளவுதான். இந்த பெரிய தரவுத்தொகுப்பில் வேலை செய்ய, நீங்கள் அதை வெட்ட வேண்டும்.

ஏன் தாமதம்? ஒரு மையத்தில், 2 பில்லியன் வரிசைகள் கொண்ட டேபிளை ஸ்கேன் செய்வது, 20 கோர்களில் 20 டேபிள்களை ஸ்கேன் செய்வதை விட 20 மடங்கு மெதுவாக இருக்கும். ஒரு ஆதாரத்தில் தரவு மிகவும் மெதுவாக செயலாக்கப்படுகிறது.

ஏன் அதிக கிடைக்கும்? அல்லது ஒரே நேரத்தில் இரண்டையும் செய்வதற்கு தரவை வெட்டுகிறோம், அதே நேரத்தில் ஒவ்வொரு துண்டின் பல பிரதிகள் - பிரதிபலிப்பு அதிக கிடைப்பதை உறுதி செய்கிறது.

1.3 ஒரு எளிய உதாரணம் "கையால் எப்படி செய்வது"

32 ஆவணங்களுக்கான சோதனை அட்டவணை test.documents ஐப் பயன்படுத்தி நிபந்தனை ஷார்டிங்கை வெட்டலாம், மேலும் இந்த அட்டவணையில் இருந்து 16 சோதனை அட்டவணைகளை உருவாக்கலாம், ஒவ்வொன்றும் test.docs00, 01, 02, ..., 15.

INSERT INTO docs00 
SELECT * FROM documents WHERE (id%16)=0 
... 
 
INSERT INTO docs15 
SELECT * FROM documents WHERE (id%16)=15 

ஏன் பற்றி? ஐடி எவ்வாறு விநியோகிக்கப்படுகிறது என்பது எங்களுக்குத் தெரியாததால், 1 முதல் 32 வரை இருந்தால், ஒவ்வொன்றும் சரியாக 2 ஆவணங்கள் இருக்கும், இல்லையெனில் இல்லை.

அதை ஏன் இங்கே செய்கிறோம். நாம் 16 அட்டவணைகளை உருவாக்கிய பிறகு, நமக்குத் தேவையான 16 ஐ "கிராப்" செய்யலாம். நாம் எதை அடித்தாலும், இந்த வளங்களை இணையாக மாற்றலாம். எடுத்துக்காட்டாக, போதுமான வட்டு இடம் இல்லை என்றால், இந்த அட்டவணைகளை தனி வட்டுகளில் சிதைப்பது அர்த்தமுள்ளதாக இருக்கும்.

இவை அனைத்தும், துரதிர்ஷ்டவசமாக, இலவசம் அல்ல. நியமன SQL தரநிலையின் விஷயத்தில் (நான் நீண்ட காலமாக SQL தரநிலையை மீண்டும் படிக்கவில்லை, ஒருவேளை அது நீண்ட காலமாக புதுப்பிக்கப்படாமல் இருக்கலாம்), எந்த SQL சேவையகத்திற்கும் அதிகாரப்பூர்வ தரப்படுத்தப்பட்ட தொடரியல் இல்லை என்று நான் சந்தேகிக்கிறேன். : "அன்புள்ள SQL சர்வர், என்னை 32 துண்டுகளாக உருவாக்கி அவற்றை 4 வட்டுகளாகப் பிரிக்கவும். ஆனால் தனிப்பட்ட செயலாக்கங்களில், அடிப்படையில் ஒரே காரியத்தைச் செய்வதற்கு ஒரு குறிப்பிட்ட தொடரியல் பெரும்பாலும் உள்ளது. PostgreSQL இல் பகிர்வுக்கான வழிமுறைகள் உள்ளன, MySQL இல் MariaDB உள்ளது, ஆரக்கிள் இதையெல்லாம் நீண்ட காலத்திற்கு முன்பே செய்திருக்கலாம்.

ஆயினும்கூட, தரவுத்தள ஆதரவு இல்லாமல் மற்றும் தரநிலையின் கட்டமைப்பிற்குள் நாங்கள் அதை கைமுறையாகச் செய்தால், தரவு அணுகலின் சிக்கலான தன்மையுடன் நாங்கள் நிபந்தனையுடன் செலுத்துகிறோம் . ஒரு எளிய தேர்வு * ஆவணங்களில் இருந்து எங்கே ஐடி=123, இப்போது 16 x தேர்வு * டாக்ஸ்XX இலிருந்து. மேலும் சாவி மூலம் பதிவை பெற முயற்சித்தால் நல்லது. பதிவுகளின் ஆரம்ப வரம்பைப் பெற முயற்சிக்கிறோம் என்றால் மிகவும் சுவாரஸ்யமானது. இப்போது (நாம், நான் வலியுறுத்துவது, முட்டாள்கள், மற்றும் தரநிலையின் கட்டமைப்பிற்குள் இருந்தால்), இந்த 16 SELECT * FROM இன் முடிவுகள் பயன்பாட்டில் இணைக்கப்பட வேண்டும்.

என்ன செயல்திறன் மாற்றத்தை நீங்கள் எதிர்பார்க்கலாம்?

  • உள்ளுணர்வு - நேரியல்.
  • கோட்பாட்டளவில் - சப்லைனியர், ஏனெனில் அம்டால் சட்டம்.
  • நடைமுறையில், கிட்டத்தட்ட நேரியல், ஒருவேளை இல்லை.

உண்மையில், சரியான பதில் தெரியவில்லை. ஷார்டிங் நுட்பத்தின் புத்திசாலித்தனமான பயன்பாட்டின் மூலம், உங்கள் பயன்பாட்டின் செயல்திறனில் குறிப்பிடத்தக்க சூப்பர்-லீனியர் சிதைவை நீங்கள் அடையலாம், மேலும் DBA கூட சிவப்பு-சூடான போக்கருடன் இயங்கும்.

இதை எப்படி அடையலாம் என்று பார்க்கலாம். அமைப்பை PostgreSQL shards=16 என அமைப்பது, பின்னர் அது தானாகவே வெளியேறுவது சுவாரஸ்யமானது அல்ல என்பது தெளிவாகிறது. ஷார்டிங்கிலிருந்து 16 மடங்கு 32 ஆல் மெதுவாக இருப்பதை எவ்வாறு உறுதிப்படுத்துவது என்பதைப் பற்றி சிந்திப்போம் - இதை எப்படி செய்யக்கூடாது என்ற பார்வையில் இது சுவாரஸ்யமானது.

விரைவுபடுத்த அல்லது மெதுவாக்குவதற்கான எங்கள் முயற்சிகள் எப்பொழுதும் கிளாசிக்ஸில் இயங்கும் - நல்ல பழைய Amdahl சட்டம், எந்த கோரிக்கைக்கும் சரியான இணையாக இல்லை என்று கூறுகிறது, எப்போதும் சில நிலையான பகுதி உள்ளது.

1.4 அம்டால் சட்டம்

எப்போதும் ஒரு தொடர் பாகம் இருக்கும்.

வினவல் செயலாக்கத்தின் ஒரு பகுதி எப்போதும் இணையாக இருக்கும், மேலும் இணையாக இல்லாத ஒரு பகுதி எப்போதும் இருக்கும். ஒரு முழுமையான இணையான வினவல் என்று உங்களுக்குத் தோன்றினாலும், ஒவ்வொரு துண்டிலிருந்தும் பெறப்பட்ட வரிசைகளிலிருந்து கிளையண்டிற்கு நீங்கள் அனுப்பப் போகும் முடிவு வரிசையின் தொகுப்பாவது எப்போதும் இருக்கும், அது எப்போதும் வரிசையாக இருக்கும்.

எப்போதும் சில நிலையான பகுதி உள்ளது. இது சிறியதாக இருக்கலாம், பொதுவான பின்னணிக்கு எதிராக முற்றிலும் கண்ணுக்கு தெரியாததாக இருக்கலாம், அது மிகப்பெரியதாக இருக்கலாம், அதன்படி, இணையாக்கத்தை வலுவாக பாதிக்கும், ஆனால் அது எப்போதும் உள்ளது.

கூடுதலாக, அதன் செல்வாக்கு மாறுகிறது மற்றும் கணிசமாக வளர முடியும், எடுத்துக்காட்டாக, நாங்கள் எங்கள் அட்டவணையை வெட்டினால் - பங்குகளை உயர்த்துவோம் - 64 பதிவுகளிலிருந்து 4 பதிவுகளின் 16 அட்டவணைகளாக, இந்த பகுதி மாறும். நிச்சயமாக, இவ்வளவு பிரம்மாண்டமான தரவுகளின் மூலம் ஆராயும்போது, ​​நாங்கள் மொபைல் ஃபோன் மற்றும் 2 மெகா ஹெர்ட்ஸ் 86 செயலியில் வேலை செய்கிறோம், அதே நேரத்தில் திறந்த நிலையில் வைத்திருக்கக்கூடிய போதுமான கோப்புகள் எங்களிடம் இல்லை. வெளிப்படையாக, அத்தகைய உள்ளீடுகளுடன், ஒரு நேரத்தில் ஒரு கோப்பைத் திறக்கிறோம்.

  • அது மொத்தம் = தொடர் + இணையாக இருந்தது . எடுத்துக்காட்டாக, DB க்குள் உள்ள அனைத்து வேலைகளும் இணையாக இருக்கும், மேலும் தொடர் முடிவை கிளையண்டிற்கு அனுப்புகிறது.
  • மொத்தம்2 = தொடர் + இணை/N + Xserial ஆனது . எடுத்துக்காட்டாக, ஒட்டுமொத்த ஆர்டர் ஆல் Xserial>0.

இந்த எளிய எடுத்துக்காட்டுடன், சில Xserial தோன்றுவதைக் காட்ட முயற்சிக்கிறேன். எப்பொழுதும் ஒரு வரிசைப்படுத்தப்பட்ட பகுதி உள்ளது என்பதோடு, தரவுகளுடன் இணையாகப் பணிபுரிய முயற்சிக்கிறோம் என்பதற்கும் கூடுதலாக, இந்தத் தரவு ஸ்லைசிங்கை வழங்க கூடுதல் பகுதி உள்ளது. தோராயமாக, நமக்கு தேவைப்படலாம்:

  • தரவுத்தளத்தின் அக அகராதியில் இந்த 16 அட்டவணைகளைக் கண்டறியவும்;
  • திறந்த கோப்புகள்;
  • நினைவகத்தை ஒதுக்குங்கள்;
  • நினைவகத்தை ஒதுக்காதே;
  • முடிவுகளை ஒன்றிணைத்தல்;
  • கோர்களுக்கு இடையில் ஒத்திசைக்கவும்.

சில ஒத்திசைவற்ற விளைவுகள் இன்னும் தோன்றும். அவை முக்கியமற்றவை மற்றும் மொத்த நேரத்தின் பில்லியனில் ஒரு பங்கை ஆக்கிரமிக்கலாம், ஆனால் அவை எப்போதும் பூஜ்ஜியமற்றவை மற்றும் எப்போதும் இருக்கும். அவர்களின் உதவியுடன், பகிர்ந்த பிறகு நாம் வியத்தகு முறையில் செயல்திறனை இழக்கலாம்.

இது அம்தாலின் சட்டத்தைப் பற்றிய ஒரு நிலையான படம். இங்கே முக்கியமான விஷயம் என்னவென்றால், கோடுகள் நேராக இருக்க வேண்டும் மற்றும் நேர்கோட்டில் வளர வேண்டும், இது ஒரு அறிகுறியற்றதாக இருக்கும். ஆனால் இணையத்தில் இருந்து வரைபடம் படிக்க முடியாததால், என் கருத்துப்படி, எண்களுடன் கூடிய காட்சி அட்டவணைகளை உருவாக்கினேன்.

கோரிக்கை செயலாக்கத்தின் சில வரிசைப்படுத்தப்பட்ட பகுதி எங்களிடம் உள்ளது, அது 5% மட்டுமே எடுக்கும்: தொடர் = 0.05 = 1/20 .

உள்ளுணர்வாக, கோரிக்கை செயலாக்கத்தில் 1/20 மட்டுமே எடுக்கும் வரிசைப்படுத்தப்பட்ட பகுதியுடன், 20 கோர்களுக்கு கோரிக்கை செயலாக்கத்தை இணைத்தால், அது சுமார் 20 ஆக மாறும், மோசமான நிலையில் 18, மடங்கு வேகமாக இருக்கும்.

உண்மையில், கணிதம் ஒரு இதயமற்ற விஷயம் :

சுவர் = 0.05 + 0.95/num_cores, வேகம் = 1 / (0.05 + 0.95/num_cores)

நீங்கள் கவனமாகக் கணக்கிட்டால், 5% வரிசைப்படுத்தப்பட்ட பகுதியுடன், வேகமானது 10 மடங்கு (10.3) இருக்கும், இது கோட்பாட்டு இலட்சியத்துடன் ஒப்பிடும்போது 51% ஆகும்.

8 கோர்கள் = 5.9 = 74%
10 கோர்கள் = 6.9 = 69%
20 கோர்கள் = 10.3 = 51%
40 கோர்கள் = 13.6 = 34%
128 கோர்கள் = 17.4 = 14%

ஒருவர் பணிபுரியும் பணிக்காக 20 கோர்களை (20 வட்டுகள், நீங்கள் விரும்பினால்) பயன்படுத்தியதால், கோட்பாட்டளவில் 20 மடங்குக்கு மேல் முடுக்கம் கூட பெற மாட்டோம், ஆனால் நடைமுறையில் - மிகக் குறைவு. மேலும், இணைகளின் எண்ணிக்கையில் அதிகரிப்புடன், திறமையின்மை பெரிதும் அதிகரிக்கிறது.

வரிசைப்படுத்தப்பட்ட வேலைகளில் 1% மட்டுமே எஞ்சியிருக்கும்போது, ​​99% இணையாக இருக்கும்போது, ​​வேக மதிப்புகள் ஓரளவு மேம்படுகின்றன:

8 கோர்கள் = 7.5 = 93%
16 கோர்கள் = 13.9 = 87%
32 கோர்கள் = 24.4 = 76%
64 கோர்கள் = 39.3 = 61%

ஒரு முழுமையான தெர்மோநியூக்ளியர் வினவலுக்கு, இயற்கையாகவே முடிவடைய மணிநேரம் ஆகும், மற்றும் ஆயத்த வேலைகள் மற்றும் முடிவின் அசெம்பிளி மிகக் குறைந்த நேரத்தை எடுக்கும் (தொடர் = 0.001), நாங்கள் ஏற்கனவே நல்ல செயல்திறனைக் காண்போம்:

8 கோர்கள் = 7.94 = 99%
16 கோர்கள் = 15.76 = 99%
32 கோர்கள் = 31.04 = 97%
64 கோர்கள் = 60.20 = 94%

நாங்கள் 100% பார்க்க மாட்டோம் என்பதை நினைவில் கொள்ளவும் . குறிப்பாக நல்ல சந்தர்ப்பங்களில், நீங்கள் பார்க்க முடியும், எடுத்துக்காட்டாக, 99.999%, ஆனால் சரியாக 100% இல்லை.