Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Дар мақола ман ба шумо мегӯям, ки мо ба масъалаи таҳаммулпазирии хатогиҳои PostgreSQL чӣ гуна муносибат кардем, чаро он барои мо муҳим шуд ва дар ниҳоят чӣ рӯй дод.

Мо хидмати пурбор дорем: 2,5 миллион корбар дар саросари ҷаҳон, ҳар рӯз 50K+ корбарони фаъол. Серверҳо дар Amazone дар як минтақаи Ирландия ҷойгиранд: 100+ серверҳои гуногун пайваста кор мекунанд, ки тақрибан 50-тои онҳо бо пойгоҳи додаҳо мебошанд.

Тамоми пуштибонӣ як барномаи бузурги монолитии Java мебошад, ки пайвастагии доимии вебсокетро бо муштарӣ нигоҳ медорад. Вақте ки якчанд корбар дар як тахта дар як вақт кор мекунанд, ҳама тағиротро дар вақти воқеӣ мебинанд, зеро мо ҳар як тағиротро ба базаи маълумот менависем. Мо ба пойгоҳи додаҳои худ дар як сония тақрибан 10К дархост дорем. Ҳангоми сарбории баланд дар Redis, мо дар як сония 80-100К дархост менависем.
Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Чаро мо аз Redis ба PostgreSQL гузаштем

Дар аввал, хидмати мо бо Redis, як мағозаи калидӣ, ки ҳама маълумотро дар хотираи RAM-и сервер нигоҳ медорад, кор мекард.

Тарафҳои Redis:

  1. Суръати вокуниши баланд, зеро ҳама чиз дар хотира нигоҳ дошта мешавад;
  2. Осонии нусхабардорӣ ва нусхабардорӣ.

Камбудиҳои Redis барои мо:

  1. Ҳеҷ гуна муомилоти воқеӣ вуҷуд надорад. Мо кӯшиш кардем, ки онҳоро дар сатҳи барномаи худ тақлид кунем. Мутаассифона, ин на ҳамеша хуб кор мекард ва навиштани коди хеле мураккабро талаб мекард.
  2. Миқдори маълумот бо ҳаҷми хотира маҳдуд аст. Бо зиёд шудани миқдори маълумот, хотира афзоиш хоҳад ёфт ва дар ниҳоят, мо бо хусусиятҳои намунаи интихобшуда дучор мешавем, ки дар AWS барои тағир додани намуди инстанс қатъ кардани хидмати моро талаб мекунад.
  3. Зарур аст, ки доимо сатҳи пасти таъхирро нигоҳ дошт, зеро. мо шумораи хеле зиёди дархостҳо дорем. Сатҳи оптималии таъхир барои мо 17-20 мс аст. Дар сатҳи 30-40 мс, мо ба дархостҳо аз аризаи худ ва таназзули хидмат посухҳои тӯлонӣ мегирем. Мутаассифона, ин дар моҳи сентябри соли 2018 бо мо рӯй дод, вақте ки яке аз ҳолатҳо бо Редис бо ягон сабаб аз муқаррарӣ 2 маротиба зиёдтар таъхир гирифт. Барои ҳалли мушкилот, мо хидматро дар нимаи рӯз барои нигоҳдории ғайринақшавӣ қатъ кардем ва намунаи мушкили Redis-ро иваз кардем.
  4. Гирифтани номувофиқатии маълумот ҳатто бо хатогиҳои ночиз дар код осон аст ва пас барои ислоҳи ин маълумот вақти зиёдеро барои навиштани код сарф мекунад.

Мо манфиҳоро ба назар гирифтем ва фаҳмидем, ки ба мо лозим аст, ки ба чизи мувофиқтар бо муомилоти муқаррарӣ ва вобастагии камтар аз таъхир гузарем. Тадқиқот анҷом дод, вариантҳои зиёдеро таҳлил кард ва PostgreSQL-ро интихоб кард.

Мо аллакай 1,5 сол боз ба пойгоҳи додаҳои нав гузашта истодаем ва танҳо як қисми ками маълумотро кӯчонидаем, аз ин рӯ ҳоло мо ҳамзамон бо Redis ва PostgreSQL кор карда истодаем. Маълумоти бештар дар бораи марҳилаҳои интиқол ва иваз кардани маълумот байни пойгоҳи додаҳо навишта шудааст мақолаи ҳамкорам.

Вақте ки мо бори аввал ба ҳаракат оғоз кардем, барномаи мо мустақиман бо пойгоҳи додаҳо кор мекард ва ба Master Redis ва PostgreSQL дастрасӣ пайдо кард. Кластери PostgreSQL аз устод ва реплика бо репликатсияи асинхронӣ иборат буд. Схемаи базаи маълумот чунин буд:
Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Амалисозии PgBouncer

Ҳангоме ки мо ҳаракат мекардем, маҳсулот низ рушд мекард: шумораи корбарон ва шумораи серверҳое, ки бо PostgreSQL кор мекарданд, афзоиш ёфт ва мо намерасидем. PostgreSQL барои ҳар як пайваст раванди алоҳида эҷод мекунад ва захираҳоро истеъмол мекунад. Шумо метавонед шумораи пайвастҳоро то як нуқтаи муайян зиёд кунед, дар акси ҳол имкони ба даст овардани нишондиҳандаҳои пастсифати пойгоҳи додаҳо вуҷуд дорад. Варианти беҳтарин дар чунин вазъият интихоби менеҷери пайвастшавӣ аст, ки дар назди пойгоҳ меистад.

Мо барои мудири пайвастшавӣ ду интихоб доштем: Pgpool ва PgBouncer. Аммо яке аз аввалин режими транзаксионии кор бо пойгоҳи додаҳоро дастгирӣ намекунад, аз ин рӯ мо PgBouncer-ро интихоб кардем.

Мо нақшаи зерини корро муқаррар кардем: барномаи мо ба як PgBouncer дастрасӣ пайдо мекунад, ки дар паси он устодони PostgreSQL ҳастанд ва дар паси ҳар як устод як реплика бо репликатсияи асинхронӣ мавҷуд аст.
Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Дар айни замон, мо натавонистем тамоми ҳаҷми маълумотро дар PostgreSQL нигоҳ дорем ва суръати кор бо пойгоҳи додаҳо барои мо муҳим буд, аз ин рӯ мо ба тақсим кардани PostgreSQL дар сатҳи барнома шурӯъ кардем. Схемаи дар боло тавсифшуда барои ин нисбатан қулай аст: ҳангоми илова кардани порчаи нави PostgreSQL, навсозии конфигуратсияи PgBouncer кифоя аст ва барнома метавонад фавран бо порчаи нав кор кунад.

Нокомии PgBouncer

Ин схема то лаҳзае кор мекард, ки ягона намунаи PgBouncer мурд. Мо дар AWS ҳастем, ки дар он ҳама намунаҳо дар сахтафзор кор мекунанд, ки давра ба давра мемиранд. Дар чунин ҳолатҳо, мисол танҳо ба сахтафзори нав мегузарад ва дубора кор мекунад. Ин бо PgBouncer рӯй дод, аммо он дастнорас шуд. Натиҷаи ин тирамоҳ дар тӯли 25 дақиқа дастрас набудани хидмати мо буд. AWS истифодаи изофӣ аз ҷониби корбарро барои чунин ҳолатҳо тавсия медиҳад, ки он вақт аз ҷониби мо татбиқ карда нашуда буд.

Пас аз он, мо дар бораи таҳаммулпазирии хатогиҳои кластерҳои PgBouncer ва PostgreSQL ба таври ҷиддӣ фикр кардем, зеро вазъияти шабеҳ метавонад бо ҳама гуна мисолҳо дар ҳисоби AWS-и мо рух диҳад.

Мо нақшаи таҳаммулпазирии хатогиҳои PgBouncer-ро ба таври зерин сохтем: ҳама серверҳои барномаҳо ба Network Load Balancer дастрасӣ доранд, ки дар паси он ду PgBouncer мавҷуд аст. Ҳар як PgBouncer ба ҳамон устоди PostgreSQL-и ҳар як порча назар мекунад. Агар суқути мисоли AWS дубора рух диҳад, тамоми трафик тавассути PgBouncer дигар равона карда мешавад. Муваффақияти Network Load Balancer аз ҷониби AWS таъмин карда мешавад.

Ин схема илова кардани серверҳои нави PgBouncerро осон мекунад.
Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Кластери PostgreSQL Failover эҷод кунед

Ҳангоми ҳалли ин мушкилот, мо вариантҳои гуногунро баррасӣ кардем: хатогиҳои худнависӣ, repmgr, AWS RDS, Patroni.

Скриптҳои худнависӣ

Онҳо метавонанд кори усторо назорат кунанд ва дар сурати нокомии он, репликаро ба устод пешбарӣ кунанд ва конфигуратсияи PgBouncer-ро навсозӣ кунанд.

Бартарии ин равиш соддагии ҳадди аксар аст, зеро шумо скриптҳоро худатон менависед ва аниқ мефаҳмед, ки онҳо чӣ гуна кор мекунанд.

Эзоҳ:

  • Устод шояд намурда бошад, ба ҷои он, шояд як нокомии шабака рух диҳад. Failover, ки аз ин бехабар аст, репликаро ба устод пешбарӣ мекунад, дар ҳоле ки устои кӯҳна корашро идома медиҳад. Дар натиҷа, мо ду серверро дар нақши устод мегирем ва намедонем, ки кадоме аз онҳо маълумоти навтарин дорад. Ин ҳолатро низ ҷудошавии мағзи сар меноманд;
  • Мо бе ҷавоб монданд. Дар конфигуратсияи мо, устод ва як реплика, пас аз гузаштан, реплика ба усто ҳаракат мекунад ва мо дигар реплика надорем, аз ин рӯ мо бояд як нусхаи навро дастӣ илова кунем;
  • Мо ба мониторинги иловагии амалиёти нокомӣ ниёз дорем, дар ҳоле ки мо 12 адад PostgreSQL дорем, яъне мо бояд 12 кластерро назорат кунем. Бо афзоиши шумораи пораҳо, шумо инчунин бояд фаромӯш накунед, ки хатогиро навсозӣ кунед.

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

Repmgr

Менеҷери такрорӣ барои кластерҳои PostgreSQL, ки метавонад амалиёти кластери PostgreSQL-ро идора кунад. Дар айни замон, он аз қуттӣ нокомии автоматӣ надорад, аз ин рӯ барои кор ба шумо лозим меояд, ки дар болои ҳалли тайёр "печтошка"-и худро нависед. Ҳамин тавр, ҳама чиз метавонад назар ба скриптҳои худнависӣ боз ҳам мураккабтар шавад, аз ин рӯ мо ҳатто Repmgr-ро кӯшиш накардем.

AWS RDS

Ҳама чизеро, ки ба мо лозим аст, дастгирӣ мекунад, медонад, ки чӣ гуна нусхабардорӣ кунад ва ҳавзи пайвастҳоро нигоҳ медорад. Он дорои гузариши худкор аст: вақте ки усто мемирад, реплика устои нав мешавад ва AWS сабти dns-ро ба устоди нав иваз мекунад, дар ҳоле ки репликаҳоро дар AZ-ҳои гуногун ҷойгир кардан мумкин аст.

Камбудиҳо мавҷуд набудани ислоҳоти хубро дар бар мегиранд. Ҳамчун намунаи танзими дақиқ: мисолҳои мо барои пайвастҳои tcp маҳдудиятҳо доранд, ки мутаассифона, дар RDS иҷро карда намешаванд:

net.ipv4.tcp_keepalive_time=10
net.ipv4.tcp_keepalive_intvl=1
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_retries2=3

Илова бар ин, AWS RDS нисбат ба нархи намунаҳои муқаррарӣ тақрибан ду маротиба гаронтар аст, ки сабаби асосии даст кашидан аз ин ҳалли масъала буд.

Патрони

Ин як қолаби python барои идоракунии PostgreSQL бо ҳуҷҷатҳои хуб, интиқоли автоматӣ ва рамзи сарчашма дар github мебошад.

Тарафҳои Patroni:

  • Ҳар як параметри конфигуратсия тасвир шудааст, маълум аст, ки он чӣ гуна кор мекунад;
  • Коркарди худкор аз қуттӣ кор мекунад;
  • Бо python навишта шудааст ва азбаски мо худамон бо python бисёр менависем, барои мо ҳалли мушкилот ва шояд ҳатто дар таҳияи лоиҳа кӯмак кардан осонтар хоҳад буд;
  • PostgreSQL-ро пурра идора мекунад, ба шумо имкон медиҳад, ки конфигуратсияро дар ҳама гиреҳҳои кластер якбора тағир диҳед ва агар кластерро барои татбиқи конфигуратсияи нав аз нав оғоз кардан лозим бошад, пас ин корро дубора бо истифода аз Patroni анҷом додан мумкин аст.

Эзоҳ:

  • Аз ҳуҷҷатҳо маълум нест, ки чӣ гуна бо PgBouncer дуруст кор кардан лозим аст. Ҳарчанд онро минус номидан душвор аст, зеро вазифаи Патрони идоракунии PostgreSQL аст ва чӣ гуна пайвастшавӣ ба Patroni аллакай мушкили мост;
  • Намунаҳои татбиқи Patroni дар ҳаҷми калон каманд, дар ҳоле ки мисолҳои аз сифр амалӣ карда мешаванд.

Дар натиҷа, мо Patroni-ро интихоб кардем, то кластери нокомиро эҷод кунем.

Раванди татбиқи Patroni

Пеш аз Patroni, мо 12 адад PostgreSQL дар конфигуратсияи як устод ва як реплика бо репликатсияи асинхронӣ доштем. Серверҳои барномаҳо ба пойгоҳи додаҳо тавассути Network Load Balancer дастрасӣ пайдо карданд, ки дар паси онҳо ду мисол бо PgBouncer буданд ва дар паси онҳо ҳама серверҳои PostgreSQL буданд.
Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Барои татбиқи Patroni, ба мо лозим буд, ки конфигуратсияи кластери тақсимшудаи анборро интихоб кунем. Патрони бо системаҳои нигоҳдории конфигуратсияи тақсимшуда, аз қабили etcd, Zookeeper, Consul кор мекунад. Мо танҳо дар бозор як кластери мукаммали консул дорем, ки дар якҷоягӣ бо Vault кор мекунад ва мо дигар онро истифода намебарем. Сабаби бузург барои оғози истифодаи Консул бо мақсади таъиншуда.

Чӣ тавр Patroni бо консул кор мекунад

Мо як кластери Консул дорем, ки аз се гиреҳ иборат аст ва кластери Patroni, ки аз пешво ва реплика иборат аст (дар Патронӣ усторо роҳбари кластер ва ғуломонро реплика меноманд). Ҳар як мисоли кластери Patroni пайваста маълумотро дар бораи ҳолати кластер ба консул мефиристад. Аз ин рӯ, аз Консул шумо ҳамеша метавонед конфигуратсияи ҷории кластери Patroni-ро бифаҳмед ва дар айни замон кӣ роҳбари аст.

Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Барои пайваст кардани Patroni ба консул, омӯхтани ҳуҷҷатҳои расмӣ кифоя аст, ки дар он гуфта мешавад, ки шумо бояд мизбонро дар формати http ё https, вобаста аз он ки мо бо консул кор мекунем ва схемаи пайвастшавӣ, ихтиёрӣ муайян кунед:

host: the host:port for the Consul endpoint, in format: http(s)://host:port
scheme: (optional) http or https, defaults to http

Ин оддӣ ба назар мерасад, аммо дар ин ҷо домҳо сар мешаванд. Бо Консул, мо тавассути пайвасти бехатар тавассути https кор мекунем ва конфигуратсияи пайвасти мо чунин хоҳад буд:

consul:
  host: https://server.production.consul:8080 
  verify: true
  cacert: {{ consul_cacert }}
  cert: {{ consul_cert }}
  key: {{ consul_key }}

Аммо ин кор намекунад. Ҳангоми оғозёбӣ, Патрони ба Консул пайваст шуда наметавонад, зеро он кӯшиш мекунад, ки тавассути http гузаред.

Рамзи ибтидоии Patroni барои ҳалли мушкилот кӯмак кард. Хуб аст, ки он бо python навишта шудааст. Маълум мешавад, ки параметри ҳост ба ҳеҷ ваҷҳ таҳлил карда намешавад ва протокол бояд дар схема нишон дода шавад. Барои мо блоки конфигуратсияи корӣ барои кор бо консул чунин аст:

consul:
  host: server.production.consul:8080
  scheme: https
  verify: true
  cacert: {{ consul_cacert }}
  cert: {{ consul_cert }}
  key: {{ consul_key }}

консул-шаблон

Ҳамин тавр, мо барои конфигуратсия нигоҳдорӣ интихоб кардем. Ҳоло мо бояд бифаҳмем, ки чӣ тавр PgBouncer ҳангоми иваз кардани лидер дар кластери Patroni конфигуратсияи худро иваз мекунад. Дар хуччатхо ба ин савол чавобе нест, зеро. дар он ҷо, асосан, кор бо PgBouncer тавсиф карда нашудааст.

Дар ҷустуҷӯи роҳи ҳалли мо, мо мақолаеро ёфтем (мутаассифона, сарлавҳаро дар ёд надорам) дар он навишта шудааст, ки Консул-шаблон дар ҷуфт кардани PgBouncer ва Patroni бисёр кӯмак кардааст. Ин моро водор кард, ки чӣ тавр кор кардани Консул-шаблонро тафтиш кунем.

Маълум шуд, ки Consul-template пайваста конфигуратсияи кластери PostgreSQL-ро дар Консул назорат мекунад. Вақте ки роҳбар иваз мешавад, он конфигуратсияи PgBouncer-ро навсозӣ мекунад ва барои аз нав бор кардани он фармон мефиристад.

Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Бартарии калони шаблон дар он аст, ки он ҳамчун код нигоҳ дошта мешавад, бинобар ин ҳангоми илова кардани порчаи нав, иҷрои ӯҳдадории нав ва навсозии қолаб ба таври худкор кофӣ аст, ки инфрасохторро ҳамчун принсипи код дастгирӣ мекунад.

Меъмории нав бо Patroni

Дар натиҷа, мо схемаи зерини корро гирифтем:
Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Ҳама серверҳои замимаҳо ба мувозинат дастрасӣ доранд → дар паси он ду мисоли PgBouncer мавҷуд аст → дар ҳар як мисол, Консул-шаблон ба кор андохта мешавад, ки ҳолати ҳар як кластери Patroni назорат мекунад ва мувофиқати конфигуратсияи PgBouncer-ро назорат мекунад, ки дархостҳоро ба роҳбари ҷорӣ мефиристад аз ҳар як кластер.

Санҷиши дастӣ

Мо ин схемаро пеш аз ба кор андохтани он дар муҳити хурди санҷишӣ иҷро кардем ва кори гузаришро тафтиш кардем. Онҳо тахтаро кушода, стикерро ба ҳаракат дароварданд ва дар ҳамин лаҳза роҳбари кластерро «куштанд». Дар AWS, ин ба мисли хомӯш кардани мисол тавассути консол оддӣ аст.

Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Стикер пас аз 10-20 сония баргашт ва боз ба таври муқаррарӣ ҳаракат кард. Ин маънои онро дорад, ки кластери Patroni дуруст кор кардааст: он роҳбарро иваз кард, маълумотро ба Консул фиристод ва Консул-шаблон фавран ин маълумотро гирифт, конфигуратсияи PgBouncer-ро иваз кард ва фармонро барои аз нав бор кардан фиристод.

Чӣ тавр дар зери бори зиёд зинда мондан ва ҳадди ақали вақти бекориро нигоҳ доштан мумкин аст?

Ҳама чиз ба таври комил кор мекунад! Аммо саволҳои нав вуҷуд доранд: он дар зери бори баланд чӣ гуна кор хоҳад кард? Ҳама чизро дар истеҳсолот чӣ гуна зуд ва бехатар ба кор бурдан мумкин аст?

Муҳити санҷишӣ, ки мо дар он санҷиши сарборӣ мегузаронем, ба мо кӯмак мекунад, ки ба саволи аввал ҷавоб диҳем. Он аз ҷиҳати меъморӣ ба истеҳсолот комилан шабеҳ аст ва маълумоти санҷиширо тавлид кардааст, ки тақрибан аз рӯи ҳаҷм ба истеҳсолот баробар аст. Мо тасмим гирифтем, ки дар давоми санҷиш яке аз устодони PostgreSQL-ро "кушем" ва бубинем, ки чӣ мешавад. Аммо пеш аз ин, тафтиш кардани гардиши автоматӣ муҳим аст, зеро дар ин муҳит мо якчанд порчаҳои PostgreSQL дорем, аз ин рӯ мо пеш аз истеҳсол санҷиши аълои скриптҳои конфигуратсияро мегирем.

Ҳарду вазифаҳо шӯҳратпараст ба назар мерасанд, аммо мо PostgreSQL 9.6 дорем. Оё мо метавонем фавран ба 11.2 навсозӣ кунем?

Мо қарор медиҳем, ки онро дар 2 қадам иҷро кунем: аввал ба 11.2 навсозӣ кунед, пас Patroni оғоз кунед.

Навсозии PostgreSQL

Барои зуд навсозии версияи PostgreSQL, интихобро истифода баред -k, ки дар он истинодҳои сахт дар диск сохта мешаванд ва ба нусхабардории маълумоти шумо лозим нест. Дар асоси 300-400 ГБ, навсозӣ 1 сонияро мегирад.

Мо пораҳои зиёде дорем, бинобар ин навсозӣ бояд ба таври худкор анҷом дода шавад. Барои ин, мо як китоби бозии Ansible навиштем, ки тамоми раванди навсозиро барои мо идора мекунад:

/usr/lib/postgresql/11/bin/pg_upgrade 
<b>--link </b>
--old-datadir='' --new-datadir='' 
 --old-bindir=''  --new-bindir='' 
 --old-options=' -c config_file=' 
 --new-options=' -c config_file='

Дар ин ҷо қайд кардан муҳим аст, ки пеш аз оғози навсозӣ, шумо бояд онро бо параметр иҷро кунед --тафтишто боварӣ ҳосил кунед, ки шумо метавонед навсозӣ кунед. Скрипти мо инчунин иваз кардани конфигуратсияҳоро дар давоми такмил медиҳад. Скрипти мо дар 30 сония анҷом ёфт, ки ин натиҷаи хуб аст.

Patroni-ро оғоз кунед

Барои ҳалли масъалаи дуюм, танҳо ба конфигуратсияи Patroni нигаред. Дар анбори расмӣ конфигуратсияи намунавӣ бо initdb мавҷуд аст, ки барои оғоз кардани базаи нав ҳангоми оғоз кардани Patroni масъул аст. Аммо азбаски мо аллакай базаи тайёр дорем, мо ин қисматро аз конфигуратсия хориҷ кардем.

Вақте ки мо насб кардани Patroni-ро дар кластери мавҷудаи PostgreSQL ва ба кор андохтани он оғоз кардем, мо ба мушкилоти нав дучор шудем: ҳарду сервер ҳамчун пешво оғоз шуданд. Патрони дар бораи ҳолати аввали кластер чизе намедонад ва мекӯшад ҳарду серверро ҳамчун ду кластери алоҳида бо ҳамон ном оғоз кунад. Барои ҳалли ин мушкилот, шумо бояд директорияро бо маълумот дар ғулом нест кунед:

rm -rf /var/lib/postgresql/

Инро танҳо ба банда кардан лозим аст!

Вақте ки як репликаи тоза пайваст мешавад, Патрони пешвои нусхабардории базавӣ месозад ва онро ба реплика барқарор мекунад ва сипас мувофиқи гузоришҳои wal ҳолати кунуниро мегирад.

Мушкилоти дигаре, ки мо дучор шудем, ин аст, ки ҳама кластерҳои PostgreSQL бо нобаёнӣ асосӣ номида мешаванд. Вақте ки ҳар як кластер дар бораи дигаре чизе намедонад, ин муқаррарӣ аст. Аммо вақте ки шумо мехоҳед Patroni-ро истифода баред, ҳамаи кластерҳо бояд номи беназир дошта бошанд. Ҳалли ин тағир додани номи кластер дар конфигуратсияи PostgreSQL мебошад.

санҷиши бор

Мо озмоишеро оғоз кардем, ки таҷрибаи корбарро дар тахтаҳо тақлид мекунад. Вақте ки сарборӣ ба арзиши миёнаи ҳаррӯзаи мо расид, мо маҳз ҳамон санҷишро такрор кардем, мо як мисолро бо раҳбари PostgreSQL хомӯш кардем. Нокомии худкор тавре кор кард, ки мо интизор будем: Патрони пешворо иваз кард, Консул-шаблон конфигуратсияи PgBouncer-ро навсозӣ кард ва фармонро барои аз нав бор кардан фиристод. Мувофиқи графикҳои мо дар Grafana, маълум буд, ки таъхирҳои 20-30 сония ва миқдори ками хатогиҳо аз серверҳои марбут ба пайвастшавӣ ба пойгоҳи додаҳо мавҷуданд. Ин як ҳолати муқаррарӣ аст, чунин арзишҳо барои нокомии мо қобили қабуланд ва бешубҳа аз вақти қатъи хидмат беҳтаранд.

Патрониро ба истехсолот оварда

Дар натиҷа, мо нақшаи зеринро таҳия кардем:

  • Ҷойгир кардани Consul-шаблон дар серверҳои PgBouncer ва оғози кор;
  • Навсозии PostgreSQL ба версияи 11.2;
  • Номи кластерро тағир диҳед;
  • Оғози кластери Patroni.

Ҳамзамон, нақшаи мо ба мо имкон медиҳад, ки нуқтаи аввалро тақрибан дар вақти дилхоҳ баён кунем, мо метавонем ҳар як PgBouncer-ро бо навбат аз кор хориҷ кунем ва дар он консул-шаблонро ҷойгир ва иҷро кунем. Ҳамин тавр мо кардем.

Барои ҷойгиркунии зуд, мо Ansible-ро истифода бурдем, зеро мо аллакай ҳамаи китобҳои бозиро дар муҳити санҷиш санҷидаем ва вақти иҷрои скрипти пурра барои ҳар як порча аз 1,5 то 2 дақиқа буд. Мо метавонем ҳама чизро бо навбат ба ҳар як порча бе қатъ кардани хидматамон паҳн кунем, аммо мо бояд ҳар як PostgreSQL-ро барои чанд дақиқа хомӯш кунем. Дар ин ҳолат, корбароне, ки маълумоташон дар ин қисм аст, дар айни замон пурра кор карда наметавонанд ва ин барои мо қобили қабул нест.

Роҳи раҳоӣ аз ин вазъият таъмири нақшавӣ буд, ки дар ҳар 3 моҳ сурат мегирад. Ин равзанаи кори ба нақша гирифташуда аст, вақте ки мо хидмати худро комилан қатъ мекунем ва намунаҳои пойгоҳи додаҳои худро навсозӣ мекунем. То равзанаи навбатӣ як ҳафта монда буд ва мо тасмим гирифтем, ки танҳо интизор шавем ва минбаъд омода шавем. Дар давоми вақти интизорӣ, мо ба таври илова худамонро муҳофизат кардем: барои ҳар як пораи PostgreSQL, дар сурати нигоҳ доштани маълумоти охирин, мо як нусхаи эҳтиётиро ба вуҷуд овардем ва барои ҳар як пора як мисоли нав илова кардем, ки он бояд дар кластери Patroni як нусхаи нав гардад, то ки фармони нест кардани маълумотро иҷро накунад. Ҳамаи ин барои кам кардани хатари хатогӣ кӯмак кард.
Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Мо хидмати худро аз нав оғоз кардем, ҳама чиз тавре кор мекард, корбарон корро идома доданд, аммо дар графикҳо мо бори ғайримуқаррариро дар серверҳои консул мушоҳида кардем.
Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Чаро мо инро дар муҳити санҷиш надидем? Ин мушкилот хеле хуб нишон медиҳад, ки инфрасохторро ҳамчун принсипи код риоя кардан ва тамоми инфрасохторро аз муҳити озмоишӣ то истеҳсолот такмил додан лозим аст. Дар акси ҳол, ба даст овардани мушкилие, ки мо дорем, хеле осон аст. Чӣ гап шуд? Консул аввал дар истеҳсолот пайдо шуд ва сипас дар муҳити озмоишӣ, дар натиҷа, дар муҳитҳои санҷишӣ, версияи консул нисбат ба истеҳсол баландтар буд. Танҳо дар яке аз нашрҳо, ихроҷи CPU ҳангоми кор бо консул-шаблон ҳал карда шуд. Аз ин рӯ, мо танҳо Консулро навсозӣ кардем ва ҳамин тавр мушкилотро ҳал кардем.

Кластери Patroni аз нав оғоз кунед

Бо вуҷуди ин, мо як мушкили нав гирифтем, ки мо ҳатто гумон намекардем. Ҳангоми навсозии Консул, мо танҳо бо истифода аз фармони раводиди консул гиреҳи консулро аз кластер хориҷ мекунем → Патрони ба сервери дигари консул пайваст мешавад → ҳама чиз кор мекунад. Аммо вақте ки мо ба охирин намунаи кластери консул расидем ва фармони рухсатии консулро ба он фиристодем, ҳама кластерҳои Patroni ба таври оддӣ дубора оғоз карданд ва дар гузоришҳо мо хатои зеринро дидем:

ERROR: get_cluster
Traceback (most recent call last):
...
RetryFailedError: 'Exceeded retry deadline'
ERROR: Error communicating with DCS
<b>LOG: database system is shut down</b>

Кластери Patroni натавонист маълумотро дар бораи кластери худ гирад ва аз нав оғоз кард.

Барои ёфтани роҳи ҳал, мо тавассути як масъала дар github бо муаллифони Patroni тамос гирифтем. Онҳо такмил додани файлҳои конфигуратсияи моро пешниҳод карданд:

consul:
 consul.checks: []
bootstrap:
 dcs:
   retry_timeout: 8

Мо тавонистем мушкилотро дар муҳити санҷиш такрор кунем ва ин вариантҳоро дар он ҷо санҷида бошем, аммо мутаассифона, онҳо кор накарданд.

Проблема холо хам хал нашуда мемонад. Мо нақша дорем, ки роҳҳои ҳалли зеринро санҷем:

  • Консул-агентро дар ҳар як мисоли кластери Patroni истифода баред;
  • Масъаларо дар код ислоҳ кунед.

Мо мефаҳмем, ки хато дар куҷо рух додааст: мушкилот эҳтимолан истифодаи вақти пешфарз аст, ки тавассути файли конфигуратсия бекор карда нашудааст. Вақте ки сервери охирини Консул аз кластер хориҷ карда мешавад, тамоми кластери консул зиёда аз як сония овезон мешавад, аз ин сабаб Patroni мақоми кластерро гирифта наметавонад ва тамоми кластерро пурра аз нав оғоз мекунад.

Хушбахтона, мо дигар ба хатогиҳо дучор нашудем.

Натиҷаҳои истифодаи Patroni

Пас аз оғози бомуваффақияти Patroni, мо дар ҳар як кластер як нусхаи иловагӣ илова кардем. Ҳоло дар ҳар як кластер як кворум мавҷуд аст: як роҳбар ва ду реплика, барои шабакаи бехатарӣ дар ҳолати ҷудошавии мағзи сар ҳангоми гузариш.
Cluster Failover PostgreSQL + Patroni. Таҷрибаи амалӣ

Патронй бештар аз се мох боз дар истехсолот кор мекунад. Дар ин муддат вай аллакай тавонист ба мо кумак кунад. Ба наздикӣ, роҳбари яке аз кластерҳо дар AWS фавтид, нокомии автоматӣ кор кард ва корбарон корро идома доданд. Патронй вазифаи асосии худро ичро кард.

Хулосаи хурди истифодаи Patroni:

  • Осонии тағир додани конфигуратсия. Тағир додани конфигуратсия дар як мисол кофӣ аст ва он ба тамоми кластер кашида мешавад. Агар барои татбиқи конфигуратсияи нав аз нав оғоз кардан лозим бошад, Patroni ба шумо хабар медиҳад. Patroni метавонад бо як фармон тамоми кластерро аз нав оғоз кунад, ки ин ҳам хеле қулай аст.
  • Нокомии худкор кор мекунад ва аллакай тавонист ба мо кӯмак кунад.
  • Навсозии PostgreSQL бе бекористии барнома. Шумо бояд аввал нусхаҳоро ба версияи нав навсозӣ кунед, пас пешворо дар кластери Patroni иваз кунед ва пешвои кӯҳнаро нав кунед. Дар ин ҳолат, санҷиши зарурии нокомии автоматӣ сурат мегирад.

Манбаъ: will.com

Илова Эзоҳ