PostgreSQL жана туташуу үчүн атайын жазуу ырааттуулугу орнотуулары

Макаланын котормосу курстун студенттери үчүн атайын даярдалган "Маалымат базасы". Бул багытта өнүгүүгө кызыкдарсызбы? Сизди чакырабыз Ачык эшик күнү, анда биз программа, онлайн форматтын өзгөчөлүктөрү, окуудан кийин бүтүрүүчүлөрдү күткөн компетенциялар жана карьералык келечек жөнүндө кеңири сөз кылабыз.

PostgreSQL жана туташуу үчүн атайын жазуу ырааттуулугу орнотуулары

PostgreSQL жана туташуу үчүн атайын жазуу ырааттуулугу орнотуулары
Composeде биз көптөгөн маалымат базалары менен иштешебиз, бул бизге алардын функциялары жана кемчиликтери менен көбүрөөк таанышууга мүмкүнчүлүк берет. Жаңы маалымат базаларынын өзгөчөлүктөрүн сүйүүгө үйрөнгөнүбүздө, биз кээде биз көптөн бери иштеп келе жаткан жетилген куралдарда ушул сыяктуу функциялар бар болсо, кандай сонун болмок деп ойлой баштайбыз. Мен PostgreSQLде көргүм келген жаңы функциялардын бири бүткүл кластер боюнча бир туташууга конфигурациялануучу жазуу ырааттуулугу болду. Ал эми белгилүү болгондой, бизде буга чейин эле бар жана бүгүн биз аны кантип колдонсоңуз болору тууралуу маалымат менен бөлүшкүбүз келет.

Мага эмне кереги бар?

Кластер кандай болушу керек, сиздин колдонмоңуздан көз каранды. Мисалы, эсеп төлөө колдонмосун алалы. Сизге кластер боюнча XNUMX% ырааттуулук керек болот, андыктан синхрондуу милдеттенмелерди иштетишиңиз керек, андыктан маалымат базаңыз бардык өзгөрүүлөрдү күтөт. Бирок, эгерде сиздин тиркемеңиз тез өнүгүп жаткан социалдык тармак болсо, анда сиз XNUMX% ырааттуулуктан тез жооп берүүнү артык көрөсүз. Буга жетишүү үчүн, кластериңизде асинхрондук тапшырмаларды колдоно аласыз.

компромисске жолугуп

Сиз маалыматтардын ырааттуулугу менен аткаруунун ортосунда соодалашууга туура келет. PostgreSQL ырааттуулуктан алыстайт, анткени демейки конфигурацияны алдын ала айтууга болот жана күтүлбөгөн сюрприздер жок. Эми компромисстерди карап көрөлү.

Tradeoff 1: Performance

PostgreSQL кластери ырааттуулукту талап кылбаса, ал асинхрондуу иштей алат. Жазуу кластердин лидерине жүргүзүлөт жана жаңыртуулар анын репликаларына бир нече миллисекунддан кийин жөнөтүлөт. PostgreSQL кластери ырааттуулукту талап кылганда, ал синхрондуу иштеши керек. Жазуу кластердин лидерине жасалат, ал репликага жаңыртуу жөнөтөт жана анын ийгиликтүү болгондугун жазууну баштаган кардарга тастыктоо жөнөтүүдөн мурун ар бири жазганын ырастоону күтөт. Бул ыкмалардын практикалык айырмасы асинхрондук ыкма эки тармактын хоптарын талап кылат, ал эми синхрондук ыкма төрттү талап кылат.

Tradeoff 2: ырааттуулук

Бул эки ыкмада лидер ийгиликсиз болгондо натыйжа да башкача болот. Эгерде иш асинхрондуу түрдө аткарылса, анда мындай ката пайда болсо, бардык жазуулар репликалар тарабынан жасалбайт. Канча чыгым болот? Колдонмонун өзүнө жана репликациянын натыйжалуулугуна жараша болот. Түзүү репликациясы, эгерде андагы маалыматтын көлөмү лидерге караганда 1 МБ азыраак болсо, репликанын лидер болуусуна жол бербейт, башкача айтканда, асинхрондук операция учурунда 1 МБга чейинки жазуулар жоголуп кетиши мүмкүн.

Бул синхрондуу режимде болбойт. Эгерде лидер ийгиликсиз болсо, анда бардык репликалар жаңыланат, анткени лидерде тастыкталган жазуу репликаларда ырасталууга тийиш. Бул ырааттуулук.

Синхрондук жүрүм-турум эсеп-кысап тиркемесинде мааниси бар, анда ырааттуулук ырааттуулук менен аткаруунун ортосундагы айырмачылыкта айкын артыкчылыкка ээ. Мындай колдонмо үчүн абдан маанилүү нерсе жарактуу маалыматтар болуп саналат. Эми суроо-талаптарга мүмкүн болушунча тезирээк жооп берүү менен колдонуучунун көңүлүн буруу негизги милдети болгон социалдык тармак жөнүндө ойлонуп көрүңүз. Бул учурда, азыраак тармак хоптары менен иштөө жана милдеттенмелерди аз күтүү артыкчылыктуу болот. Бирок, аткаруу менен ырааттуулуктун ортосундагы айырма сиз ойлонушуңуз керек болгон жалгыз нерсе эмес.

Соода 3: кыйроолор

Бул ийгиликсиз учурунда кластер өзүн кандай түшүнүү үчүн абдан маанилүү болуп саналат. Бир же бир нече репликалар иштебей калган жагдайды карап көрөлү. Милдеттенмелер асинхрондук түрдө иштетилгенде, лидер иштөөнү улантат, башкача айтканда, жетишпеген репликаларды күтпөстөн жазууларды кабыл алат жана иштетет. Репликалар кластерге кайтып келгенде лидерди кууп жетет. Синхрондуу репликацияда, эгерде репликалар жооп бербесе, анда лидердин тандоосу калбай калат жана реплика кластерге кайтып келип, жазууну кабыл алып, ишке ашырмайынча, тастыктоону күтө берет.

Бир транзакцияга бир туташуубу?

Ар бир тиркеме ырааттуулуктун жана аткаруунун башка түрүнө муктаж. Албетте, бул биз толугу менен ырааттуу деп ойлогон биздин эсеп төлөөчү колдонмобуз же дээрлик убактылуу социалдык тармак колдонмобуз болбосо. Башка бардык учурларда, кээ бир операциялар синхрондуу, кээ бирлери асинхрондуу болушу керек болгон учурлар болот. Чатка жөнөтүлгөн билдирүү кабыл алынганга чейин системанын күтүшүн каалабасаңыз болот, бирок төлөм ошол эле тиркемеде иштетилсе, анда күтүүгө туура келет.

Бул чечимдердин баары, албетте, колдонмону иштеп чыгуучу тарабынан кабыл алынат. Ар бир ыкманы качан колдонуу керектиги жөнүндө туура чечим кабыл алуу кластериңизден максималдуу пайда алууга жардам берет. Иштеп чыгуучу байланыштар жана транзакциялар үчүн SQL деңгээлинде алардын ортосунда которула алышы маанилүү.

Иш жузунде контролду камсыз кылуу

Демейки боюнча, PostgreSQL ырааттуулукту камсыз кылат. Бул сервер параметри тарабынан көзөмөлдөнөт synchronous_commit. Демейки боюнча ал ордунда on, бирок анын дагы үч варианты бар: local, remote_write же off.

Параметрди коюуда off бардык синхрондук тапшырмалар, атүгүл жергиликтүү системада да токтотулат. Жергиликтүү параметр локалдык система үчүн синхрондуу режимди аныктайт, бирок репликага жазуу асинхрондуу түрдө аткарылат. Remote_write андан да ары барат: репликага жазуулар асинхрондуу түрдө жасалат, бирок реплика жазууну кабыл алып, бирок аны дискке жазбаганда кайтарылат.

Мүмкүн болгон варианттарды карап чыгуу менен биз жүрүм-турумду тандап алабыз жана ошону эске алуу менен on – бул синхрондук жазуулар, биз тандайбыз local тармак аркылуу асинхрондук тапшырмалар үчүн, ал эми локалдык тапшырмаларды синхрондуу калтырат.

Эми биз муну кантип орнотууну бир аздан кийин айтып беребиз, бирок биз орноттук деп элестетиңиз synchronous_commit в local сервер үчүн. Параметрди өзгөртүүгө болобу деп ойлодук synchronous_commit учуп баратып, бул мүмкүн эмес экени белгилүү болду, муну жасоонун эки жолу бар. Биринчиси, туташуу сеансын төмөнкүдөй орнотуу:

SET SESSION synchronous_commit TO ON;  
// Your writes go here

Сеанстагы бардык кийинки жазуулар туташкан кардарга оң натыйжаны кайтаруудан мурун репликага жазылгандарды ырасташат. Албетте, жөндөөнү өзгөртпөсөңүз synchronous_commit кайра. Сиз бөлүгүн өткөрүп жиберсеңиз болот SESSION буйрукта, анткени ал демейки мааниде болот.

Экинчи ыкма, сиз жөн гана бир транзакция үчүн синхрондуу репликацияны алууну кааласаңыз жакшы болот. Көптөгөн NoSQL муун маалымат базаларында транзакциялар түшүнүгү жок, бирок PostgreSQLде бар. Бул учурда сиз транзакцияны баштап, анан орнотуңуз synchronous_commit в on бүтүм үчүн жазууну аткаруу алдында. COMMIT кандайдыр бир параметр маанисин колдонуу менен транзакцияны жасайт synchronous_commit, ал ошол убакта коюлган, бирок башка иштеп чыгуучулар жазуулар асинхрондуу эмес экенин түшүнүү үчүн өзгөрмөлөрдү алдын ала койгон жакшы.

BEGIN;  
SET LOCAL synchronous_commit TO ON;  
// Your writes go here
COMMIT;  

Бардык транзакция милдеттенмелери эми маалымат базасы туташкан кардарга оң жооп кайтарганга чейин репликага жазылганы тастыкталат.

PostgreSQL конфигурацияланууда

Буга чейин биз PostgreSQL системасын элестеткенбиз synchronous_commit, орнотулган local. Бул сервер тарапта реалдуу болушу үчүн, сиз эки сервер конфигурациясынын параметрлерин коюшуңуз керек болот. Дагы бир параметр synchronous_standby_names качан өзүнө келет synchronous_commit болот on. Кайсы репликалар синхрондук милдеттенмелерге жарамдуу экенин аныктайт жана биз аны орнотобуз *, бул бардык репликалар тартылганын билдирет. Бул баалуулуктар адатта конфигурацияланат тарам билэ кошуу менен:

synchronous_commit = local  
synchronous_standby_names='*'

Параметрди коюу менен synchronous_commit мааниге local, биз жергиликтүү дисктер синхрондуу бойдон кала турган системаны түзөбүз, бирок тармактык репликалар демейки боюнча асинхрондуу. Албетте, биз жогоруда көрсөтүлгөндөй, бул милдеттенмелерди синхрондуу кылууну чечпесек.

Эгер сиз өнүгүүнү байкап жатсаңыз Губернатор долбоору, сиз акыркы өзгөрүүлөрдү байкаган чыгарсыз (1, 2), бул Губернатор колдонуучуларга бул параметрлерди сынап көрүүгө жана алардын ырааттуулугун көзөмөлдөөгө мүмкүндүк берди.

Дагы бир нече сөз...

Бир жума мурун мен сизге PostgreSQLди мынчалык кылдат тууралоо мүмкүн эмес деп айтмакмын. Мына ошондо Курт, Compose платформасынын командасынын мүчөсү, мындай мүмкүнчүлүк бар деп ырастады. Ал менин каршылыктарымды тынчтандырып, PostgreSQL документтеринен тапты кийинки:

PostgreSQL жана туташуу үчүн атайын жазуу ырааттуулугу орнотуулары

Бул жөндөөнү каалаган убакта өзгөртүүгө болот. Ар кандай транзакциянын жүрүм-туруму жасалган учурда күчүнө кирген орнотуу менен аныкталат. Ошондуктан, кээ бир транзакциялар үчүн синхрондуу, ал эми башкалар үчүн асинхрондуу түрдө жасалышы мүмкүн жана пайдалуу. Мисалы, мажбурлоо үчүн multistatement параметрдин демейки мааниси карама-каршы болгондо, асинхрондуу түрдө аткарылуучу транзакция, орнотулган SET LOCAL synchronous_commit TO OFF транзакцияда.

Конфигурация файлына бул кичинекей өзгөртүү менен биз колдонуучуларга алардын ырааттуулугун жана иштешин көзөмөлдөөнү бердик.

Source: www.habr.com

Комментарий кошуу