ජාවා සංවර්ධකයෙකුගේ ඇස් හරහා PostgreSQL හි දර්ශකවල සෞඛ්‍යය

හායි

මගේ නම වන්යා සහ මම ජාවා සංවර්ධකයෙක්. මම PostgreSQL සමඟ ගොඩක් වැඩ කරනවා - දත්ත සමුදාය සැකසීම, ව්‍යුහය ප්‍රශස්ත කිරීම, කාර්ය සාධනය සහ සති අන්තයේ DBA ටිකක් වාදනය කිරීම.

මෑතකදි මම අපේ microservices වල Database කිහිපයක් පිළිවෙලට කරලා java library එකක් ලිව්වා pg-දර්ශකය-සෞඛ්‍යය, මෙම කාර්යය පහසු කරයි, මගේ කාලය ඉතිරි කරයි සහ සංවර්ධකයින් විසින් කරන ලද සමහර පොදු වැරදි වළක්වා ගැනීමට මට උපකාර කරයි. අද අපි කතා කරන්නේ මෙම පුස්තකාලය ගැන ය.

ජාවා සංවර්ධකයෙකුගේ ඇස් හරහා PostgreSQL හි දර්ශකවල සෞඛ්‍යය

වගකීමෙන් යුතුව ඔබ එවන

මම වැඩ කරන PostgreSQL හි ප්‍රධාන අනුවාදය 10 වේ. මා භාවිතා කරන සියලුම SQL විමසුම් 11 අනුවාදයේ ද පරීක්‍ෂා කෙරේ. අවම සහය දක්වන අනුවාදය 9.6 වේ.

මුදලටය

ඒ සියල්ල ආරම්භ වූයේ වසරකට පමණ පෙර මට අමුතු තත්වයක් සමඟිනි: නිල් පැහැයෙන් දර්ශකයක් තරඟකාරී ලෙස නිර්මාණය කිරීම දෝෂයකින් අවසන් විය. දර්ශකයම, සුපුරුදු පරිදි, වලංගු නොවන තත්වයක දත්ත ගබඩාවේ පැවතුනි. ලොග් විශ්ලේෂණය හිඟයක් පෙන්නුම් කළේය temp_file_limit. අපි යමු.

ගැටළුව එක - පෙරනිමි වින්යාසය

කෝපි සාදන්නෙකු මත ධාවනය කළ හැකි Postgres පිළිබඳ රූපකයෙන් බොහෝ විට සෑම දෙනාම වෙහෙසට පත්ව ඇත, නමුත් ... පෙරනිමි වින්‍යාසය සැබවින්ම ප්‍රශ්න ගණනාවක් මතු කරයි. අවම වශයෙන්, එය අවධානය යොමු කිරීම වටී නඩත්තු_වැඩ_mem, temp_file_limit, ප්රකාශය_කාලය අවසන් වීම и lock_timeout.

අපේ නඩුවේ නඩත්තු_වැඩ_mem පෙරනිමිය 64 MB විය, සහ temp_file_limit 2 GB පමණ දෙයක් - විශාල වගුවක් මත දර්ශකයක් සෑදීමට අපට ප්‍රමාණවත් මතකයක් නොතිබුණි.

එබැවින්, තුළ pg-දර්ශකය-සෞඛ්‍යය මම මාලාවක් එකතු කළා යතුර, මගේ මතය අනුව, එක් එක් දත්ත සමුදාය සඳහා වින්‍යාසගත කළ යුතු පරාමිති.

ගැටලුව දෙක - අනුපිටපත් දර්ශක

අපගේ දත්ත සමුදායන් SSD ධාවකයන් මත සජීවී වන අතර අපි භාවිතා කරමු HAබහු දත්ත මධ්‍යස්ථාන සමඟ වින්‍යාස කිරීම, ප්‍රධාන සත්කාරක සහ n- අනුපිටපත් ගණන. තැටි අවකාශය අපට ඉතා වටිනා සම්පතකි; එය කාර්ය සාධනය සහ CPU පරිභෝජනයට වඩා අඩු වැදගත්කමක් නැත. එමනිසා, එක් අතකින්, අපට වේගයෙන් කියවීම සඳහා දර්ශක අවශ්‍ය වන අතර, අනෙක් අතට, දත්ත ගබඩාවේ අනවශ්‍ය දර්ශක දැකීමට අපට අවශ්‍ය නැත, මන්ද ඒවා අවකාශය අනුභව කරන අතර දත්ත යාවත්කාලීන කිරීම මන්දගාමී කරයි.

දැන්, සියල්ල යථා තත්ත්වයට පත් කර ඇත වලංගු නොවන දර්ශක සහ ප්රමාණවත් තරම් දැක ඇති Oleg Bartunov විසින් වාර්තා කරන ලදී, මම "මහා" පවිත්ර කිරීමක් සංවිධානය කිරීමට තීරණය කළා. සංවර්ධකයින් දත්ත සමුදා ලේඛන කියවීමට අකමැති බව පෙනී ගියේය. ඔවුන් එයට එතරම් කැමති නැත. මේ නිසා, සාමාන්‍ය දෝෂ දෙකක් පැන නගී - ප්‍රාථමික යතුරක් මත අතින් සාදන ලද දර්ශකයක් සහ අද්විතීය තීරුවක සමාන "අතින්" දර්ශකයක්. කාරණය නම් ඒවා අවශ්‍ය නොවන බවයි - Postgres සෑම දෙයක්ම තනිවම කරනු ඇත. එවැනි දර්ශක ආරක්ෂිතව මකා දැමිය හැකි අතර, මේ සඳහා රෝග විනිශ්චයන් පෙනී සිට ඇත අනුපිටපත්_දර්ශක.

ගැටලුව තුන - ඡේදනය වන දර්ශක

බොහෝ නවක සංවර්ධකයින් තනි තීරුවක් මත දර්ශක නිර්මාණය කරයි. ක්‍රමක්‍රමයෙන්, මෙම ව්‍යාපාරය හොඳින් අත්විඳීමෙන්, මිනිසුන් ඔවුන්ගේ විමසුම් ප්‍රශස්ත කිරීමට සහ තීරු කිහිපයක් ඇතුළත් වඩාත් සංකීර්ණ දර්ශක එකතු කිරීමට පටන් ගනී. තීරු මත දර්ශක දිස්වන ආකාරය මෙයයි A, A + B., A+B+C සහ යනාදි. මෙම දර්ශකවලින් පළමු දෙක තුනෙන් උපසර්ග වන බැවින් ආරක්ෂිතව ඉවතට විසි කළ හැකිය. මෙය තැටියේ විශාල ඉඩ ප්‍රමාණයක් ඉතිරි කරන අතර මේ සඳහා රෝග විනිශ්චය ද ඇත ඡේදනය වූ_දර්ශක.

ගැටළුව හතර - දර්ශක නොමැතිව විදේශීය යතුරු

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

අපටත් එය එසේම විය: එය යම් වේලාවක කාලසටහනකට අනුව ක්‍රියාත්මක වන සහ පරීක්ෂණ ඇණවුම්වල දත්ත සමුදාය ඉවත් කරන රැකියාවක් ප්‍රධාන සත්කාරක සමාගම විසින් අපට “එකතු” කිරීමට පටන් ගත්තේය. CPU සහ IO අපතේ ගියේය, ඉල්ලීම් මන්දගාමී විය, කාලය අවසන් විය, සේවාව පන්සියයකි. ඉක්මන් විශ්ලේෂණය pg_stat_activity වැනි විමසුම් පෙන්වූයේ:

delete from <table> where id in (…)

මෙම අවස්ථාවේදී, ඇත්ත වශයෙන්ම, ඉලක්කගත වගුවේ id මගින් දර්ශකයක් තිබූ අතර, කොන්දේසිය අනුව ඉතා සුළු වාර්තා මකා දමන ලදී. සෑම දෙයක්ම වැඩ කළ යුතු බව පෙනෙන්නට තිබුණත්, අහෝ, එය එසේ නොවීය.

පුදුම එකා පිහිටට ආවා විශ්ලේෂණය පැහැදිලි කරන්න ඉලක්ක වගුවේ වාර්තා මකා දැමීමට අමතරව, යොමු අඛණ්ඩතා පරීක්ෂාවක් ද ඇති බවත්, අදාළ වගු වලින් එකක මෙම චෙක්පත අසාර්ථක වන බවත් පැවසීය. අනුක්රමික ස්කෑන් සුදුසු දර්ශකයක් නොමැතිකම හේතුවෙන්. එබැවින් රෝග විනිශ්චය උපත ලැබීය දර්ශක_ රහිත_විදේශීය_යතුරු.

පස්වන ගැටළුව - දර්ශකවල ශුන්‍ය අගය

පෙරනිමියෙන්, Postgres හි btree දර්ශකවල ශුන්‍ය අගයන් ඇතුළත් වේ, නමුත් ඒවා සාමාන්‍යයෙන් එහි අවශ්‍ය නොවේ. එමනිසා, මම මෙම ශූන්‍ය (රෝග විනිශ්චය) ඉවත දැමීමට උනන්දුවෙන් උත්සාහ කරමි null_values_සහිත_දර්ශක), වර්ගය අනුව nullable තීරු මත අර්ධ දර්ශක නිර්මාණය කිරීම where <A> is not null. මේ විදියට අපේ එක ඉන්ඩෙක්ස් එකක ප්‍රමාණය 1877 MB සිට 16 KB දක්වා අඩු කරන්න මට පුළුවන් වුනා. තවද එක් සේවාවක, දර්ශක වලින් ශුන්‍ය අගයන් බැහැර කිරීම හේතුවෙන් දත්ත සමුදායේ ප්‍රමාණය 16% කින් (නිරපේක්ෂ සංඛ්‍යා වලින් 4.3 GB කින්) අඩු විය. ඉතා සරල වෙනස් කිරීම් සමඟ තැටි ඉඩෙහි අතිවිශාල ඉතුරුම්. 🙂

ගැටළුව හය - ප්රාථමික යතුරු නොමැතිකම

යාන්ත්‍රණයේ ස්වභාවය නිසා Postgres හි MVCC මෙවැනි තත්වයක් ඇති විය හැක ඉදිමීමමිය ගිය වාර්තා විශාල සංඛ්‍යාවක් හේතුවෙන් ඔබේ මේසයේ ප්‍රමාණය වේගයෙන් වර්ධනය වන විට. මම බොළඳව විශ්වාස කළා මෙය අපට තර්ජනයක් නොවන බවත්, අපගේ පදනමට මෙය සිදු නොවනු ඇති බවත්, මන්ද අපි, වාව්!!!, අපි සාමාන්‍ය සංවර්ධකයින් ... මම කෙතරම් මෝඩ සහ බොළඳද ...

එක් දිනක්, එක් අපූරු සංක්‍රමණයක් විශාල සහ ක්‍රියාකාරීව භාවිතා කරන ලද වගුවක සියලුම වාර්තා ගෙන යාවත්කාලීන කරන ලදී. අපි නිල් පාටින් මේසයේ ප්‍රමාණයට +100 GB ලබා ගත්තෙමු. එය මහත් ලැජ්ජාවකි, නමුත් අපගේ වැරදි ක්‍රියා එතැනින් අවසන් වූයේ නැත. මෙම මේසයේ ඇති ස්වයංක්‍රීය රික්තය පැය 15 කට පසුව අවසන් වූ පසු, භෞතික පිහිටීම නැවත නොපැමිණෙන බව පැහැදිලි විය. අපට සේවාව නතර කර VACUUM FULL කිරීමට නොහැකි වූ නිසා අපි භාවිතා කිරීමට තීරණය කළෙමු pg_repack. ඊට පස්සේ ඒක තේරුණා pg_repack ප්‍රාථමික යතුරක් හෝ වෙනත් සුවිශේෂතා බාධාවකින් තොරව වගු සකසන්නේ කෙසේදැයි නොදන්නා අතර අපගේ වගුවට ප්‍රාථමික යතුරක් නොතිබුණි. එබැවින් රෝග විනිශ්චය උපත ලැබීය ප්‍රාථමික_යතුර_ රහිත_වගු.

පුස්තකාල අනුවාදයේ 0.1.5 වගු සහ දර්ශක වලින් දත්ත රැස් කර නියමිත වේලාවට ප්‍රතිචාර දැක්වීමේ හැකියාව එකතු කර ඇත.

ගැටළු හත සහ අට - ප්රමාණවත් නොවන දර්ශක සහ භාවිතයට නොගත් දර්ශක

පහත රෝග විනිශ්චය දෙක වේ: නැතිවූ_දර්ශක_ සහිත_වගු и භාවිතා නොකළ_දර්ශක - සාපේක්ෂව මෑතකදී ඔවුන්ගේ අවසාන ස්වරූපයෙන් පෙනී සිටියේය. කාරණය වන්නේ ඒවා ගෙන ගොස් එකතු කළ නොහැකි වීමයි.

මා දැනටමත් ලියා ඇති පරිදි, අපි අනුරූ කිහිපයක් සමඟ වින්‍යාසයක් භාවිතා කරන අතර විවිධ ධාරකවල කියවීමේ භාරය මූලික වශයෙන් වෙනස් වේ. මෙහි ප්රතිඵලයක් වශයෙන්, සමහර ධාරකවල සමහර වගු සහ දර්ශක ප්රායෝගිකව භාවිතා නොකරන බව තත්වය හැරෙනවා, සහ විශ්ලේෂණය සඳහා ඔබ පොකුරේ සියලුම ධාරකයන්ගෙන් සංඛ්යා ලේඛන එකතු කළ යුතුය. සංඛ්යා ලේඛන නැවත සකසන්න මෙය පොකුරේ සෑම ධාරකයකම අවශ්‍ය වේ; ඔබට මෙය මාස්ටර් මත පමණක් කළ නොහැක.

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

නිගමනය ලෙස

ඇත්ත වශයෙන්ම, සියලුම රෝග විනිශ්චය සඳහා ඔබට වින්‍යාසගත කළ හැකිය බැහැර කිරීමේ ලැයිස්තුව. මේ ආකාරයට, ඔබට ඉක්මනින් ඔබගේ යෙදුමේ චෙක්පත් ක්‍රියාත්මක කළ හැකිය, නව දෝෂ දර්ශනය වීම වැළැක්වීම, පසුව ක්‍රමයෙන් පැරණි ඒවා නිවැරදි කරන්න.

දත්ත සමුදා සංක්‍රමණයන් ක්‍රියාත්මක වූ වහාම ක්‍රියාකාරී පරීක්ෂණ වලදී සමහර රෝග විනිශ්චය සිදු කළ හැක. මෙය සමහර විට මගේ පුස්තකාලයේ ඇති ප්‍රබලම අංගයන්ගෙන් එකකි. භාවිතය පිළිබඳ උදාහරණයක් සොයාගත හැකිය නිරූපණය.

භාවිතයට නොගත් හෝ නැතිවූ දර්ශක සඳහා මෙන්ම, bloat සඳහා චෙක්පත් සැබෑ දත්ත ගබඩාවක පමණක් සිදු කිරීම අර්ථවත් කරයි. එකතු කළ අගයන් සටහන් කළ හැක නිවස ක්ලික් කරන්න නැතහොත් අධීක්ෂණ පද්ධතියට යවනු ලැබේ.

මම ඇත්තටම බලාපොරොත්තු වෙනවා pg-දර්ශකය-සෞඛ්‍යය ප්රයෝජනවත් සහ ඉල්ලුමක් වනු ඇත. ඔබ සොයා ගන්නා ගැටළු වාර්තා කිරීමෙන් සහ නව රෝග විනිශ්චය යෝජනා කිරීමෙන් ඔබට පුස්තකාලයේ සංවර්ධනයට දායක විය හැක.

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

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