PostgreSQL және қосылымға арналған жазу тұрақтылығы параметрлері

Мақаланың аудармасы курс студенттері үшін арнайы дайындалған «Дерекқор». Осы бағытта дамуға мүдделі ме? шақырамыз Ашық есік күні, мұнда біз бағдарлама, онлайн форматтың ерекшеліктері, оқудан кейін түлектерді күтетін құзыреттер мен мансаптық перспективалар туралы егжей-тегжейлі сөйлесеміз.

PostgreSQL және қосылымға арналған жазу тұрақтылығы параметрлері

PostgreSQL және қосылымға арналған жазу тұрақтылығы параметрлері
Compose-те біз көптеген дерекқорлармен жұмыс істейміз, бұл бізге олардың функционалдығы мен кемшіліктерімен көбірек танысуға мүмкіндік береді. Жаңа дерекқорлардың мүмкіндіктерін жақсы көруді үйрене отырып, біз кейде біз ұзақ уақыт бойы жұмыс істеп келе жатқан жетілген құралдарда ұқсас мүмкіндіктер болса, қаншалықты жақсы болар еді деп ойлай бастаймыз. PostgreSQL-те көргім келетін жаңа мүмкіндіктердің бірі - бүкіл кластердегі қосылымға конфигурацияланатын жазу тұрақтылығы. Белгілі болғандай, бізде ол бар және бүгін біз оны қалай пайдалануға болатындығы туралы ақпаратпен бөліскіміз келеді.

Бұл маған не үшін керек?

Кластердің қалай әрекет етуі сіздің қолданбаңызға байланысты. Мысалы, шотты төлеу қолданбасын алайық. Сізге кластер бойынша XNUMX% сәйкестік қажет болады, сондықтан дерекқорыңыз барлық өзгерістердің орындалуын күтуі үшін синхронды тапсырмаларды қосу керек болады. Дегенмен, егер сіздің қолданбаңыз жылдам дамып келе жатқан әлеуметтік желі болса, сіз XNUMX% сәйкестіктен жылдам жауап беруді қалайтын шығарсыз. Бұған қол жеткізу үшін кластеріңізде асинхронды тапсырмаларды пайдалануға болады.

Ымыраға келу

Деректердің сәйкестігі мен өнімділігі арасында айырбас жасау керек. PostgreSQL бірізділіктен бас тартады, себебі әдепкі конфигурацияны болжауға болады және күтпеген тосынсыйларсыз. Енді ымыраларға тоқталайық.

Сауда 1: Өнімділік

PostgreSQL кластері сәйкестікті қажет етпесе, ол асинхронды түрде жұмыс істей алады. Жазу кластер жетекшісіне жасалады және жаңартулар бірнеше миллисекундтан кейін оның көшірмелеріне жіберіледі. PostgreSQL кластері жүйелілікті қажет еткенде, ол синхронды түрде жұмыс істеуі керек. Жазу кластер жетекшісіне жасалады, ол репликаларға жаңарту жібереді және жазуды бастаған клиентке оның сәтті болғаны туралы растауды жібермес бұрын әрқайсысы жазғанын растауды күтеді. Бұл тәсілдердің практикалық айырмашылығы асинхронды әдіске екі желілік септік қажет, ал синхронды әдіс төртеуін қажет етеді.

Сауда 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 транзакцияда.

Конфигурация файлына осы шағын өзгерту арқылы біз пайдаланушыларға олардың жүйелілігі мен өнімділігін бақылауға мүмкіндік бердік.

Ақпарат көзі: www.habr.com

пікір қалдыру