Java developer တစ်ဦး၏အမြင်ဖြင့် PostgreSQL ရှိ အညွှန်းကိန်းများ၏ ကျန်းမာရေး

မင်္ဂလာပါ။

ကျွန်တော့်နာမည်က Vanya ဖြစ်ပြီး Java developer တစ်ယောက်ပါ။ ဒေတာဘေ့စ်ကိုတည်ဆောက်ခြင်း၊ ဖွဲ့စည်းပုံ၊ စွမ်းဆောင်ရည်ကို ကောင်းမွန်အောင်ပြုလုပ်ခြင်းနှင့် စနေ၊

မကြာသေးမီက ကျွန်ုပ်သည် ကျွန်ုပ်တို့၏ microservices များရှိ databases အများအပြားကို သပ်သပ်ရပ်ရပ်ပြင်ဆင်ပြီး java Library တစ်ခုကို ရေးသားခဲ့သည်။ pg-index-ကျန်းမာရေးဤလုပ်ငန်းကို ပိုမိုလွယ်ကူစေပြီး၊ ကျွန်ုပ်အား အချိန်ကုန်သက်သာစေပြီး ဆော့ဖ်ဝဲရေးသားသူများမှ လုပ်လေ့ရှိသော အမှားအချို့ကို ရှောင်ရှားရန် ကူညီပေးပါသည်။ ဒီနေ့ပြောမယ့် ဒီစာကြည့်တိုက်ပါ။

Java developer တစ်ဦး၏အမြင်ဖြင့် PostgreSQL ရှိ အညွှန်းကိန်းများ၏ ကျန်းမာရေး

ခွင

ကျွန်တော်နှင့်အလုပ်လုပ်သော PostgreSQL ၏အဓိကဗားရှင်းမှာ 10 ဖြစ်သည်။ ကျွန်ုပ်အသုံးပြုသော SQL queries အားလုံးကို ဗားရှင်း 11 တွင်လည်း စမ်းသပ်ထားပါသည်။ အနိမ့်ဆုံးပံ့ပိုးထားသောဗားရှင်းမှာ 9.6 ဖြစ်သည်။

စောပိုငျးကာလ

ကျွန်ုပ်အတွက် ထူးဆန်းသည့် အခြေအနေတစ်ခုဖြင့် လွန်ခဲ့သော တစ်နှစ်နီးပါးက စတင်ခဲ့သည်- အပြာရောင်အညွှန်းတစ်ခု၏ အပြိုင်အဆိုင်ဖန်တီးမှုသည် အမှားတစ်ခုနှင့် အဆုံးသတ်သွားခဲ့သည်။ ပုံမှန်အတိုင်းပင် အညွှန်းကိုယ်တိုင်က ဒေတာဘေ့စ်တွင် မမှန်ကန်သော အခြေအနေတွင် ရှိနေသည်။ မှတ်တမ်း ခွဲခြမ်းစိတ်ဖြာမှု ပြတ်တောက်မှုကို ပြသခဲ့သည်။ temp_file_limit. ပြီးသွားတော့... ပိုနက်နဲအောင် တူးကြည့်လိုက်တော့ database configuration ထဲမှာ ပြဿနာပေါင်းစုံကို တွေ့ပြီး အင်္ကျီလက်တွေကို လှန်ပြီး မျက်လုံးထဲမှာ တဖျပ်ဖျပ်နဲ့ ပြင်လိုက်တယ်။

ပြဿနာတစ်ခု - ပုံသေဖွဲ့စည်းပုံ

ကော်ဖီဖျော်စက်တစ်ခုတွင်သုံးနိုင်သော Postgres နှင့်ပတ်သက်သည့်အလင်္ကာကိုလူတိုင်းတော်တော်ငြီးငွေ့နေပုံရသော်လည်း... ပုံသေဖွဲ့စည်းပုံသည် အမှန်တကယ်မေးခွန်းများစွာကိုပေါက်ဖွားစေပါသည်။ အနည်းဆုံးတော့ သတိထားရကျိုးနပ်ပါတယ်။ maintenance_work_mem, temp_file_limit, ထုတ်ပြန်ချက်_ အချိန်ကုန်ခြင်း။ и lock_timeout.

ငါတို့ကိစ္စ maintenance_work_mem မူရင်း 64 MB နှင့် temp_file_limit 2 GB ဝန်းကျင် - ကျွန်ုပ်တို့တွင် စားပွဲကြီးတစ်ခုပေါ်တွင် အညွှန်းတစ်ခုဖန်တီးရန် လုံလောက်သော memory မရှိပါ။

ထို့ကြောင့်၊ pg-index-ကျန်းမာရေး စီးရီးတစ်ခု စုဆောင်းခဲ့တယ်။ သော့ကျွန်တော့်အမြင်အရ၊ database တစ်ခုစီအတွက် configure လုပ်သင့်သော parameters များ။

ပြဿနာနှစ်ခု - ပွားနေသော အညွှန်းများ

ကျွန်ုပ်တို့၏ဒေတာဘေ့စ်များသည် SSD drives တွင်နေထိုင်ကြပြီး ကျွန်ုပ်တို့အသုံးပြုပါသည်။ HA- များစွာသောဒေတာစင်တာများ၊ master host နှင့် configuration n- ပုံတူအရေအတွက်။ Disk space သည် ကျွန်ုပ်တို့အတွက် အလွန်တန်ဖိုးရှိသော အရင်းအမြစ်တစ်ခုဖြစ်သည်။ ၎င်းသည် စွမ်းဆောင်ရည်နှင့် CPU သုံးစွဲမှုထက် အရေးကြီးသည်။ ထို့ကြောင့်၊ တစ်ဖက်တွင်၊ ကျွန်ုပ်တို့သည် လျင်မြန်သောစာဖတ်ခြင်းအတွက် အညွှန်းများလိုအပ်ပြီး အခြားတစ်ဖက်တွင်၊ ၎င်းတို့သည် နေရာလွတ်ကိုစား၍ ဒေတာအပ်ဒိတ်လုပ်ခြင်းကို နှေးကွေးစေသောကြောင့် ဒေတာဘေ့စ်တွင် မလိုအပ်သောအညွှန်းများကို မမြင်လိုပါ။

ယခုလည်း အရာအားလုံးကို ပြန်လည်ရရှိပြီးဖြစ်သည်။ မမှန်ကန်သော အညွှန်းများ လုံလုံလောက်လောက်မြင်ပြီးပြီ။ Oleg Bartunov မှ သတင်းပေးပို့ချက်“ကြီးကျယ်တဲ့” သုတ်သင်ရှင်းလင်းမှုတစ်ခုကို စီစဉ်ဖို့ ဆုံးဖြတ်ခဲ့တယ်။ developer များသည် database documentation ကိုဖတ်ရန် မကြိုက်ကြကြောင်း တွေ့ရှိရပါသည်။ သူတို့က သိပ်မကြိုက်ဘူး။ ထို့အတွက်ကြောင့်၊ ပုံမှန်အမှားနှစ်ခု ဖြစ်ပေါ်လာသည် - ပင်မသော့ပေါ်တွင် ကိုယ်တိုင်ဖန်တီးထားသော အညွှန်းတစ်ခုနှင့် သီးသန့်ကော်လံတစ်ခုရှိ အလားတူ "လက်စွဲ" အညွှန်းတစ်ခု။ အမှန်မှာ ၎င်းတို့သည် မလိုအပ်ပါ - Postgres သည် အရာရာတိုင်းကို သူ့ဘာသာသူ လုပ်ဆောင်မည်ဖြစ်သည်။ ထိုသို့သော အညွှန်းများကို ဘေးကင်းစွာ ဖျက်နိုင်သည်၊ ဤရည်ရွယ်ချက်အတွက် ရောဂါရှာဖွေမှုများ ပေါ်လာပါသည်။ duplicated_indexes.

ပြဿနာ သုံးခု - လမ်းဆုံညွှန်းကိန်း

အတွေ့အကြုံမရှိသေးသော developer အများစုသည် ကော်လံတစ်ခုတည်းတွင် အညွှန်းများကို ဖန်တီးကြသည်။ တဖြည်းဖြည်းနှင့် ဤလုပ်ငန်းကို စေ့စေ့စပ်စပ် တွေ့ကြုံလာရသောအခါ လူများသည် ၎င်းတို့၏ မေးမြန်းချက်များကို အကောင်းဆုံးဖြစ်အောင် စတင်ကြပြီး ကော်လံအများအပြားပါရှိသော ပိုမိုရှုပ်ထွေးသော အညွှန်းများကို ပေါင်းထည့်ကြသည်။ ဤသည်မှာ ကော်လံများရှိ အညွှန်းများ ပေါ်လာပုံဖြစ်သည်။ A, A + B ကို, A+B+C နောက် ... ပြီးတော့။ ဤအညွှန်းကိန်းများထဲမှ ပထမနှစ်ခုသည် တတိယ၏ရှေ့ဆက်ဖြစ်သောကြောင့် ဘေးကင်းစွာ ဖယ်ထုတ်နိုင်သည်။ ၎င်းသည် ဒစ်ခ်နေရာအများအပြားကိုလည်း သက်သာစေပြီး ၎င်းအတွက် ရောဂါရှာဖွေမှုများလည်း ရှိပါသည်။ intersected_indexes.

ပြဿနာ လေးခု - အညွှန်းမပါသော နိုင်ငံခြားကီးများ

Postgres သည် ကျောထောက်နောက်ခံအညွှန်းကို မသတ်မှတ်ဘဲ နိုင်ငံခြားသော့ကန့်သတ်ချက်များကို ဖန်တီးနိုင်သည်။ အခြေအနေတော်တော်များများမှာ ဒါက ပြဿနာမဟုတ်သလို သူ့အလိုလို ထုတ်ဖော်မပြတတ်ပါဘူး...။

၎င်းသည် ကျွန်ုပ်တို့နှင့် အတူတူပင်ဖြစ်သည်- အချိန်ဇယားတစ်ခုအရ အလုပ်တစ်ခုသည် အချိန်ဇယားတစ်ခုအတိုင်း လုပ်ဆောင်နေပြီး စမ်းသပ်မှုအမှာစာများ၏ဒေတာဘေ့စ်ကို ရှင်းလင်းခြင်းတွင် မာစတာအိမ်ရှင်မှ ကျွန်ုပ်တို့ထံ “ထည့်သည်” ကို စတင်လိုက်ပါသည်။ CPU နှင့် IO သည် ပျက်စီးသွားသည်၊ တောင်းဆိုမှုများ နှေးကွေးကာ အချိန်ကုန်သွားသည်၊ ဝန်ဆောင်မှုမှာ ငါးရာဖြစ်သည်။ အမြန်ခွဲခြမ်းစိတ်ဖြာ pg_stat_activity ထိုကဲ့သို့သောမေးခွန်းများကိုပြသခဲ့သည်

delete from <table> where id in (…)

ဤကိစ္စတွင်၊ ပစ်မှတ်ဇယားတွင် id အလိုက် အညွှန်းတစ်ခုရှိနေသည်၊ အခြေအနေအရ မှတ်တမ်းအနည်းငယ်ကို ဖျက်ပစ်လိုက်ပါသည်။ အရာအားလုံးက အလုပ်ဖြစ်သင့်တယ်လို့ ထင်ရပေမယ့် ဖြစ်ချင်တော့ မဖြစ်ခဲ့ပါဘူး။

အံ့သြဖွယ်ကောင်းသူသည် ကယ်တင်ခြင်းသို့ ရောက်ခဲ့သည်။ ခွဲခြမ်းစိတ်ဖြာရှင်းပြပါ။ ပစ်မှတ်ဇယားရှိ မှတ်တမ်းများကို ဖျက်ခြင်းအပြင်၊ ကိုးကားမှုဆိုင်ရာ သမာဓိစစ်ဆေးမှုလည်း ရှိကြောင်း၊ ဆက်စပ်ဇယားများထဲမှ တစ်ခုတွင် ဤစစ်ဆေးမှုသည် ပျက်ကွက်သည်ဟု ဆိုသည်။ ဆင့်ကဲစကင်န် သင့်လျော်သောအညွှန်းမရှိခြင်းကြောင့်ဖြစ်သည်။ ဒီလိုနဲ့ ရောဂါရှာဖွေမှုတွေ ပေါ်ပေါက်လာပါတယ်။ Foreign_keys_without_index.

ပြဿနာငါး – အညွှန်းကိန်းများတွင် အချည်းနှီးသောတန်ဖိုး

မူရင်းအားဖြင့်၊ Postgres သည် btree အညွှန်းများတွင် null တန်ဖိုးများပါ၀င်သော်လည်း ၎င်းတို့သည် များသောအားဖြင့် ထိုနေရာတွင် မလိုအပ်ပါ။ ထို့ကြောင့် ဤ null များကို ဖယ်ထုတ်ရန် ဝီရိယရှိရှိ ကြိုးစားပါ (ရောဂါရှာဖွေခြင်း) indexes_with_null_values) အမျိုးအစားအလိုက် nullable ကော်လံများတွင် တစ်စိတ်တစ်ပိုင်းအညွှန်းများ ဖန်တီးခြင်း။ where <A> is not null. ဤနည်းဖြင့် ကျွန်ုပ်တို့၏ အညွှန်းကိန်းတစ်ခု၏ အရွယ်အစားကို 1877 MB မှ 16 KB သို့ လျှော့ချနိုင်ခဲ့သည်။ ဝန်ဆောင်မှုများထဲမှ တစ်ခုတွင်၊ အညွှန်းကိန်းများမှ null တန်ဖိုးများကို ချန်လှပ်ထားခြင်းကြောင့် စုစုပေါင်းဒေတာဘေ့စ်အရွယ်အစားသည် စုစုပေါင်း 16% (အကြွင်းမဲ့နံပါတ်များ 4.3 GB) လျော့နည်းသွားသည်။ အလွန်ရိုးရှင်းသော ပြုပြင်မွမ်းမံမှုများဖြင့် disk space တွင် ကြီးမားသော ခြွေတာမှု။ 🙂

ပြဿနာခြောက် – အဓိကသော့မရှိခြင်း။

ယန္တရား၏သဘောသဘာဝကြောင့်ဖြစ်သည်။ Postgres ရှိ MVCC ဒီလိုအခြေအနေမျိုး ဖြစ်နိုင်တယ်။ ဖောင်းသေဆုံးသူ မှတ်တမ်းအများအပြားကြောင့် သင့်စားပွဲအရွယ်အစား လျင်မြန်စွာကြီးထွားလာသောအခါ။ ဒါက ငါတို့ကို ခြိမ်းခြောက်မှာ မဟုတ်ဘူးလို့ လိမ်ညာပြီး ယုံကြည်ခဲ့တယ်၊ ငါတို့ရဲ့ အခြေခံကို ဒီလိုဖြစ်လာမှာ မဟုတ်ဘူး၊ ငါတို့က သာမန် developer တွေမို့လို့ ငါက ဘယ်လောက်မိုက်မဲ နုံအနေခဲ့တယ်...

တစ်နေ့တွင်၊ အံ့သြဖွယ်ကောင်းသော ရွှေ့ပြောင်းနေထိုင်မှုတစ်ခုသည် ကြီးမားပြီး တက်ကြွစွာအသုံးပြုထားသော ဇယားတစ်ခုတွင် မှတ်တမ်းအားလုံးကို သိမ်းဆည်းခဲ့သည်။ အပြာရောင်ကနေ စားပွဲအရွယ်အစားအတွက် +100 GB ရခဲ့ပါတယ်။ ဒါဟာ ရှက်စရာကြီးဘဲ၊ ဒါပေမယ့် ငါတို့ရဲ့ စွန့်စားမှုတွေက အဲ့ဒီမှာ မပြီးဆုံးခဲ့ပါဘူး။ ဤဇယားရှိ အလိုအလျောက် လေဟာနယ်သည် 15 နာရီအကြာတွင် ပြီးဆုံးပြီးနောက်၊ ရုပ်ပိုင်းဆိုင်ရာတည်နေရာသည် ပြန်မလာတော့ကြောင်း ထင်ရှားလာသည်။ ကျွန်ုပ်တို့သည် ဝန်ဆောင်မှုကို ရပ်တန့်ပြီး VACUUM အပြည့်ဖြစ်အောင် မလုပ်နိုင်ခဲ့သောကြောင့် အသုံးပြုရန် ဆုံးဖြတ်ခဲ့သည်။ pg_repack. ပြီးတော့ အဲဒါ ထွက်လာတယ်။ pg_repack ပင်မသော့ သို့မဟုတ် အခြားထူးခြားမှု ကန့်သတ်ချက်များမရှိဘဲ ဇယားများကို မည်သို့လုပ်ဆောင်ရမည်ကို မသိပါ၊ ကျွန်ုပ်တို့၏ဇယားတွင် အဓိကသော့မရှိပါ။ ဒီလိုနဲ့ ရောဂါရှာဖွေမှုတွေ ပေါ်ပေါက်လာပါတယ်။ tables_without_primary_key.

စာကြည့်တိုက်ဗားရှင်းတွင် 0.1.5 ဇယားကွက်များနှင့် အညွှန်းကိန်းများ စုစည်းကာ အချိန်နှင့်တပြေးညီ တုံ့ပြန်နိုင်စွမ်းကို ထည့်သွင်းထားသည်။

ပြဿနာ ခုနစ်ခုနှင့် ရှစ်ခု - အညွှန်းများ မလုံလောက်ခြင်းနှင့် အသုံးမပြုသော အညွှန်းများ

အောက်ပါရောဂါရှာဖွေရေးနှစ်ခုမှာ- tables_with_missing_indexes и အသုံးမပြုသော_အညွှန်းများ - မကြာသေးမီက ၎င်းတို့၏ နောက်ဆုံးပုံစံတွင် ပေါ်လာသည်။ အဓိကအချက်မှာ ၎င်းတို့ကို ခေါ်ယူ၍ ပေါင်းထည့်ရုံဖြင့် မရပေ။

ကျွန်တော်ရေးပြီးသားအတိုင်း၊ ကျွန်ုပ်တို့သည် ပုံတူများစွာဖြင့် ဖွဲ့စည်းမှုပုံစံကို အသုံးပြုပြီး မတူညီသော host များတွင် ဖတ်ရှုခြင်းဝန်သည် အခြေခံအားဖြင့် ကွဲပြားပါသည်။ ရလဒ်အနေဖြင့်၊ အချို့သော host များရှိ ဇယားများနှင့် အညွှန်းများကို လက်တွေ့ကျကျအသုံးမပြုကြောင်းနှင့် ခွဲခြမ်းစိတ်ဖြာရန်အတွက် သင်သည် အစုအဝေးရှိ host အားလုံးထံမှ ကိန်းဂဏန်းများကို စုဆောင်းရန်လိုအပ်ပါသည်။ စာရင်းဇယားများကို ပြန်လည်သတ်မှတ်ပါ။ ၎င်းသည် အစုအဝေးရှိ host တိုင်းတွင်လည်း လိုအပ်သည်၊ ၎င်းကို မာစတာပေါ်တွင်သာ လုပ်ဆောင်၍မရပါ။

ဤနည်းလမ်းသည် အသုံးမပြုဖူးသော အညွှန်းများကို ဖယ်ရှားကာ အသုံးနည်းသောဇယားများတွင် ပျောက်ဆုံးနေသော အညွှန်းများကို ပေါင်းထည့်ခြင်းဖြင့် ဆယ်ဂဏန်းဂစ်ဂါဗိုက်များစွာကို သိမ်းဆည်းနိုင်စေခဲ့သည်။

နိဂုံးချုပ်

ဟုတ်ပါတယ်၊ ရောဂါရှာဖွေမှုအားလုံးနီးပါးအတွက် သင် configure လုပ်နိုင်ပါတယ်။ ဖယ်ထုတ်စာရင်း. ဤနည်းအားဖြင့်၊ သင်သည် သင်၏အပလီကေးရှင်းတွင် စစ်ဆေးမှုများကို လျင်မြန်စွာအကောင်အထည်ဖော်နိုင်ပြီး အမှားအယွင်းအသစ်များမပေါ်စေရန် တားဆီးကာ အဟောင်းများကို ဖြည်းဖြည်းချင်းပြုပြင်နိုင်သည်။

ဒေတာဘေ့စ် ရွှေ့ပြောင်းခြင်းကို စတင်ပြီးနောက် အချို့သော ရောဂါရှာဖွေမှုများကို လုပ်ဆောင်နိုင်သော စမ်းသပ်မှုများတွင် လုပ်ဆောင်နိုင်သည်။ ၎င်းသည် ကျွန်ုပ်၏စာကြည့်တိုက်၏ အစွမ်းထက်ဆုံးသောအင်္ဂါရပ်များထဲမှတစ်ခု ဖြစ်နိုင်သည်။ အသုံးပြုပုံ ဥပမာကို မှာကြည့်နိုင်ပါတယ်။ သရုပ်ပြ.

အသုံးမပြုသော သို့မဟုတ် ပျောက်ဆုံးနေသော အညွှန်းများအပြင် ဒေတာဘေ့စ်တစ်ခုပေါ်တွင်သာ bloat အတွက် စစ်ဆေးမှုများ ပြုလုပ်ခြင်းသည် အဓိပ္ပာယ်ရှိလှသည်။ စုဆောင်းထားသော တန်ဖိုးများကို မှတ်တမ်းတင်နိုင်သည်။ အိမ်ကိုနှိပ်ပါ သို့မဟုတ် စောင့်ကြည့်ရေးစနစ်သို့ ပေးပို့ပါ။

ငါတကယ်မျှော်လင့်ပါတယ်။ pg-index-ကျန်းမာရေး အသုံးဝင်ပြီး ဝယ်လိုအားရှိပါလိမ့်မယ်။ သင်တွေ့ရှိသောပြဿနာများကို သတင်းပို့ပြီး ရောဂါရှာဖွေမှုအသစ်များကို အကြံပြုခြင်းဖြင့် စာကြည့်တိုက်၏ဖွံ့ဖြိုးတိုးတက်မှုကိုလည်း ပံ့ပိုးကူညီနိုင်ပါသည်။

source: www.habr.com

မှတ်ချက် Add