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 дар муомилот.

Бо ин тағироти хурд ба файли конфигуратсия, мо ба корбарон назорат аз болои мувофиқат ва иҷрои онҳо додем.

Манбаъ: will.com

Илова Эзоҳ