Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

Ma ka ʻatikala e haʻi aku wau iā ʻoe pehea mākou i hoʻokokoke ai i ka pilikia o PostgreSQL hoʻomanawanui hewa, no ke aha i lilo ai i mea nui no mākou a me ka mea i hana i ka hopena.

Loaʻa iā mākou kahi lawelawe paʻa loa: 2,5 miliona mau mea hoʻohana ma ka honua holoʻokoʻa, 50K+ mea hoʻohana ikaika i kēlā me kēia lā. Aia nā kikowaena ma Amazone ma hoʻokahi māhele o ʻIlelani: 100+ mau kikowaena ʻokoʻa e hana mau ana, kahi kokoke i 50 me nā waihona.

ʻO ka hope holoʻokoʻa he palapala Java monolithic stateful nui e mālama mau ana i ka pilina websocket me ka mea kūʻai aku. Ke hana kekahi mau mea hoʻohana ma ka papa hoʻokahi i ka manawa like, ʻike lākou a pau i nā loli i ka manawa maoli, no ka mea kākau mākou i kēlā me kēia hoʻololi i ka waihona. Loaʻa iā mākou ma kahi o 10K noi i kēlā me kēia kekona i kā mākou waihona. Ma ka hoʻouka kiʻekiʻe ma Redis, kākau mākou i nā noi 80-100K i kēlā me kēia kekona.
Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

No ke aha mākou i hoʻololi ai mai Redis i PostgreSQL

I ka wā mua, ua hana pū kā mākou lawelawe me Redis, kahi hale kūʻai waiwai nui e mālama i nā ʻikepili āpau i ka RAM o ka server.

Pono o Redis:

  1. ʻO ka wikiwiki pane kiʻekiʻe, no ka mea mālama ʻia nā mea a pau i ka hoʻomanaʻo;
  2. ʻO ka maʻalahi o ka hoʻihoʻi ʻana a me ka hana hou ʻana.

ʻO nā hemahema o Redis no mākou:

  1. ʻAʻohe hana maoli. Ua ho'āʻo mākou e hoʻohālike iā lākou ma ka pae o kā mākou noi. ʻO ka mea pōʻino, ʻaʻole i hana maikaʻi kēia i nā manawa a pau a pono e kākau i nā code paʻakikī loa.
  2. ʻO ka nui o kaʻikepili i kaupalenaʻia e ka nui o ka hoʻomanaʻo. Ke piʻi aʻe ka nui o ka ʻikepili, e ulu ka hoʻomanaʻo, a, i ka hopena, e holo mākou i nā hiʻohiʻona o ka hiʻohiʻona i koho ʻia, a ma AWS e koi ai e hoʻōki i kā mākou lawelawe e hoʻololi i ke ʻano o ke ʻano.
  3. Pono e mālama mau i kahi pae latency haʻahaʻa, no ka mea. he nui loa kā mākou mau noi. ʻO ka pae lohi maikaʻi loa no mākou ʻo 17-20 ms. Ma kahi pae o 30-40 ms, loaʻa iā mākou nā pane lōʻihi i nā noi mai kā mākou noi a me ka hoʻohaʻahaʻa ʻana i ka lawelawe. ʻO ka mea pōʻino, ua loaʻa kēia iā mākou i ka mahina ʻo Kepakemapa 2018, i ka manawa i loaʻa ai kekahi o nā manawa me Redis no kekahi kumu i ka latency 2 mau manawa ma mua o ka maʻamau. No ka hoʻoholo ʻana i ka pilikia, ua kāpae mākou i ka lawelawe i ke awakea no ka mālama ʻole ʻia a hoʻololi i ka hihia Redis pilikia.
  4. He mea maʻalahi ka loaʻa ʻana o ka ʻikepili inconsistency ʻoiai me nā hewa liʻiliʻi i ke code a laila hoʻolilo i ka manawa nui e kākau i ke code e hoʻoponopono i kēia ʻikepili.

Ua noʻonoʻo mākou i nā cons a ʻike mākou pono mākou e neʻe i kahi mea maʻalahi, me nā hana maʻamau a me ka liʻiliʻi o ka hilinaʻi ʻana i ka latency. Hana ʻia ka noiʻi ʻana, nānā i nā koho he nui a koho iā PostgreSQL.

Ke neʻe nei mākou i kahi waihona hou no 1,5 mau makahiki a ua neʻe wale i kahi hapa liʻiliʻi o ka ʻikepili, no laila ke hana like nei mākou me Redis a me PostgreSQL. Ua kākau ʻia nā ʻike hou aʻe e pili ana i nā pae o ka neʻe ʻana a me ka hoʻololi ʻana i ka ʻikepili ma waena o nā waihona ʻatikala a koʻu hoa hana.

I ko mākou hoʻomaka ʻana e neʻe, ua hana pololei kā mākou noi me ka waihona a komo i ka haku Redis a me PostgreSQL. ʻO ka pūʻulu PostgreSQL kahi haku a me kahi kope me ka replication asynchronous. Penei ke ʻano o ka ʻōnaehana waihona:
Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

Ke hoʻokō nei i ka PgBouncer

ʻOiai mākou e neʻe nei, e ulu ana ka huahana: ua hoʻonui ka helu o nā mea hoʻohana a me ka helu o nā kikowaena i hana pū me PostgreSQL, a hoʻomaka mākou e nele i nā pilina. Hoʻokumu ʻo PostgreSQL i kahi kaʻina kaʻawale no kēlā me kēia pilina a hoʻopau i nā kumuwaiwai. Hiki iā ʻoe ke hoʻonui i ka helu o nā pilina a hiki i kahi kikoʻī, inā ʻaʻole hiki ke loaʻa ka hana suboptimal database. ʻO ke koho maikaʻi loa ma ia ʻano, ʻo ia ke koho ʻana i kahi luna pili e kū i mua o ke kumu.

Loaʻa iā mākou nā koho ʻelua no ka luna pili: Pgpool a me PgBouncer. Akā ʻaʻole kākoʻo ka mea mua i ke ʻano transactional o ka hana ʻana me ka waihona, no laila ua koho mākou iā PgBouncer.

Ua hoʻonohonoho mākou i kēia ʻano hana: hiki i kā mākou noi ke komo i hoʻokahi PgBouncer, ma hope o nā haku PostgreSQL, a ma hope o kēlā me kēia haku hoʻokahi kope me ka replication asynchronous.
Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

Ma ka manawa like, ʻaʻole hiki iā mākou ke mālama i ka nui o ka ʻikepili ma PostgreSQL a he mea nui ka wikiwiki o ka hana ʻana me ka waihona, no laila ua hoʻomaka mākou e sharding PostgreSQL ma ka pae noi. ʻO ka papahana i hōʻikeʻia ma luna nei he mea maʻalahi ia no kēia: i ka hoʻohuiʻana i kahi PostgreSQL shard hou, ua lawa ia e hoʻololi i ka hoʻonohonoho PgBouncer a hiki i ka noi ke hana koke me ka shard hou.

PgBouncer failover

Ua hana kēia hoʻolālā a hiki i ka manawa i make ai ka mea hoʻokahi PgBouncer. Aia mākou ma AWS, kahi e holo ai nā manawa a pau ma luna o nā hāmeʻa i make i kēlā me kēia manawa. Ma ia mau hihia, neʻe wale ka laʻana i ka ʻenehana hou a hana hou. Ua loaʻa kēia me PgBouncer, akā ʻaʻole i loaʻa. ʻO ka hopena o kēia hāʻule ʻana ʻo ka loaʻa ʻole o kā mākou lawelawe no 25 mau minuke. Manaʻo ʻo AWS i ka hoʻohana ʻana i ka redundancy ʻaoʻao o ka mea hoʻohana no ia mau kūlana, ʻaʻole i hoʻokō ʻia ma ko mākou ʻāina i kēlā manawa.

Ma hope o kēlā, noʻonoʻo koʻikoʻi mākou e pili ana i ka ʻae ʻana i ka hewa o nā pūʻulu PgBouncer a me PostgreSQL, no ka mea hiki ke ʻano like me kekahi manawa i kā mākou moʻokāki AWS.

Ua kūkulu mākou i ka PgBouncer fault tolerance scheme penei: komo nā kikowaena noi a pau i ka Network Load Balancer, aia ma hope he ʻelua PgBouncers. Nānā kēlā me kēia PgBouncer i ka haku PostgreSQL like o kēlā me kēia shard. Inā loaʻa hou kahi ulia AWS, hoʻihoʻi ʻia nā kaʻa āpau ma o PgBouncer ʻē aʻe. Hāʻawi ʻia ka Failover Load Balancer e AWS.

Maʻalahi kēia hoʻolālā e hoʻohui i nā kikowaena PgBouncer hou.
Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

E hana i kahi PostgreSQL Failover Cluster

I ka hoʻoponopono ʻana i kēia pilikia, noʻonoʻo mākou i nā koho like ʻole: failover kākau ponoʻī, repmgr, AWS RDS, Patroni.

Nā palapala kākau ponoʻī

Hiki iā lākou ke nānā i ka hana a ka haku a, inā ʻaʻole i hāʻule, hoʻolaha i ka replica i ka haku a hoʻonui i ka hoʻonohonoho PgBouncer.

ʻO nā mea maikaʻi o kēia ala ka maʻalahi loa, no ka mea, kākau ʻoe iā ʻoe iho i nā palapala a hoʻomaopopo pono i ke ʻano o kā lākou hana.

ʻAla:

  • ʻAʻole paha i make ka haku, akā, ua hiki mai paha kahi hemahema o ka pūnaewele. ʻO Failover, me ka ʻike ʻole i kēia, e hoʻolaha i ka replica i ka haku, ʻoiai e hoʻomau ka haku kahiko i ka hana. ʻO ka hopena, e loaʻa iā mākou ʻelua mau kikowaena ma ke kuleana o ka haku a ʻaʻole mākou e ʻike i ka mea o lākou i loaʻa ka ʻikepili hou loa. Ua kapa ʻia kēia kūlana ʻo split-brain;
  • Ua waiho ʻia mākou me ka pane ʻole. Ma kā mākou hoʻonohonoho, ka haku a me hoʻokahi kope, ma hope o ka hoʻololi ʻana, neʻe ka replica i luna a ʻaʻohe o mākou replica, no laila pono mākou e hoʻohui lima i kahi kope hou;
  • Pono mākou e nānā hou aku i ka hana failover, ʻoiai he 12 PostgreSQL shards, ʻo ia hoʻi, pono mākou e nānā i nā pūʻulu 12. Me ka hoʻonui ʻana i ka nui o nā shards, pono ʻoe e hoʻomanaʻo e hoʻonui i ka failover.

ʻIke paʻakikī loa ka failover kākau ponoʻī a koi aku i ke kākoʻo ʻole. Me kahi puʻupuʻu PostgreSQL hoʻokahi, ʻo ia ke koho maʻalahi loa, akā ʻaʻole ia i ka nui, no laila ʻaʻole kūpono ia no mākou.

Repmgr

Luna Hoʻoponopono no nā pūʻulu PostgreSQL, hiki iā ia ke mālama i ka hana o kahi pūʻulu PostgreSQL. I ka manawa like, ʻaʻohe ona failover ma waho o ka pahu, no laila no ka hana pono ʻoe e kākau i kāu "wrapper" ma luna o ka hopena i hoʻopau ʻia. No laila hiki i nā mea āpau ke lilo i mea paʻakikī loa ma mua o nā palapala kākau ponoʻī, no laila ʻaʻole mākou i hoʻāʻo iā Repmgr.

AWS RDS

Kākoʻo i nā mea a pau e pono ai mākou, ʻike i ka hana ʻana i nā backup a mālama i kahi wai o nā pilina. Loaʻa iā ia ka hoʻololi maʻalahi: i ka wā e make ai ka haku, lilo ka replica i haku hou, a hoʻololi ʻo AWS i ka moʻolelo dns i ka haku hou, ʻoiai hiki ke loaʻa nā replicas ma nā AZ like ʻole.

ʻO nā hemahema ka nele o nā hoʻoponopono maikaʻi. Ma ke ʻano he laʻana o ka hoʻolohe maikaʻi ʻana: he mau palena ko mākou mau manawa no nā pili tcp, ʻaʻole hiki ke hana ʻia ma RDS:

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

Eia kekahi, ʻaneʻane ʻelua ʻoi aku ka nui o ka AWS RDS ma mua o ke kumu kūʻai maʻamau, ʻo ia ke kumu nui o ka haʻalele ʻana i kēia hopena.

Patroni

He ʻano python kēia no ka hoʻokele ʻana iā PostgreSQL me nā palapala maikaʻi, failover aunoa a me ke code kumu ma github.

ʻO nā mea maikaʻi o Patroni:

  • Hōʻike ʻia kēlā me kēia ʻāpana hoʻonohonoho, maopopo ke ʻano o ka hana ʻana;
  • Hana ʻia ka failover ma waho o ka pahu;
  • Kākau ʻia ma ka python, a ʻoiai mākou iho e kākau nui i ka python, e maʻalahi iā mākou ke hoʻoponopono i nā pilikia a, malia paha, kōkua i ka hoʻomohala ʻana i ka papahana;
  • Hoʻoponopono piha i ka PostgreSQL, hiki iā ʻoe ke hoʻololi i ka hoʻonohonoho ʻana ma nā nodes a pau o ka pūʻulu i ka manawa hoʻokahi, a inā pono e hoʻomaka hou ka hui e hoʻopili i ka hoʻonohonoho hou, a laila hiki ke hana hou me ka hoʻohana ʻana iā Patroni.

ʻAla:

  • ʻAʻole maopopo i ka palapala pehea e hana pono ai me PgBouncer. ʻOiai paʻakikī ke kapa ʻia he minus, no ka mea, ʻo ka hana a Patroni ka mālama ʻana iā PostgreSQL, a pehea e hele ai nā pilina iā Patroni i ko mākou pilikia;
  • He liʻiliʻi nā hiʻohiʻona o ka hoʻokō ʻana o Patroni ma nā puke nui, ʻoiai he nui nā hiʻohiʻona o ka hoʻokō ʻana mai ka wā ʻōpala.

ʻO ka hopena, ua koho mākou iā Patroni e hana i kahi hui failover.

Ke Kaʻina Hana Patroni

Ma mua o Patroni, ua loaʻa iā mākou he 12 PostgreSQL shards i kahi hoʻonohonoho o hoʻokahi haku a hoʻokahi kope me ka replication asynchronous. Ua komo nā kikowaena noi i nā ʻikepili ma o ka Network Load Balancer, ma hope o ia mau manawa ʻelua me PgBouncer, a ma hope o lākou nā kikowaena PostgreSQL āpau.
Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

No ka hoʻokō ʻana iā Patroni, pono mākou e koho i kahi hoʻonohonoho puʻupuʻu puʻupuʻu puʻupuʻu. Hana ʻo Patroni me nā ʻōnaehana mālama hoʻonohonoho hoʻolaha e like me etcd, Zookeeper, Consul. Loaʻa iā mākou kahi pūʻulu Consul piha ma ka mākeke, e hana pū ana me Vault a ʻaʻole mākou e hoʻohana hou. He kumu nui e hoʻomaka ai e hoʻohana i ke Kanikela no kāna kumu i manaʻo ʻia.

Pehea ʻo Patroni e hana pū ai me ke Kanikela

Loaʻa iā mākou kahi pūʻulu Kanikela, aia i ʻekolu mau nodes, a me kahi hui Patroni, kahi alakaʻi a me kahi replica (ma Patroni, ua kapa ʻia ka haku ʻo ke alakaʻi cluster, a ua kapa ʻia nā kauā he replicas). Ke hoʻouna mau nei kēlā me kēia manawa o ka hui Patroni i ka ʻike e pili ana i ke kūlana o ka hui i ke Kanikela. No laila, mai ke Kanikela hiki iā ʻoe ke ʻike mau i ka hoʻonohonoho ʻana o ka hui ʻo Patroni a ʻo wai ke alakaʻi i kēia manawa.

Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

No ka hoʻohui ʻana iā Patroni i ke Kanikela, ua lawa ia e aʻo i ka palapala mana, e ʻōlelo ana e pono ʻoe e kuhikuhi i kahi mea hoʻokipa ma ka format http a i ʻole https, ma muli o ke ʻano o kā mākou hana me ke Kanikela, a me ka hoʻolālā pili, koho:

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

He mea maʻalahi ke nānā aku, akā eia ka hoʻomaka ʻana o nā lua. Me ke Kanikela, hana mākou ma luna o kahi pilina paʻa ma o https a ʻo kā mākou hoʻonohonoho pili e like me kēia:

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

Akā ʻaʻole pono kēlā. I ka hoʻomaka ʻana, ʻaʻole hiki iā Patroni ke hoʻopili iā Consul, no ka mea, hoʻāʻo ʻo ia e hele ma http.

Ua kōkua ke kumu kumu o Patroni i ka pilikia. Maikaʻi ua kākau ʻia ma ka python. ʻIke ʻia ʻaʻole i hoʻokaʻawale ʻia ka host parameter ma kekahi ʻano, a pono e kuhikuhi ʻia ka protocol ma ka hoʻolālā. Penei ke ʻano o ka poloka hoʻonohonoho hana no ka hana ʻana me ke Kanikela iā mākou:

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

consul-template

No laila, ua koho mākou i ka waihona no ka hoʻonohonoho. I kēia manawa pono mākou e hoʻomaopopo pehea e hoʻololi ai ʻo PgBouncer i kāna hoʻonohonoho ʻana i ka wā e hoʻololi ai i ke alakaʻi i ka hui ʻo Patroni. ʻAʻohe pane i kēia nīnau ma ka palapala, no ka mea. ma laila, ʻaʻole i wehewehe ʻia ka hana me PgBouncer.

I ka ʻimi ʻana i kahi hoʻonā, ua loaʻa iā mākou kahi ʻatikala (ʻaʻole wau e hoʻomanaʻo i ke poʻo inoa) kahi i kākau ʻia ai ua kōkua nui ʻo Сonsul-template i ka hui ʻana iā PgBouncer a me Patroni. ʻO kēia ka mea i koi iā mākou e noiʻi i ka hana ʻana o Consul-template.

Ua ʻike ʻia e nānā mau ana ʻo Consul-template i ka hoʻonohonoho ʻana o ka pūʻulu PostgreSQL ma Consul. Ke hoʻololi ke alakaʻi, hoʻoponopono ia i ka hoʻonohonoho PgBouncer a hoʻouna i kahi kauoha e hoʻouka hou iā ia.

Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

ʻO kahi hoʻohui nui o ka template ʻo ia ka mālama ʻana ma ke ʻano he code, no laila ke hoʻohui ʻia i kahi shard hou, ua lawa ia e hana i kahi hana hou a hoʻololi maʻalahi i ka template, e kākoʻo ana i ka Infrastructure e like me ke kumu code.

Hoʻolālā hou me Patroni

ʻO ka hopena, ua loaʻa iā mākou ka papahana o ka hana:
Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

Loaʻa nā kikowaena noi āpau i ka balancer → aia ʻelua mau manawa o PgBouncer ma hope o ia → i kēlā me kēia manawa, ua hoʻomaka ʻia ka Consul-template, nāna e nānā i ke kūlana o kēlā me kēia hui Patroni a nānā i ka pili o ka PgBouncer config, e hoʻouna ana i nā noi i ke alakaʻi o kēia manawa. o kēlā me kēia pūʻulu.

Hoʻolima lima

Ua holo mākou i kēia papahana ma mua o ka hoʻomaka ʻana ma kahi wahi hoʻāʻo liʻiliʻi a nānā i ka hana o ka hoʻololi ʻakomi. Wehe lākou i ka papa, hoʻoneʻe i ka mea hoʻopili, a i kēlā manawa "pepehi" lākou i ke alakaʻi o ka hui. Ma AWS, maʻalahi kēia e like me ka pani ʻana i ka hihia ma o ka console.

Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

Ua hoʻi hou ka sticker i loko o 10-20 kekona, a laila hoʻomaka hou e neʻe maʻamau. 'O ia ho'i, ua hana pololei ka hui Patroni: ua ho'ololi i ke alaka'i, ua ho'ouna i ka 'ike i Сonsul, a ua lawe koke 'o Сonsul-template i kēia 'ike, ua ho'ololi i ka ho'onohonoho PgBouncer a ua ho'ouna i ke kauoha e ho'ouka hou.

Pehea e ola ai ma lalo o ka ukana kiʻekiʻe a mālama i ka liʻiliʻi o ka downtime?

Hana maikaʻi nā mea a pau! Akā aia nā nīnau hou: Pehea e hana ai ma lalo o ka ukana kiʻekiʻe? Pehea e holo wikiwiki a palekana i nā mea a pau i ka hana?

ʻO ke kaiapuni hoʻāʻo kahi a mākou e hana ai i ka hoʻāʻo ukana kōkua iā mākou e pane i ka nīnau mua. Ua like loa ia me ka hana ʻana ma ke ʻano o ka hoʻolālā ʻana a ua hana ʻo ia i ka ʻikepili hoʻāʻo e like me ka nui o ka nui me ka hana. Hoʻoholo mākou e "pepehi" i kekahi o nā haku PostgreSQL i ka wā o ka hoʻāʻo a ʻike i ka mea e hana. Akā ma mua o kēlā, he mea nui e nānā i ka ʻōwili ʻana, no ka mea ma kēia kaiapuni he nui kā mākou PostgreSQL shards, no laila e loaʻa iā mākou ka hoʻāʻo maikaʻi ʻana i nā palapala hoʻonohonoho ma mua o ka hana ʻana.

ʻIke ʻia nā hana ʻelua, akā loaʻa iā mākou PostgreSQL 9.6. Hiki iā mākou ke hoʻonui koke i ka 11.2?

Hoʻoholo mākou e hana i nā ʻanuʻu 2: hoʻomaikaʻi mua i ka 11.2, a laila hoʻomaka i ka Patroni.

Hoʻohou PostgreSQL

E hoʻololi koke i ka mana PostgreSQL, e hoʻohana i ke koho -k, kahi i hana ʻia ai nā loulou paʻakikī ma ka disk a ʻaʻohe pono e kope i kāu ʻikepili. Ma nā kumu o 300-400 GB, lawe ka hoʻonui i 1 kekona.

Loaʻa iā mākou nā shards he nui, no laila pono e hana maʻalahi ka mea hou. No ka hana ʻana i kēia, ua kākau mākou i kahi puke pāʻani Ansible e mālama i ke kaʻina hana hou no mākou:

/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='

He mea nui e hoʻomaopopo ma aneʻi ma mua o ka hoʻomaka ʻana i ka hoʻomaikaʻi, pono ʻoe e hana me ka parameter --nānāe hōʻoia hiki iā ʻoe ke hoʻonui. Hoʻololi kā mākou palapala i nā configs no ka lōʻihi o ka hoʻonui. Hoʻopau kā mākou palapala i 30 kekona, he hopena maikaʻi loa ia.

Hoʻokuʻu iā Patroni

No ka hoʻoponopono ʻana i ka pilikia ʻelua, e nānā wale i ka hoʻonohonoho Patroni. Loaʻa i ka waihona kūhelu kahi hoʻonohonoho hoʻohālike me initdb, nona ke kuleana no ka hoʻomaka ʻana i kahi waihona hou i ka wā e hoʻomaka ai ʻoe iā Patroni. Akā, ʻoiai ua loaʻa iā mākou kahi waihona i hoʻomākaukau ʻia, ua wehe wale mākou i kēia ʻāpana mai ka hoʻonohonoho.

I ka wā i hoʻomaka ai mākou e hoʻokomo iā Patroni ma kahi pūʻulu PostgreSQL i kēia manawa a holo mākou, ua holo mākou i kahi pilikia hou: ua hoʻomaka nā kikowaena ʻelua ma ke ʻano he alakaʻi. ʻAʻole ʻike ʻo Patroni i kahi mea e pili ana i ke kūlana mua o ka pūʻulu a hoʻāʻo e hoʻomaka i nā kikowaena ʻelua ma ke ʻano he ʻelua pūʻulu kaʻawale me ka inoa like. No ka hoʻoponopono i kēia pilikia, pono ʻoe e holoi i ka papa kuhikuhi me ka ʻikepili ma ke kauā:

rm -rf /var/lib/postgresql/

Pono e hana kēia i ke kauā wale nō!

Ke hoʻopili ʻia kahi replica maʻemaʻe, hana ʻo Patroni i kahi alakaʻi basebackup a hoʻihoʻi iā ia i ka replica, a laila hopu i ke kūlana o kēia manawa e like me nā log wal.

ʻO kahi pilikia ʻē aʻe a mākou i hālāwai ai, ʻo ia ka inoa o nā puʻupuʻu PostgreSQL āpau ma ke ʻano maʻamau. Ke ʻike ʻole kēlā me kēia puʻupuʻu e pili ana i kekahi, he mea maʻamau kēia. Akā inā makemake ʻoe e hoʻohana iā Patroni, pono e loaʻa i nā hui āpau kahi inoa kūʻokoʻa. ʻO ka hopena e hoʻololi i ka inoa cluster ma ka hoʻonohonoho PostgreSQL.

hoʻāʻo ukana

Ua hoʻomaka mākou i kahi hoʻokolohua e hoʻohālikelike i ka ʻike mea hoʻohana ma nā papa. I ka hiki ʻana o ka ukana i kā mākou awelika waiwai o kēlā me kēia lā, ua hana hou mākou i ka hoʻāʻo like, hoʻopau mākou i hoʻokahi manawa me ke alakaʻi PostgreSQL. Ua hana ka failover maʻalahi e like me kā mākou i manaʻo ai: Ua hoʻololi ʻo Patroni i ke alakaʻi, ua hōʻano hou ʻo Consul-template i ka hoʻonohonoho PgBouncer a hoʻouna i kahi kauoha e hoʻouka hou. Wahi a kā mākou mau kiʻi ma Grafana, ua ʻike maopopo ʻia aia nā lohi o 20-30 kekona a me kahi hapa liʻiliʻi o nā hewa mai nā kikowaena pili i ka pili ʻana i ka waihona. He kūlana maʻamau kēia, ʻae ʻia kēlā mau waiwai no kā mākou failover a ʻoi aku ka maikaʻi ma mua o ka manawa o ka lawelawe.

Ke lawe mai nei i ka Patroni i ka hana

ʻO ka hopena, ua loaʻa iā mākou ka papahana aʻe:

  • E hoʻolālā i ka Consul-template i nā kikowaena PgBouncer a hoʻomaka;
  • Hoʻohou PostgreSQL i ka mana 11.2;
  • E hoʻololi i ka inoa o ka hui;
  • E hoʻomaka ana i ka Hui Patroni.

Ma ka manawa like, hiki i kā mākou papahana ke hana i ka helu mua i kēlā me kēia manawa, hiki iā mākou ke wehe i kēlā me kēia PgBouncer mai ka hana a hoʻonohonoho a holo i ka consul-template ma luna. Pēlā mākou i hana ai.

No ka hoʻouka wikiwiki ʻana, ua hoʻohana mākou iā Ansible, ʻoiai ua hoʻāʻo mākou i nā puke pāʻani āpau ma kahi ʻano hoʻāʻo, a ʻo ka manawa hoʻokō o ka palapala piha mai 1,5 a 2 mau minuke no kēlā me kēia shard. Hiki iā mākou ke ʻōwili i nā mea āpau i kēlā me kēia shard me ka ʻole o ka hoʻōki ʻana i kā mākou lawelawe, akā pono mākou e hoʻopau i kēlā me kēia PostgreSQL no kekahi mau minuke. I kēia hihia, ʻaʻole hiki i nā mea hoʻohana nona ka ʻikepili ma kēia shard ke hana piha i kēia manawa, a ʻaʻole ʻae ʻia kēia no mākou.

ʻO ke ala i waho o kēia kūlana ʻo ia ka mālama i hoʻolālā ʻia, e hana ʻia i kēlā me kēia 3 mahina. He puka makani kēia no ka hana i hoʻonohonoho ʻia, ke pani mākou i kā mākou lawelawe a hoʻomaikaʻi i kā mākou mau manawa waihona. Hoʻokahi pule i koe a hiki i ka puka makani hou, a ua hoʻoholo mākou e kali wale a hoʻomākaukau hou. I loko o ka manawa kali, ua hoʻopaʻa pū mākou iā mākou iho: no kēlā me kēia PostgreSQL shard, ua hoʻāla mākou i kahi kope kope inā ʻaʻole mālama ʻia ka ʻikepili hou loa, a ua hoʻohui i kahi mea hou no kēlā me kēia shard, pono e lilo i kope hou i ka hui Patroni, i ʻole e hoʻokō i kahi kauoha e holoi i ka ʻikepili . Ua kōkua kēia mau mea a pau e hōʻemi i ka pilikia o ka hewa.
Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

Hoʻomaka hou mākou i kā mākou lawelawe, hana nā mea āpau e like me ka mea e pono ai, hoʻomau nā mea hoʻohana i ka hana, akā ma nā kiʻi ua ʻike mākou i kahi haʻahaʻa kiʻekiʻe ma luna o nā kikowaena Consul.
Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

No ke aha mākou i ʻike ʻole ai i kēia ma ka hoʻāʻo ʻana? Hōʻike maikaʻi kēia pilikia i ka pono e hahai i ka Infrastructure ma ke ʻano he kumu code a hoʻomaʻemaʻe i ka ʻōnaehana holoʻokoʻa, mai nā wahi hoʻāʻo a hiki i ka hana ʻana. A i ʻole, maʻalahi loa ka loaʻa ʻana o ka pilikia i loaʻa iā mākou. He aha i hana ai? Ua ʻike mua ʻia ke Kanikela ma ka hana ʻana, a laila ma nā wahi hoʻāʻo, ʻo ia ka hopena, ma nā wahi hoʻāʻo, ʻoi aku ka kiʻekiʻe o ka mana o ke Kanikela ma mua o ka hana. I loko o kekahi o nā hoʻokuʻu, ua hoʻoholo ʻia kahi leak CPU i ka wā e hana ana me ka consul-template. No laila, hōʻano hou mākou i ke Kanikela, pēlā e hoʻoponopono ai i ka pilikia.

E hoʻomaka hou i ka hui ʻo Patroni

Eia naʻe, loaʻa iā mākou kahi pilikia hou, ʻaʻole mākou i kānalua. Ke hoʻohou nei mākou i ke Kanikela, wehe wale mākou i ka node Consul mai ka hui me ka hoʻohana ʻana i ke kauoha haʻalele consul → Hoʻohui ʻo Patroni i kahi kikowaena Consul ʻē aʻe → hana nā mea a pau. Akā, i ko mākou hiki ʻana i ka manawa hope loa o ka pūʻulu Kanikela a hoʻouna aku i ke kauoha haʻalele kanikela iā ia, ua hoʻomaka hou nā hui ʻo Patroni a pau, a i loko o nā lāʻau ua ʻike mākou i ka hewa penei:

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>

ʻAʻole hiki i ka hui ʻo Patroni ke kiʻi i ka ʻike e pili ana i kāna pūʻulu a hoʻomaka hou.

No ka loaʻa ʻana o kahi hopena, ua hoʻopili mākou i nā mea kākau Patroni ma o kahi pilikia ma github. Ua manaʻo lākou i nā hoʻomaikaʻi i kā mākou faila hoʻonohonoho:

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

Ua hiki iā mākou ke hana hou i ka pilikia ma kahi ʻano hoʻāʻo a hoʻāʻo i kēia mau koho ma laila, akā naʻe, ʻaʻole i hana.

ʻAʻole i hoʻoholo ʻia ka pilikia. Hoʻolālā mākou e hoʻāʻo i kēia mau hopena:

  • E hoʻohana i ka ʻĀpana Kūkākūkā ma kēlā me kēia hui hui ʻo Patroni;
  • Hoʻoponopono i ka pilikia ma ke code.

Hoʻomaopopo mākou i kahi i loaʻa ai ka hewa: ʻo ka pilikia paha ka hoʻohana ʻana i ka manawa paʻamau, ʻaʻole i kāpae ʻia ma o ka faila hoʻonohonoho. Ke hoʻopau ʻia ke kikowaena Kanikela hope loa mai ka pūʻulu, e kau ana ka pūʻulu Kanikela holoʻokoʻa ma mua o hoʻokahi kekona, no kēia mea, ʻaʻole hiki iā Patroni ke kiʻi i ke kūlana o ka pūʻulu a hoʻomaka hou i ka hui holoʻokoʻa.

ʻO ka mea pōmaikaʻi, ʻaʻole mākou i ʻike i nā hewa hou aʻe.

Nā hopena o ka hoʻohana ʻana iā Patroni

Ma hope o ka hoʻomaka ʻana o Patroni, ua hoʻohui mākou i kahi kope hou i kēlā me kēia puʻupuʻu. I kēia manawa i loko o kēlā me kēia puʻupuʻu he ʻano like o kahi kōrum: hoʻokahi alakaʻi a me ʻelua mau kope, no ka ʻupena palekana i ka wā o ka lolo i ka wā e hoʻololi ai.
Failover Cluster PostgreSQL + Patroni. ʻIke hoʻokō

Ke hana nei ʻo Patroni i ka hana ʻana ma mua o ʻekolu mahina. I kēia manawa, ua hiki iā ia ke kōkua iā mākou. I kēia mau lā, ua make ke alakaʻi o kekahi o nā puʻupuʻu ma AWS, ua hana ka failover a hoʻomau nā mea hoʻohana i ka hana. Ua hoʻokō ʻo Patrona i kāna hana nui.

ʻO kahi hōʻuluʻulu liʻiliʻi o ka hoʻohana ʻana iā Patroni:

  • ʻO ka maʻalahi o nā hoʻololi hoʻonohonoho. Ua lawa ia e hoʻololi i ka hoʻonohonoho ʻana i hoʻokahi hiʻohiʻona a e huki ʻia i luna i ka pūʻulu holoʻokoʻa. Inā koi ʻia kahi reboot e hoʻopili i ka hoʻonohonoho hou, a laila e hōʻike ʻo Patroni iā ​​ʻoe. Hiki iā Patroni ke hoʻomaka hou i ka pūʻulu holoʻokoʻa me kahi kauoha hoʻokahi, he mea maʻalahi hoʻi.
  • Hana ʻia ka failover maʻalahi a ua hoʻokō ʻo ia e kōkua iā mākou.
  • Hoʻohou ʻo PostgreSQL me ka ʻole o ka manawa haʻahaʻa. Pono ʻoe e hoʻololi mua i nā replicas i ka mana hou, a laila e hoʻololi i ke alakaʻi i ka hui ʻo Patroni a hoʻonui i ke alakaʻi kahiko. I kēia hihia, hiki mai ka hoʻāʻo pono o ka failover aunoa.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka