Apache Ignite හි දත්ත සම්පීඩනය. Sber ගේ අත්දැකීම

Apache Ignite හි දත්ත සම්පීඩනය. Sber ගේ අත්දැකීමවිශාල දත්ත පරිමාවක් සමඟ වැඩ කරන විට, තැටි ඉඩ නොමැතිකම පිළිබඳ ගැටළුව සමහර විට පැන නැගිය හැක. මෙම ගැටළුව විසඳීමට එක් ක්රමයක් වන්නේ සම්පීඩනයයි, එම උපකරණ මත, ගබඩා පරිමාව වැඩි කිරීමට ඔබට හැකි වේ. මෙම ලිපියෙන් අපි Apache Ignite හි දත්ත සම්පීඩනය ක්‍රියා කරන ආකාරය දෙස බලමු. මෙම ලිපිය විස්තර කරනුයේ නිෂ්පාදිතය තුළ ක්‍රියාත්මක කරන ලද තැටි සම්පීඩන ක්‍රම පමණි. දත්ත සම්පීඩනය කිරීමේ වෙනත් ක්‍රම (ජාලය හරහා, මතකයේ), ක්‍රියාත්මක කළත් නැතත්, විෂය පථයෙන් පිටත පවතිනු ඇත.

එබැවින්, ස්ථීර මාදිලිය සක්‍රීය කර ඇති අතර, හැඹිලිවල දත්තවල වෙනස්වීම් හේතුවෙන්, Ignite තැටියට ලිවීමට පටන් ගනී:

  1. හැඹිලිවල අන්තර්ගතය
  2. ඉදිරි ලොගය ලියන්න (මෙතැන් සිට සරලව WAL)

WAL සම්පීඩනය සඳහා යාන්ත්‍රණයක් දැන් සෑහෙන කාලයක් තිස්සේ පවතී, එය WAL සංයුක්ත ලෙස හැඳින්වේ. මෑතකදී නිකුත් කරන ලද Apache Ignite 2.8 මඟින් ඔබට තැටියේ දත්ත සම්පීඩනය කිරීමට ඉඩ සලසන තවත් යාන්ත්‍රණ දෙකක් හඳුන්වා දෙන ලදී: හැඹිලිවල අන්තර්ගතය සම්පීඩනය කිරීම සඳහා තැටි පිටු සම්පීඩනය සහ සමහර WAL ඇතුළත් කිරීම් සම්පීඩනය සඳහා WAL පිටු ස්නැප්ෂොට් සම්පීඩනය. මෙම යාන්ත්‍රණ තුනම පිළිබඳ වැඩි විස්තර පහතින්.

තැටි පිටු සම්පීඩනය

කොහොමද මේ වැඩ කරන්නේ

පළමුව, Ignite දත්ත ගබඩා කරන්නේ කෙසේදැයි ඉතා කෙටියෙන් බලමු. ගබඩා කිරීම සඳහා පිටු මතකය භාවිතා වේ. පිටු ප්‍රමාණය නෝඩයේ ආරම්භයේදී සකසා ඇති අතර පසු අවස්ථා වලදී වෙනස් කළ නොහැක; තවද, පිටු ප්‍රමාණය ගොනු පද්ධති වාරණ ප්‍රමාණයෙන් දෙකක බලයක් සහ ගුණාකාරයක් විය යුතුය. අවශ්‍ය පරිදි පිටු තැටියෙන් RAM වෙත පටවනු ලැබේ; තැටියේ ඇති දත්තවල ප්‍රමාණය වෙන් කළ RAM ප්‍රමාණය ඉක්මවිය හැක. තැටියෙන් පිටුවක් පැටවීමට RAM හි ප්‍රමාණවත් ඉඩක් නොමැති නම්, පැරණි, තවදුරටත් භාවිතා නොකරන පිටු RAM වෙතින් ඉවත් කරනු ලැබේ.

පහත දැක්වෙන ආකාරයෙන් දත්ත තැටියේ ගබඩා කර ඇත: එක් එක් හැඹිලි සමූහයේ එක් එක් කොටස සඳහා වෙනම ගොනුවක් සාදනු ලැබේ; මෙම ගොනුවේ, පිටු එකින් එක ආරෝහණ දර්ශක අනුපිළිවෙලින් දිස්වේ. සම්පූර්ණ පිටු හඳුනාගැනීමේ ගොනුවේ හැඹිලි කණ්ඩායම් හඳුනාගැනීම, කොටස් අංකය සහ පිටු දර්ශකය අඩංගු වේ. මේ අනුව, සම්පූර්ණ පිටු හැඳුනුම්කාරකය භාවිතයෙන්, අපට එක් එක් පිටුව සඳහා ගොනුවේ ඇති ගොනුව සහ ඕෆ්සෙට් එක අනන්‍යව තීරණය කළ හැක. Apache Ignite Wiki ලිපියෙන් ඔබට පේජිං මතකය පිළිබඳ වැඩිදුර කියවිය හැක: නොනැසී පවතින ගබඩාව දැල්වීම - ආවරණය යටතේ.

තැටි පිටු සම්පීඩන යාන්ත්‍රණය, ඔබ නමෙන් අනුමාන කළ හැකි පරිදි, පිටු මට්ටමින් ක්‍රියා කරයි. මෙම යාන්ත්‍රණය සක්‍රීය කර ඇති විට, කිසිදු සම්පීඩනයකින් තොරව RAM හි දත්ත සකසනු ලැබේ, නමුත් පිටු RAM සිට තැටියට සුරකින විට ඒවා සම්පීඩනය වේ.

නමුත් එක් එක් පිටුව තනි තනිව සම්පීඩනය කිරීම ගැටළුවට විසඳුමක් නොවේ; ඔබට කෙසේ හෝ ලැබෙන දත්ත ගොනු වල ප්‍රමාණය අඩු කළ යුතුය. පිටු ප්‍රමාණය තවදුරටත් සවි කර නොමැති නම්, අපට තවදුරටත් ගොනුවට පිටු එකින් එක ලිවිය නොහැක, මන්ද මෙය ගැටළු ගණනාවක් ඇති කළ හැකිය:

  • පිටු දර්ශකය භාවිතා කරමින්, එය ගොනුවේ පිහිටා ඇති ඕෆ්සෙට් ගණනය කිරීමට අපට නොහැකි වනු ඇත.
  • ගොනුවේ අවසානයේ නැති පිටු සහ ඒවායේ ප්‍රමාණය වෙනස් කළ යුත්තේ කුමක් දැයි පැහැදිලි නැත. පිටු ප්‍රමාණය අඩු වුවහොත්, එය නිදහස් කළ ඉඩ අතුරුදහන් වේ. පිටු ප්‍රමාණය වැඩි වුවහොත්, ඔබ ඒ සඳහා ගොනුවේ නව ස්ථානයක් සෙවිය යුතුය.
  • ගොනු පද්ධති වාරණ ප්‍රමාණයෙන් ගුණාකාරයක් නොවන බයිට් ගණනකින් පිටුවක් චලනය වන්නේ නම්, එය කියවීමට හෝ ලිවීමට තවත් ගොනු පද්ධති බ්ලොක් එකක් ස්පර්ශ කිරීමට අවශ්‍ය වනු ඇත, එය කාර්ය සාධනය පිරිහීමට තුඩු දිය හැකිය.

මෙම ගැටළු ස්වකීය මට්ටමින් විසඳීම වළක්වා ගැනීම සඳහා, Apache Ignite හි තැටි පිටු සම්පීඩනය විරල ගොනු ලෙස හැඳින්වෙන ගොනු පද්ධති යාන්ත්‍රණයක් භාවිතා කරයි. විරල ගොනුවක් යනු සමහර ශුන්‍ය පිරවූ කලාප "සිදුරු" ලෙස සලකුණු කළ හැකි එකකි. මෙම අවස්ථාවෙහිදී, මෙම සිදුරු ගබඩා කිරීම සඳහා ගොනු පද්ධති බ්ලොක් වෙන් නොකෙරේ, තැටි ඉඩ ඉතිරි වේ.

ගොනු පද්ධති බ්ලොක් එකක් නිදහස් කිරීම සඳහා, සිදුරෙහි විශාලත්වය ගොනු පද්ධති බ්ලොක් එකට වඩා වැඩි හෝ සමාන විය යුතු බව තර්කානුකූලයි, එය පිටු ප්‍රමාණයට අමතර සීමාවක් පනවයි සහ Apache Ignite: සම්පීඩනයට කිසියම් බලපෑමක් ඇති කිරීමට, පිටු ප්‍රමාණය ගොනු පද්ධති බ්ලොක් එකේ ප්‍රමාණයට වඩා විශාල විය යුතුය . පිටු ප්‍රමාණය බ්ලොක් ප්‍රමාණයට සමාන නම්, අපට කිසිදා තනි බ්ලොක් එකක් නිදහස් කිරීමට නොහැකි වනු ඇත, මන්ද තනි බ්ලොක් එකක් නිදහස් කිරීමට නම්, සම්පීඩිත පිටුව බයිට් 0 ක් තිබිය යුතුය. පිටු ප්‍රමාණය බ්ලොක් 2 හෝ 4 ප්‍රමාණයට සමාන නම්, අපගේ පිටුව පිළිවෙලින් අවම වශයෙන් 50% හෝ 75% දක්වා සම්පීඩනය කර ඇත්නම්, අවම වශයෙන් එක් වාරණයක් හෝ නිදහස් කිරීමට අපට දැනටමත් හැකි වනු ඇත.

මේ අනුව, යාන්ත්රණය ක්රියා කරන ආකාරය පිළිබඳ අවසන් විස්තරය: තැටියට පිටුවක් ලියන විට, පිටුව සම්පීඩනය කිරීමට උත්සාහයක් දරයි. සම්පීඩිත පිටුවේ ප්‍රමාණය ගොනු පද්ධති බ්ලොක් එකක් හෝ කිහිපයක් නිදහස් කිරීමට ඉඩ දෙන්නේ නම්, පිටුව සම්පීඩිත ආකාරයෙන් ලියා ඇති අතර නිදහස් කළ කුට්ටි වෙනුවට “සිදුරක්” සාදනු ලැබේ (පද්ධති ඇමතුමක් ක්‍රියාත්මක වේ. fallocate() පන්ච් සිදුරු ධජය සමඟ). සම්පීඩිත පිටුවේ ප්‍රමාණය බ්ලොක් නිදහස් කිරීමට ඉඩ නොදෙන්නේ නම්, පිටුව සම්පීඩනය නොකළ පරිදි සුරැකේ. පිටු ප්‍රමාණයෙන් පිටු දර්ශකය ගුණ කිරීමෙන් සියලුම පිටු ඕෆ්සෙට් සම්පීඩනයකින් තොරව ගණනය කරනු ලැබේ. ඔබ විසින්ම පිටු නැවත ස්ථානගත කිරීමක් අවශ්‍ය නොවේ. පිටු ඕෆ්සෙට්, සම්පීඩනය නොමැතිව මෙන්, ගොනු පද්ධති බ්ලොක් වල මායිම් මත වැටේ.

Apache Ignite හි දත්ත සම්පීඩනය. Sber ගේ අත්දැකීම

දැනට ක්‍රියාත්මක කිරීමේදී, Ignite හට Linux OS යටතේ විරල ගොනු සමඟ පමණක් ක්‍රියා කළ හැක; ඒ අනුව, මෙම මෙහෙයුම් පද්ධතියේ Ignite භාවිතා කරන විට පමණක් තැටි පිටු සම්පීඩනය සක්‍රීය කළ හැක.

තැටි පිටු සම්පීඩනය සඳහා භාවිතා කළ හැකි සම්පීඩන ඇල්ගොරිතම: ZSTD, LZ4, Snappy. මීට අමතරව, මෙහෙයුම් මාදිලියක් (SKIP_GARBAGE) ඇත, ඉතිරි දත්ත මත සම්පීඩනය යෙදීමෙන් තොරව පිටුවේ භාවිතා නොකළ ඉඩ පමණක් ඉවතට දමනු ලැබේ, එය කලින් ලැයිස්තුගත කර ඇති ඇල්ගොරිතමවලට සාපේක්ෂව CPU මත පැටවීම අඩු කරයි.

කාර්ය සාධන බලපෑම

අවාසනාවකට මෙන්, මම මෙම යාන්ත්‍රණය නිෂ්පාදනයේදී භාවිතා කිරීමට අදහස් නොකරන බැවින්, මම සැබෑ කාර්ය සාධන මිනුම් සිදු කළේ නැත, නමුත් අපට න්‍යායාත්මකව අප පරාජය වන්නේ කොතැනද සහ අප ජය ගන්නේ කොතැනද යන්න අනුමාන කළ හැකිය.

මෙය සිදු කිරීම සඳහා, පිවිසෙන විට පිටු කියවන සහ ලියන ආකාරය අප මතක තබා ගත යුතුය:

  • කියවීමේ මෙහෙයුමක් සිදු කරන විට, එය මුලින්ම RAM වලින් සොයනු ලැබේ; සෙවීම අසාර්ථක නම්, එම පිටුව කියවීම සිදු කරන එම නූල් මඟින් තැටියෙන් RAM වෙත පටවනු ලැබේ.
  • ලිවීමේ මෙහෙයුමක් සිදු කරන විට, RAM හි ඇති පිටුව අපිරිසිදු ලෙස සලකුණු කර ඇත, නමුත් ලිවීම සිදු කරන නූල් මඟින් පිටුව භෞතිකව තැටියට වහාම සුරැකෙන්නේ නැත. සියලුම අපිරිසිදු පිටු වෙනම නූල් වල චෙක්පොයින්ට් ක්‍රියාවලියේදී පසුව තැටියට සුරකිනු ලැබේ.

එබැවින් කියවීමේ මෙහෙයුම් කෙරෙහි ඇති බලපෑම:

  • ධනාත්මක (තැටි IO), කියවීමේ ගොනු පද්ධති වාරණ ගණන අඩු වීම හේතුවෙන්.
  • සෘණ (CPU), විරල ගොනු සමඟ වැඩ කිරීමට මෙහෙයුම් පද්ධතියට අවශ්ය අමතර බරක් හේතුවෙන්. වඩාත් සංකීර්ණ විරල ගොනු ව්‍යුහයක් සුරැකීමට අමතර IO මෙහෙයුම් ව්‍යංගයෙන් මෙහි දිස්වනු ඇත (අවාසනාවකට මෙන්, විරල ගොනු ක්‍රියා කරන ආකාරය පිළිබඳ සියලු විස්තර මට හුරු නැත).
  • සෘණ (CPU), පිටු විසන්ධි කිරීමේ අවශ්‍යතාවය හේතුවෙන්.
  • ලිවීමේ මෙහෙයුම් වලට බලපෑමක් නැත.
  • මුරපොල ක්‍රියාවලියට බලපෑම (මෙහි ඇති සියල්ල කියවීමේ මෙහෙයුම් වලට සමාන වේ):
  • ධනාත්මක (තැටි IO), ලිඛිත ගොනු පද්ධති වාරණ ගණන අඩු වීම හේතුවෙන්.
  • සෘණ (CPU, සමහරවිට තැටි IO), විරල ගොනු සමඟ වැඩ කිරීම හේතුවෙන්.
  • සෘණ (CPU), පිටු සම්පීඩනය සඳහා අවශ්යතාවය හේතුවෙන්.

පරිමාණයේ කුමන පැත්ත පරිමාණය ඉඟි කරයිද? මේ සියල්ල බොහෝ දුරට පරිසරය මත රඳා පවතී, නමුත් තැටි පිටු සම්පීඩනය බොහෝ පද්ධතිවල කාර්ය සාධනය පිරිහීමට තුඩු දෙනු ඇතැයි මම විශ්වාස කරමි. එපමනක් නොව, විරල ගොනු සමඟ සමාන ප්‍රවේශයක් භාවිතා කරන අනෙකුත් DBMS වල පරීක්ෂණ සම්පීඩනය සක්‍රීය කර ඇති විට කාර්ය සාධනයේ පහත වැටීමක් පෙන්නුම් කරයි.

සක්රිය කර මානකරන ආකාරය

ඉහත සඳහන් කළ පරිදි, තැටි පිටු සම්පීඩනය සඳහා සහය දක්වන Apache Ignite හි අවම අනුවාදය 2.8 වන අතර Linux මෙහෙයුම් පද්ධතිය පමණක් සහය දක්වයි. පහත පරිදි සක්රිය කර වින්යාස කරන්න:

  • class-path හි ignite-compression module එකක් තිබිය යුතුය. පෙරනිමියෙන්, එය Libs/විකල්ප නාමාවලියෙහි Apache Ignite බෙදාහැරීමේ පිහිටා ඇති අතර එය class-path හි ඇතුළත් නොවේ. ඔබට නාමාවලිය ලිබ්ස් වෙත එක් මට්ටමකට ගෙන යා හැකි අතර පසුව ඔබ එය ignite.sh හරහා ධාවනය කරන විට එය ස්වයංක්‍රීයව සක්‍රීය වේ.
  • ස්ථීරභාවය සක්‍රීය කළ යුතුය (හරහා සක්‍රීය කර ඇත DataRegionConfiguration.setPersistenceEnabled(true)).
  • පිටු ප්‍රමාණය ගොනු පද්ධති වාරණ ප්‍රමාණයට වඩා විශාල විය යුතුය (ඔබට එය භාවිතයෙන් සැකසිය හැක DataStorageConfiguration.setPageSize() ).
  • දත්ත සම්පීඩනය කිරීමට අවශ්‍ය සෑම හැඹිලියක් සඳහාම, ඔබ සම්පීඩන ක්‍රමය සහ (විකල්ප ලෙස) සම්පීඩන මට්ටම (ක්‍රම) වින්‍යාසගත කළ යුතුය. CacheConfiguration.setDiskPageCompression() , CacheConfiguration.setDiskPageCompressionLevel()).

WAL සංයුක්ත කිරීම

කොහොමද මේ වැඩ කරන්නේ

WAL යනු කුමක්ද සහ එය අවශ්ය වන්නේ ඇයි? ඉතා කෙටියෙන්: මෙය පිටු ආචයනය අවසානයේ වෙනස් කරන සියලුම සිදුවීම් අඩංගු ලොගයකි. එය මූලික වශයෙන් අවශ්‍ය වන්නේ වැටීමකදී යථා තත්ත්වයට පත්වීමට හැකි වීමයි. ඕනෑම මෙහෙයුමක්, පරිශීලකයාට පාලනය ලබා දීමට පෙර, පළමුව, WAL හි සිදුවීමක් වාර්තා කළ යුතුය, එවිට අසාර්ථක වූ විට, එය නැවත ලොගයේ වාදනය කළ හැකි අතර, මෙම මෙහෙයුම් සිදු වුවද, පරිශීලකයාට සාර්ථක ප්‍රතිචාරයක් ලැබුණු සියලුම මෙහෙයුම් ප්‍රතිස්ථාපනය කළ හැකිය. තැටියේ පිටු ආචයනය තුළ පරාවර්තනය වීමට කාලය නොතිබුණි (දැනටමත් ඉහත විස්තර කර ඇත්තේ පිටු ගබඩාවට සත්‍ය ලිවීම "පරීක්ෂා කිරීම" නම් ක්‍රියාවලියකින් වෙනම නූල් මගින් යම් ප්‍රමාදයකින් සිදු වන බවයි).

WAL හි ඇතුළත් කිරීම් තාර්කික හා භෞතික වශයෙන් බෙදා ඇත. බූලියන් ඒවා යතුරු සහ අගයන් වේ. භෞතික - පිටු ගබඩාවේ පිටු වල වෙනස්කම් පිළිබිඹු කරයි. තාර්කික වාර්තා වෙනත් සමහර අවස්ථා සඳහා ප්‍රයෝජනවත් විය හැකි අතර, භෞතික වාර්තා අවශ්‍ය වන්නේ බිඳ වැටීමකදී ප්‍රතිසාධනය සඳහා පමණක් වන අතර වාර්තා අවශ්‍ය වන්නේ අවසාන සාර්ථක මුරපොලේ සිට පමණි. මෙන්න අපි විස්තරාත්මකව ගොස් එය මේ ආකාරයෙන් ක්‍රියා කරන්නේ මන්දැයි පැහැදිලි නොකරමු, නමුත් උනන්දුවක් දක්වන අයට Apache Ignite Wiki හි දැනටමත් සඳහන් කර ඇති ලිපිය වෙත යොමු විය හැකිය: නොනැසී පවතින ගබඩාව දැල්වීම - ආවරණය යටතේ.

තාර්කික වාර්තාවකට බොහෝ විට භෞතික වාර්තා කිහිපයක් තිබේ. එනම්, උදාහරණයක් ලෙස, හැඹිලිය තුළට එක් මෙහෙයුමක් පිටු මතකයේ පිටු කිහිපයකට බලපායි (දත්ත සහිත පිටුවක්, දර්ශක සහිත පිටු, නිදහස් ලැයිස්තු සහිත පිටු). සමහර කෘතිම පරීක්ෂණ වලදී, භෞතික වාර්තා WAL ගොනුවෙන් 90% දක්වා අල්ලාගෙන ඇති බව මට පෙනී ගියේය. කෙසේ වෙතත්, ඒවා ඉතා කෙටි කාලයක් සඳහා අවශ්ය වේ (පෙරනිමියෙන්, මුරපොලවල් අතර පරතරය විනාඩි 3 කි). මෙම දත්ත එහි අදාළත්වය නැතිවීමෙන් පසු ඉවත් කිරීම තාර්කික වනු ඇත. WAL සංයුක්ත යාන්ත්‍රණය හරියටම කරන්නේ මෙයයි: එය භෞතික වාර්තා ඉවත් කර zip භාවිතයෙන් ඉතිරි තාර්කික වාර්තා සම්පීඩනය කරයි, ගොනු ප්‍රමාණය ඉතා සැලකිය යුතු ලෙස අඩු වේ (සමහර විට දස ගුණයකින්).

භෞතිකව, WAL ස්ථාවර ප්‍රමාණයේ (පෙරනිමියෙන් 10MB) කොටස් කිහිපයකින් (පෙරනිමියෙන් 64) සමන්විත වේ, ඒවා චක්‍රලේඛයක් ලෙස උඩින් ලියයි. වත්මන් කොටස පිරවූ වහාම, ඊළඟ කොටස ධාරාව ලෙස පවරනු ලබන අතර, පිරවූ කොටස වෙනම නූලකින් ලේඛනාගාරයට පිටපත් කරනු ලැබේ. WAL සංයුක්ත දැනටමත් සංරක්ෂිත කොටස් සමඟ ක්‍රියා කරයි. එසේම, වෙනම නූලක් ලෙස, එය මුරපොල ක්‍රියාත්මක කිරීම නිරීක්ෂණය කරන අතර භෞතික වාර්තා තවදුරටත් අවශ්‍ය නොවන සංරක්ෂිත කොටස්වල සම්පීඩනය ආරම්භ කරයි.

Apache Ignite හි දත්ත සම්පීඩනය. Sber ගේ අත්දැකීම

කාර්ය සාධන බලපෑම

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 වෙතින් භෞතික වාර්තා කියවීම සිදු වන්නේ එක් වරක් පමණි, මේ මොහොතේ වැටීමෙන් පසු නෝඩය ඉහළ නංවා ඇත (සහ එය මුරපොලකදී වැටෙන්නේ නම් පමණි).

මෙය පහත ආකාරයට දත්ත වෙනස් කරන නූල් වලට බලපායි: තැටියට ලිවීමට පෙර සෑම අවස්ථාවකම පිටුව සම්පීඩනය කිරීමේ අවශ්‍යතාවය නිසා අපට negative ණාත්මක බලපෑමක් (CPU) සහ ප්‍රමාණය අඩු වීම නිසා ධනාත්මක බලපෑමක් (තැටි IO) ලැබේ. දත්ත ලියා ඇත. ඒ අනුව, මෙහි සෑම දෙයක්ම සරලයි: පද්ධති කාර්ය සාධනය CPU මගින් සීමා කර ඇත්නම්, අපට සුළු පිරිහීමක් ලැබේ, එය තැටිය I / O මගින් සීමා කර ඇත්නම්, අපට වැඩි වීමක් ලැබේ.

වක්‍රව, WAL ප්‍රමාණය අඩු කිරීම WAL කොටස් ලේඛනාගාරයට සහ WAL සංයුක්ත ප්‍රවාහවලට දමන (ධනාත්මක) ප්‍රවාහවලට ද බලපායි.

කෘතිම දත්ත භාවිතයෙන් අපගේ පරිසරයේ සැබෑ කාර්ය සාධන පරීක්ෂණ සුළු වැඩි වීමක් පෙන්නුම් කළේය (throughput 10%-15% කින් වැඩි විය, ප්‍රමාදය 10%-15% කින් අඩු විය).

සක්රිය කර මානකරන ආකාරය

අවම Apache Ignite අනුවාදය: 2.8. පහත පරිදි සක්රිය කර වින්යාස කරන්න:

  • class-path හි ignite-compression module එකක් තිබිය යුතුය. පෙරනිමියෙන්, එය Libs/විකල්ප නාමාවලියෙහි Apache Ignite බෙදාහැරීමේ පිහිටා ඇති අතර එය class-path හි ඇතුළත් නොවේ. ඔබට නාමාවලිය ලිබ්ස් වෙත එක් මට්ටමකට ගෙන යා හැකි අතර පසුව ඔබ එය ignite.sh හරහා ධාවනය කරන විට එය ස්වයංක්‍රීයව සක්‍රීය වේ.
  • ස්ථීරභාවය සක්‍රීය කළ යුතුය (හරහා සක්‍රීය කර ඇත DataRegionConfiguration.setPersistenceEnabled(true)).
  • ක්‍රමය භාවිතයෙන් සම්පීඩන මාදිලිය සැකසිය යුතුය DataStorageConfiguration.setWalPageCompression(), සම්පීඩනය පෙරනිමියෙන් අබල කර ඇත (DISABLED මාදිලිය).
  • විකල්පයක් ලෙස, ඔබට ක්‍රමය භාවිතා කර සම්පීඩන මට්ටම සැකසිය හැක DataStorageConfiguration.setWalPageCompression(), එක් එක් මාදිලිය සඳහා වලංගු අගයන් සඳහා ක්‍රමය සඳහා javadoc බලන්න.

නිගමනය

Apache Ignite හි සලකා බලන දත්ත සම්පීඩන යාන්ත්‍රණයන් එකිනෙකින් ස්වාධීනව භාවිතා කළ හැකි නමුත් ඒවායේ ඕනෑම සංයෝජනයක් ද පිළිගත හැකිය. ඒවා ක්‍රියා කරන ආකාරය අවබෝධ කර ගැනීමෙන් ඔබේ පරිසරය තුළ ඔබේ කාර්යයන් සඳහා ඒවා කෙතරම් යෝග්‍යද යන්න සහ ඒවා භාවිතා කිරීමේදී ඔබට කැප කිරීමට සිදු වන්නේ කුමක්ද යන්න තීරණය කිරීමට ඔබට ඉඩ සලසයි. තැටි පිටු සම්පීඩනය ප්‍රධාන ගබඩාව සම්පීඩනය කිරීමට නිර්මාණය කර ඇති අතර මධ්‍යම සම්පීඩන අනුපාතයක් ලබා දිය හැක. WAL පිටු ස්නැප්ෂොට් සම්පීඩනය WAL ගොනු සඳහා සාමාන්‍ය සම්පීඩන උපාධියක් ලබා දෙනු ඇති අතර බොහෝ දුරට ක්‍රියාකාරීත්වය වැඩි දියුණු කරයි. WAL සංයුක්ත කිරීම කාර්ය සාධනය කෙරෙහි ධනාත්මක බලපෑමක් ඇති නොකරනු ඇත, නමුත් භෞතික වාර්තා ඉවත් කිරීමෙන් හැකි තරම් WAL ගොනු ප්රමාණය අඩු කරනු ඇත.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න