Yon Brèf Apèsi sou Deklarasyon PostgreSQL pou Kubernetes, Chwa nou yo ak Eksperyans

Yon Brèf Apèsi sou Deklarasyon PostgreSQL pou Kubernetes, Chwa nou yo ak Eksperyans

De pli zan pli, kliyan ap resevwa demann sa yo: "Nou vle li tankou Amazon RDS, men pi bon mache"; "Nou vle li tankou RDS, men toupatou, nan nenpòt enfrastrikti." Pou aplike tankou yon solisyon jere sou Kubernetes, nou gade nan eta aktyèl la nan operatè yo ki pi popilè pou PostgreSQL (Stolon, operatè ki soti nan Crunchy Data ak Zalando) ak fè chwa nou an.

Atik sa a se eksperyans nou te genyen tou de nan yon pwen de vi teyorik (revizyon solisyon) ak nan yon bò pratik (sa ki te chwazi ak sa ki soti nan li). Men, anvan, ann detèmine ki kondisyon jeneral yo ye pou yon ranplasman potansyèl pou RDS...

ki sa ki RDS?

Lè moun pale sou RDS, nan eksperyans nou, yo vle di yon sèvis DBMS jere ki:

  1. fasil pou konfigirasyon;
  2. gen kapasite pou travay ak snapshots epi refè yo (de preferans ak sipò PITR);
  3. pèmèt ou kreye topoloji mèt-esklav;
  4. gen yon lis rich nan ekstansyon;
  5. bay odit ak jesyon itilizatè/aksè.

Anjeneral pale, apwòch pou mete ann aplikasyon travay la ka trè diferan, men chemen an ak kondisyonèl Ansible pa pre nou. (Kòlèg ki soti nan 2GIS te rive nan yon konklizyon menm jan an kòm yon rezilta tantativ li kreye "yon zouti pou deplwaye byen vit yon gwoup failover ki baze sou Postgres.")

Operatè yo se yon apwòch komen pou rezoud pwoblèm ki sanble nan ekosistèm Kubernetes la. Direktè teknik nan "Flanta" te deja pale an plis detay sou yo an relasyon ak baz done lanse andedan Kubernetes. defonsepous youn nan rapò li yo.

NB: Pou byen vit kreye operatè senp, nou rekòmande pou peye atansyon sou sèvis piblik Open Source nou an shell-operateur. Sèvi ak li, ou ka fè sa san yo pa konnen Go, men nan fason ki pi abitye ak administratè sistèm: nan Bash, Python, elatriye.

Gen plizyè operatè K8s popilè pou PostgreSQL:

  • Stolon;
  • Crunchy Data PostgreSQL Operatè;
  • Zalando Postgres Operatè.

Ann gade yo pi byen.

Seleksyon operatè

Anplis de karakteristik enpòtan yo deja mansyone pi wo a, nou menm, kòm enjenyè operasyon enfrastrikti Kubernetes, nou te espere tou sa ki annapre yo nan men operatè yo:

  • deplwaman soti nan Git ak ak Resous Custom;
  • sipò anti-afine gous;
  • enstale ne afinite oswa seleksyon ne;
  • enstalasyon tolerans;
  • disponiblite kapasite akor;
  • teknoloji konpreyansib e menm kòmandman.

San yo pa antre nan detay sou chak nan pwen yo (mande nan kòmantè yo si ou toujou gen kesyon sou yo apre ou fin li tout atik la), mwen pral remake an jeneral ke paramèt sa yo nesesè yo dekri pi presizyon espesyalizasyon nan nœuds gwoup yo nan lòd yo kòmande yo pou aplikasyon espesifik. Fason sa a nou ka reyalize balans optimal an tèm de pèfòmans ak pri.

Koulye a, ann ale nan operatè yo PostgreSQL tèt yo.

1. Stolon

Stolon soti nan konpayi an Italyen Sorint.lab nan rapò deja mansyone te konsidere kòm yon kalite estanda nan mitan operatè pou DBMS. Sa a se yon pwojè jistis fin vye granmoun: premye lage piblik li te fèt tounen nan Novanm 2015 (!), ak depo GitHub gen anpil prèske 3000 zetwal ak 40+ kontribitè.

Vreman vre, Stolon se yon egzanp ekselan nan achitekti reflechi:

Yon Brèf Apèsi sou Deklarasyon PostgreSQL pou Kubernetes, Chwa nou yo ak Eksperyans
Ou ka jwenn aparèy operatè sa a an detay nan rapò a oswa dokiman pwojè yo. An jeneral, li sifi pou di ke li ka fè tout sa ki dekri: failover, proxy pou aksè transparan kliyan, sovgad... Anplis, proxy bay aksè atravè yon sèvis pwen final - kontrèman ak de lòt solisyon yo diskite anba a (yo chak gen de sèvis pou aksè nan baz).

Sepandan, Stolon pa gen Resous Custom, ki se poukisa li pa ka deplwaye nan yon fason ke li fasil ak rapid - "tankou gato cho" - yo kreye egzanp DBMS nan Kubernetes. Jesyon an fèt atravè sèvis piblik la stolonctl, deplwaman fèt atravè tablo Helm la, epi yo defini ak espesifye sa koutim nan ConfigMap.

Sou yon bò, li sanble ke operatè a se pa reyèlman yon operatè (apre tout, li pa sèvi ak CRD). Men, nan lòt men an, li se yon sistèm fleksib ki pèmèt ou konfigirasyon resous nan K8s jan ou wè anfòm.

Pou rezime, pou nou pèsonèlman li pa t 'sanble pi bon yo kreye yon tablo separe pou chak baz done. Se poutèt sa, nou te kòmanse chèche altènativ.

2. Croquant Data PostgreSQL Operatè

Operatè soti nan Done kroustiyan, yon jèn demaraj Ameriken, te sanble tankou yon altènatif lojik. Istwa piblik li a kòmanse ak premye lage nan mwa mas 2017, depi lè sa a depo GitHub te resevwa jis anba 1300 zetwal ak 50+ kontribitè. Yo te teste dènye lage ki soti nan mwa septanm nan pou travay avèk Kubernetes 1.15-1.18, OpenShift 3.11+ ak 4.4+, GKE ak VMware Enterprise PKS 1.3+.

Achitekti Crunchy Data PostgreSQL Operatè satisfè kondisyon yo tou:

Yon Brèf Apèsi sou Deklarasyon PostgreSQL pou Kubernetes, Chwa nou yo ak Eksperyans

Jesyon fèt atravè sèvis piblik la pgo, sepandan, li nan vire jenere Resous Custom pou Kubernetes. Se poutèt sa, operatè a kontan nou kòm itilizatè potansyèl:

  • gen kontwòl atravè CRD;
  • jesyon itilizatè pratik (tou atravè CRD);
  • entegrasyon ak lòt konpozan Croquant Data Container Suite — yon koleksyon espesyalize imaj veso pou PostgreSQL ak sèvis piblik pou travay avèk li (ki gen ladan pgBackRest, pgAudit, ekstansyon kontrib, elatriye).

Sepandan, tantativ yo kòmanse sèvi ak operatè a soti nan Crunchy Data revele plizyè pwoblèm:

  • Pa te gen okenn posiblite pou tolerans - se sèlman nodeSelector yo bay.
  • Gous ki te kreye yo te fè pati Deplwaman, malgre lefèt ke nou te deplwaye yon aplikasyon eta. Kontrèman ak StatefulSets, Deployments pa ka kreye disk.

Dènye dezavantaj la mennen nan moman komik: sou anviwònman tès la nou jere kouri 3 kopi ak yon sèl disk. depo lokal yo, sa ki lakòz operatè a rapòte ke 3 kopi t ap travay (menm si yo pa t ').

Yon lòt karakteristik nan operatè sa a se entegrasyon pare li yo ak divès kalite sistèm oksilyè. Pou egzanp, li fasil enstale pgAdmin ak pgBounce, ak nan dokiman yo konsidere Grafana ak Prometheus pre-konfigirasyon. Nan dènye lage 4.5.0-beta1 Entegrasyon amelyore ak pwojè a separeman note pgMonitor, gras a ki operatè a ofri yon vizyalizasyon klè nan mezi PgSQL soti nan bwat la.

Sepandan, chwa a etranj nan Kubernetes-pwodwi resous te mennen nou nan bezwen an jwenn yon solisyon diferan.

3. Zalando Postgres Operatè

Nou te konnen pwodwi Zalando pou yon tan long: nou gen eksperyans lè l sèvi avèk Zalenium ak, nan kou, nou te eseye Patroni se solisyon HA popilè yo pou PostgreSQL. Konsènan apwòch konpayi an pou kreye Operatè Postgres youn nan otè li yo, Alexey Klyukin, te di sou lè Postgres-Madi #5, e nou te renmen li.

Sa a se solisyon an pi piti diskite nan atik la: premye lage a te fèt nan mwa Out 2018. Sepandan, menm malgre ti kantite degaje fòmèl, pwojè a te vini yon fason lontan, deja depase nan popilarite solisyon an soti nan Crunchy Data ak 1300 + zetwal sou GitHub ak kantite maksimòm kontribitè (70 +).

"Anba kapo a" operatè sa a sèvi ak solisyon tan teste:

Men ki jan achitekti operatè nan Zalando prezante:

Yon Brèf Apèsi sou Deklarasyon PostgreSQL pou Kubernetes, Chwa nou yo ak Eksperyans

Operatè a konplètman jere atravè Resous Custom, otomatikman kreye yon StatefulSet soti nan resipyan, ki ka Lè sa a, dwe Customized lè w ajoute plizyè sidecars nan gous la. Tout bagay sa a se yon avantaj enpòtan an konparezon ak operatè a soti nan Done Crunchy.

Depi nou te chwazi solisyon an nan Zalando nan mitan 3 opsyon yo anba konsiderasyon, yon deskripsyon plis kapasite li yo pral prezante anba a, imedyatman ansanm ak pratik aplikasyon an.

Pratike ak Operatè Postgres ki soti nan Zalando

Deplwaman operatè a trè senp: jis telechaje lage aktyèl la nan GitHub epi aplike dosye YAML yo nan anyè a. manifeste. Altènativman, ou ka itilize tou operatorhub.

Apre enstalasyon, ou ta dwe enkyete sou mete kanpe depo pou mòso bwa ak sovgad. Sa a se fè atravè ConfigMap postgres-operator nan espas non kote ou enstale operatè a. Yon fwa ke depo yo konfigirasyon, ou ka deplwaye premye gwoup PostgreSQL ou a.

Pou egzanp, deplwaman estanda nou an sanble sa a:

apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
 name: staging-db
spec:
 numberOfInstances: 3
 patroni:
   synchronous_mode: true
 postgresql:
   version: "12"
 resources:
   limits:
     cpu: 100m
     memory: 1Gi
   requests:
     cpu: 100m
     memory: 1Gi
 sidecars:
 - env:
   - name: DATA_SOURCE_URI
     value: 127.0.0.1:5432
   - name: DATA_SOURCE_PASS
     valueFrom:
       secretKeyRef:
         key: password
         name: postgres.staging-db.credentials
   - name: DATA_SOURCE_USER
     value: postgres
   image: wrouesnel/postgres_exporter
   name: prometheus-exporter
   resources:
     limits:
       cpu: 500m
       memory: 100Mi
     requests:
       cpu: 100m
       memory: 100Mi
 teamId: staging
 volume:
   size: 2Gi

Manifest sa a deplwaye yon gwoup 3 ka ak yon sidecar nan fòm lan postgres_exporter, ki soti nan ki nou pran mezi aplikasyon an. Kòm ou ka wè, tout bagay se trè senp, epi si ou vle, ou ka kreye yon kantite literalman san limit nan grap.

Li vo peye atansyon a panèl administrasyon entènèt - postgres-operatè-ui. Li vini ak operatè a epi li pèmèt ou kreye ak efase grap, osi byen ke travay ak sovgad ki fèt pa operatè a.

Yon Brèf Apèsi sou Deklarasyon PostgreSQL pou Kubernetes, Chwa nou yo ak Eksperyans
Lis grap PostgreSQL

Yon Brèf Apèsi sou Deklarasyon PostgreSQL pou Kubernetes, Chwa nou yo ak Eksperyans
Jesyon sovgad

Yon lòt karakteristik enteresan se sipò a Ekip API. Mekanis sa a otomatikman kreye wòl nan PostgreSQL, ki baze sou lis non itilizatè yo. Lè sa a, API a pèmèt ou retounen yon lis itilizatè pou wòl yo otomatikman kreye.

Pwoblèm ak solisyon

Sepandan, itilizasyon operatè a byento revele plizyè enpèfeksyon enpòtan:

  1. mank de sipò nodeSelector;
  2. enkapasite pou enfim sovgad;
  3. lè w ap itilize fonksyon kreyasyon baz done a, privilèj default pa parèt;
  4. Pafwa dokiman ki manke oswa ki pa dat.

Erezman, anpil nan yo ka rezoud. Ann kòmanse nan fen a - pwoblèm ak dokimantasyon.

Gen plis chans, ou pral rankontre lefèt ke li pa toujou klè ki jan yo anrejistre yon backup ak ki jan yo konekte bokit la backup ak UI a operatè. Dokimantasyon an pale sou sa an pasan, men deskripsyon reyèl la se nan PR:

  1. bezwen fè yon sekrè;
  2. pase li bay operatè a kòm yon paramèt pod_environment_secret_name nan CRD a ak paramèt operatè a oswa nan ConfigMap (depann sou fason ou deside enstale operatè a).

Sepandan, kòm li vire soti, sa a se kounye a enposib. Se poutèt sa nou kolekte vèsyon ou nan operatè a ak kèk devlopman twazyèm pati adisyonèl. Pou plis enfòmasyon sou li, gade anba a.

Si ou pase paramèt yo pou backup bay operatè a, sètadi - wal_s3_bucket ak kle aksè nan AWS S3, Lè sa a, li pral backup tout bagay: se pa sèlman baz nan pwodiksyon, men tou, sèn. Sa a pa t 'koresponn ak nou.

Nan deskripsyon paramèt yo pou Spilo, ki se wrapper debaz Docker pou PgSQL lè w ap itilize operatè a, li te tounen soti: ou ka pase yon paramèt. WAL_S3_BUCKET vid, kidonk enfim sovgad. Anplis, ak anpil kè kontan, mwen te jwenn pare PR, ki nou imedyatman aksepte nan fouchèt nou an. Koulye a, ou jis bezwen ajoute enableWALArchiving: false nan yon resous gwoup PostgreSQL.

Wi, te gen yon opòtinite pou fè li yon fason diferan nan kouri 2 operatè: youn pou sèn (san sovgad), ak dezyèm lan pou pwodiksyon an. Men, nou te kapab fè fas ak youn.

Oke, nou te aprann ki jan yo transfere aksè nan baz done yo pou S3 ak sovgad yo te kòmanse antre nan depo. Ki jan fè paj backup travay nan Operatè UI?

Yon Brèf Apèsi sou Deklarasyon PostgreSQL pou Kubernetes, Chwa nou yo ak Eksperyans

Ou pral bezwen ajoute 3 varyab nan entèfas operatè a:

  • SPILO_S3_BACKUP_BUCKET
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

Apre sa, jesyon nan sovgad ap vin disponib, ki nan ka nou an pral senplifye travay la ak sèn, sa ki pèmèt nou delivre tranch soti nan pwodiksyon la san yo pa Scripts adisyonèl.

Yon lòt avantaj se te travay ak API Ekip yo ak anpil opòtinite pou kreye baz done ak wòl lè l sèvi avèk zouti operatè yo. Sepandan, kreye a wòl pa te gen okenn dwa pa default. An konsekans, yon itilizatè ki gen dwa li pa t 'kapab li nouvo tab.

Poukisa se sa? Malgre lefèt ke nan kòd la gen nesesè GRANT, yo pa toujou itilize. Gen 2 metòd: syncPreparedDatabases и syncDatabases. Nan syncPreparedDatabases - malgre lefèt ke nan seksyon an preparedDatabases gen gen yon kondisyon defaultRoles и defaultUsers pou kreye wòl, dwa default yo pa aplike. Nou nan pwosesis pou prepare yon patch pou dwa sa yo aplike otomatikman.

Ak dènye pwen nan amelyorasyon ki enpòtan pou nou - patch, ki ajoute Node Affinity nan StatefulSet ki te kreye. Kliyan nou yo souvan prefere diminye depans lè yo sèvi ak ka tach, epi yo klèman pa vo hosting sèvis baz done. Pwoblèm sa a ka rezoud atravè tolerans, men prezans Node Affinity bay pi gwo konfyans.

sak pase?

Baze sou rezilta yo nan rezoud pwoblèm ki anwo yo, nou fourche Postgres Operatè soti nan Zalando nan depo ou a, kote li kolekte ak plak sa yo itil. Ak pou pi gwo konvenyans, nou tou kolekte Docker imaj.

Lis PR yo aksepte nan fouchèt la:

Li pral gwo si kominote a sipòte PR sa yo pou yo jwenn en ak pwochen vèsyon an nan operatè a (1.6).

Bonis! Istwa siksè migrasyon pwodiksyon an

Si w sèvi ak Patroni, pwodiksyon an ap viv la ka imigre nan operatè a ak yon ti interruption.

Spilo pèmèt ou kreye grap sibstiti atravè depo S3 ak Wal-E, lè PgSQL binè boutèy la premye estoke nan S3 ak Lè sa a, ponpe soti pa kopi a. Men, sa pou w fè si ou genyen pa gen okenn itilize pa Wal-E sou ansyen enfrastrikti? Solisyon an pou pwoblèm sa a deja li te sijere sou mwaye a.

Replikasyon lojik PostgreSQL vin sekou. Sepandan, nou pa pral antre nan detay sou fason pou kreye piblikasyon ak abònman, paske... plan nou an te yon fyasko.

Reyalite a se ke baz done a te gen plizyè tab chaje ak dè milyon de ranje, ki, Anplis, yo te toujou ap ranpli ak efase. Senp abònman с copy_data, Lè kopi nouvo a kopye tout sa ki soti nan mèt la, li tou senpleman pa ka kenbe moute ak mèt la. Kopi kontni te travay pou yon semèn, men pa janm kenbe ak mèt la. Nan fen, li te ede m rezoud pwoblèm nan atik kòlèg ki soti nan Avito: ou ka transfere done lè l sèvi avèk pg_dump. Mwen pral dekri vèsyon nou an (yon ti kras modifye) nan algorithm sa a.

Lide a se ke ou ka fè yon abònman andikape mare nan yon plas replikasyon espesifik, ak Lè sa a, korije nimewo tranzaksyon an. Te gen kopi ki disponib pou travay pwodiksyon an. Sa a enpòtan paske kopi a pral ede kreye yon pil fatra ki konsistan epi kontinye resevwa chanjman nan men mèt la.

Kòmandman ki vin apre ki dekri pwosesis migrasyon an pral sèvi ak notasyon lame sa yo:

  1. mèt - sèvè sous;
  2. kopi 1 — difizyon kopi sou pwodiksyon an fin vye granmoun;
  3. kopi 2 - nouvo kopi lojik.

Plan migrasyon

1. Kreye yon abònman sou mèt la pou tout tab nan chema a public baz dbname:

psql -h master -d dbname -c "CREATE PUBLICATION dbname FOR ALL TABLES;"

2. Kreye yon plas replikasyon sou mèt la:

psql -h master -c "select pg_create_logical_replication_slot('repl', 'pgoutput');"

3. Sispann repwodiksyon sou ansyen kopi a:

psql -h replica1 -c "select pg_wal_replay_pause();"

4. Jwenn nimewo tranzaksyon an nan men mèt la:

psql -h master -c "select replay_lsn from pg_stat_replication where client_addr = 'replica1';"

5. Retire pil fatra a nan ansyen kopi a. Nou pral fè sa nan plizyè fil, ki pral ede akselere pwosesis la:

pg_dump -h replica1 --no-publications --no-subscriptions -O -C -F d -j 8 -f dump/ dbname

6. Telechaje pil fatra a sou nouvo sèvè a:

pg_restore -h replica2 -F d -j 8 -d dbname dump/

7. Apre w fin telechaje pil fatra a, ou ka kòmanse replikasyon sou kopi difizyon an:

psql -h replica1 -c "select pg_wal_replay_resume();"

7. Ann kreye yon abònman sou yon nouvo kopi lojik:

psql -h replica2 -c "create subscription oldprod connection 'host=replica1 port=5432 user=postgres password=secret dbname=dbname' publication dbname with (enabled = false, create_slot = false, copy_data = false, slot_name='repl');"

8. Ann jwenn oid abònman:

psql -h replica2 -d dbname -c "select oid, * from pg_subscription;"

9. Ann di li te resevwa oid=1000. Ann aplike nimewo tranzaksyon an nan abònman an:

psql -h replica2 -d dbname -c "select pg_replication_origin_advance('pg_1000', 'AA/AAAAAAAA');"

10. Ann kòmanse replikasyon:

psql -h replica2 -d dbname -c "alter subscription oldprod enable;"

11. Tcheke estati abònman an, replikasyon ta dwe travay:

psql -h replica2 -d dbname -c "select * from pg_replication_origin_status;"
psql -h master -d dbname -c "select slot_name, restart_lsn, confirmed_flush_lsn from pg_replication_slots;"

12. Apre replikasyon yo kòmanse ak baz done yo senkronize, ou ka chanje sou.

13. Apre enfimite replikasyon, ou bezwen korije sekans yo. Sa a byen dekri nan atik la sou wiki.postgresql.org.

Mèsi a plan sa a, chanjman an te fèt ak reta minim.

Konklizyon

Operatè Kubernetes pèmèt ou senplifye plizyè aksyon lè yo redui yo nan kreyasyon resous K8 yo. Sepandan, li te reyalize automatisation remakab ak èd yo, li vo sonje ke li kapab tou pote yon kantite nuans inatandi, kidonk chwazi operatè ou yo avèk sajès.

Lè nou te konsidere twa operatè Kubernetes ki pi popilè pou PostgreSQL, nou te chwazi pwojè a nan Zalando. Epi nou te oblije simonte kèk difikilte ak li, men rezilta a te reyèlman plezi, kidonk nou planifye pou elaji eksperyans sa a nan kèk lòt enstalasyon PgSQL. Si ou gen eksperyans lè l sèvi avèk solisyon menm jan an, nou pral kontan wè detay yo nan kòmantè yo!

PS

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè