He Tirohanga Poto mo nga Tauākī PostgreSQL mō Kubernetes, ā mātou Kōwhiringa me ā mātou Wheako

He Tirohanga Poto mo nga Tauākī PostgreSQL mō Kubernetes, ā mātou Kōwhiringa me ā mātou Wheako

Kei te piki ake, kei te whiwhi nga kaihoko i nga tono e whai ake nei: "E hiahia ana matou kia rite ki te Amazon RDS, engari he iti ake"; "Kei te pirangi matou kia rite ki te RDS, engari i nga waahi katoa, i nga hanganga katoa." Hei whakatinana i taua otinga whakahaere i runga i te Kubernetes, i titiro matou ki te ahua o naianei o nga kaiwhakahaere rongonui mo PostgreSQL (Stolon, nga kaiwhakahaere mai i Crunchy Data me Zalando) me te whiriwhiri.

Ko tenei tuhinga te wheako i whakawhiwhia e matou mai i te tirohanga ariā (arotake o nga otinga) me te taha mahi (he aha i whiriwhiria me te aha i puta mai). Engari tuatahi, me whakatau he aha nga whakaritenga whanui mo te whakakapinga pea mo te RDS...

He aha te RDS

Ina korero nga tangata mo te RDS, i roto i o maatau wheako, ko te tikanga he ratonga DBMS whakahaere e:

  1. ngawari ki te whirihora;
  2. he kaha ki te mahi me nga whakaahua me te whakaora mai i a raatau (he pai ake me te tautoko PITR);
  3. ka taea e koe te hanga topologies rangatira-pononga;
  4. he rarangi nui o nga toronga;
  5. e whakarato ana i te arotake me te whakahaere kaiwhakamahi/whakauru.

Ko te tikanga, he tino rereke nga huarahi ki te whakatinana i nga mahi kei a koe, engari ko te ara me te Ansible herenga kaore i te tata ki a tatou. (Ko nga hoa mahi mai i te 2GIS i rite ki te whakatau tana nganatanga Waihangahia "he taputapu mo te tuku tere i te roopu failover-a-Postgres.")

Ko nga kaiwhakahaere he huarahi noa mo te whakaoti rapanga rite i roto i te rauwiringa kaiao Kubernetes. Ko te kaiwhakahaere hangarau o "Flanta" kua korero ake mo ratou e pa ana ki nga papaunga raraunga kua whakarewahia ki roto o Kubernetes. distoli roto tetahi o ana ripoata.

NB: Ki te hanga tere i nga kaiwhakahaere ngawari, ka tūtohu matou kia aro ki a maatau taputapu Open Source anga-kaiwhakahaere. Ma te whakamahi, ka taea e koe te mahi me te kore e mohio ki a Haere, engari i nga huarahi e tino mohio ana ki nga kaiwhakahaere punaha: i Bash, Python, etc.

He maha nga kaiwhakahaere K8 rongonui mo PostgreSQL:

  • Stolon;
  • Raraunga Crunchy PostgreSQL Kaiwhakahaere;
  • Zalando Postgres Kaiwhakahaere.

Kia ata titiro tatou ki a raatau.

Kōwhiringa kaiwhakahaere

I tua atu i nga ahuatanga nui kua whakahuahia ake nei, ko matou - he miihini whakahaere hanganga a Kubernetes - i tumanakohia e whai ake nei mai i nga kaiwhakahaere:

  • tuku mai i Git me te Rauemi Ritenga;
  • tautoko anti-affinity pod;
  • te whakauru i te hononga node, te kaiwhiri node ranei;
  • te whakaurunga o nga here;
  • te waatea o nga kaha o te whakatika;
  • nga hangarau mohio me nga whakahau.

Ma te kore e uru ki nga korero mo ia o nga tohu (patai i roto i nga korero mena kei a koe tonu nga patai mo ratou i muri i te panui i te tuhinga katoa), ka kite ahau i te nuinga o te waa e hiahiatia ana enei tawhā ki te whakaahua tika ake i te motuhake o nga kohinga kohinga kia pai ai. tono mo nga tono motuhake. Ma tenei ka taea e tatou te whakatutuki i te pauna tino pai mo te mahi me te utu.

Inaianei me neke atu ki nga kaiwhakahaere PostgreSQL ake.

1. Stolon

Stolon mai i te kamupene Itari Sorint.lab i roto i kua korerohia te ripoata i whakaarohia he momo paerewa i waenga i nga kaiwhakahaere mo te DBMS. He kaupapa tino tawhito tenei: ko tana tukunga tuatahi mo te iwi i puta i te marama o Whiringa-a-rangi 2015(!), A ko te putunga GitHub e whakanui ana i te tata ki te 3000 whetu me te 40+ kaikoha.

Ae, he tauira pai a Stolon mo te hoahoanga whakaaro:

He Tirohanga Poto mo nga Tauākī PostgreSQL mō Kubernetes, ā mātou Kōwhiringa me ā mātou Wheako
Ko te taputapu o tenei kaiwhakahaere ka kitea i roto i nga korero i roto i te ripoata ranei tuhinga kaupapa. I te nuinga o te waa, kati noa ki te kii ka taea e ia nga mea katoa e whakaahuatia ana: te ngoikore, nga takawaenga mo te urunga o nga kaihoko marama, nga taapiri... I tua atu, ka tukuna e nga takawaenga te uru ma roto i tetahi ratonga mutunga - kaore i rite ki era atu otinga e rua e korerohia ana i raro nei (e rua nga ratonga mo ia tangata. turanga uru).

Heoi, Stolon kahore Rauemi Ritenga, he aha te take e kore ai e taea te tuku kia ngawari me te tere - "penei i nga keke wera" - ki te hanga tauira DBMS i Kubernetes. Ka whakahaerehia te whakahaere ma te whaipainga stolonctl, ka mahia ma te tūtohi Helm, ka tautuhia, ka tohua ki te ConfigMap.

I tetahi taha, ka puta ko te kaiwhakahaere ehara i te tino kaiwhakahaere (i muri i nga mea katoa, kaore i te whakamahi i te CRD). Engari i tetahi atu ringa, he punaha ngawari e taea ai e koe te whirihora i nga rauemi i roto i nga K8s kia rite ki taau e pai ai.

Hei whakarapopototanga, ki a matou ake kaore i tino pai ki te hanga i tetahi tūtohi motuhake mo ia putunga raraunga. Na reira, i timata matou ki te rapu huarahi.

2. Raraunga Crunchy PostgreSQL Kaiwhakahaere

Kaiwhakahaere mai i te Crunchy Data, he rangatahi whakaoho Amerika, he ahua ke atu. Ko te hitori o te iwi ka timata i te tukunga tuatahi i te Maehe 2017, mai i tera wa kua riro mai i te putunga GitHub i raro iho i te 1300 nga whetu me te 50+ o nga kaikoha. Ko te tukunga hou mai i Mahuru i whakamatauria ki te mahi tahi me Kubernetes 1.15-1.18, OpenShift 3.11+ me 4.4+, GKE me VMware Enterprise PKS 1.3+.

Ko te hoahoanga o Crunchy Data PostgreSQL Kaiwhakahaere e tutuki ana i nga whakaritenga kua kiia:

He Tirohanga Poto mo nga Tauākī PostgreSQL mō Kubernetes, ā mātou Kōwhiringa me ā mātou Wheako

Ka puta te whakahaere ma te whaipainga pgo, heoi, ka whakaputahia e ia nga Rauemi Ritenga mo Kubernetes. Na reira, i pai te kaiwhakahaere ki a matou hei kaiwhakamahi pea:

  • he mana whakahaere ma te CRD;
  • te whakahaere kaiwhakamahi ngawari (ma te CRD ano hoki);
  • te whakauru ki etahi atu waahanga Huanga Ipu Raraunga Crunchy - he kohinga motuhake o nga whakaahua ipu mo te PostgreSQL me nga taputapu mo te mahi ki a ia (tae atu ki te pgBackRest, pgAudit, taapiri mai i te takoha, me etahi atu).

Heoi, ko nga ngana ki te tiimata ki te whakamahi i te kaiwhakahaere mai i te Crunchy Data i kitea he maha nga raru:

  • Karekau he waahi ka taea - ko te nodeSelector anake ka tukuna.
  • Ko nga peera i hangaia he waahanga o te Whakamahinga, ahakoa te mea i tukuna e matou he tono mana. Kaore i rite ki nga StatefulSets, kaore e taea e Deployments te hanga kōpae.

Ko te whakahokinga whakamutunga ka arahi ki nga waa rorirori: i runga i te taiao whakamatautau i whakahaerehia e matou nga tauira e 3 me te kopae kotahi. rokiroki rohe, i kii mai te kaiwhakahaere e 3 nga tauira e mahi ana (ahakoa karekau).

Ko tetahi atu ahuatanga o tenei kaiwhakahaere ko tana whakaurunga kua rite ki nga momo punaha tautoko. Hei tauira, he ngawari ki te whakauru i te pgAdmin me te pgBounce, me roto tuhinga Ko te Grafana me te Prometheus i whirihora i mua ka whakaarohia. I tata nei tuku 4.5.0-beta1 Ko te pai ake o te whakaurunga ki te kaupapa ka tuhia motuhake pgMonitor, he mihi ki tenei ka tukuna e te kaiwhakahaere he tirohanga maamaa o nga inenga PgSQL i waho o te pouaka.

Heoi, na te kowhiringa rereke o nga rauemi i hangaia e Kubernetes i arai matou ki te rapu huarahi rereke.

3. Zalando Postgres Kaiwhakahaere

Kua mohio matou ki nga hua Zalando mo te wa roa: kua whai wheako matou ki te whakamahi i te Zalenium me te tikanga, i whakamatau matou Patroni Ko ta ratou otinga HA rongonui mo PostgreSQL. Mo te huarahi a te kamupene ki te hanga Kaiwhakahaere Postgres Ko tetahi o ona kaituhi, Alexey Klyukin, i kii i runga i te rangi Pouaka-Tuare #5, a pai ana matou.

Koinei te otinga iti rawa i korerohia i roto i te tuhinga: ko te tukunga tuatahi i puta i Akuhata 2018. Heoi, ahakoa te iti o nga whakaputanga okawa, kua tae mai te kaupapa, kua eke ki runga ake i te rongonui i te otinga mai i te Crunchy Data me te 1300+ whetu i runga i te GitHub me te nuinga o nga kaikoha (70+).

"I raro i te awhi" ka whakamahia e tenei kaiwhakahaere nga otinga kua whakamatauria i te waa:

Koinei te ahua o te hoahoanga kaiwhakahaere mai i Zalando:

He Tirohanga Poto mo nga Tauākī PostgreSQL mō Kubernetes, ā mātou Kōwhiringa me ā mātou Wheako

Ka tino whakahaerehia te kaiwhakahaere ma nga Rauemi Ritenga, ka hanga aunoa he StatefulSet mai i nga ipu, katahi ka taea te whakarite ma te taapiri i nga momo waka taha ki te pona. He painga nui tenei katoa ki te whakataurite ki te kaiwhakahaere mai i te Crunchy Data.

I te mea i kowhiria e matou te otinga mai i a Zalando i roto i nga whiringa 3 e whakaarohia ana, ka whakaatuhia he whakamaarama mo ona kaha ki raro, me te mahi tono.

Parakatihi me te Kaiwhakahaere Postgres mai i Zalando

He tino ngawari te whakaurunga a te kaiwhakahaere: tango noa i te tukunga o naianei mai i GitHub ka tono i nga konae YAML mai i te raarangi. whakakitenga. I tua atu, ka taea e koe te whakamahi operatorhub.

I muri i te whakaurunga, me awangawanga koe mo te whakatuu rokiroki mo nga raarangi me nga taapiri. Ka mahia tenei ma te ConfigMap postgres-operator i te mokowāingoa i whakauruhia e koe te kaiwhakahaere. Kia whirihorahia nga putunga, ka taea e koe te toha i to roopu PostgreSQL tuatahi.

Hei tauira, he penei te ahua o ta maatau whakatakotoranga paerewa:

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

Ka tukuna e tenei whakaaturanga he huinga o nga wa e 3 me te taha o te motuka postgres_exporter, ka tangohia e matou nga inenga tono. Ka taea e koe te kite, he tino ngawari nga mea katoa, a, ki te hiahia koe, ka taea e koe te hanga i te maha o nga tautau.

He mea tika kia aro atu pae tukutuku whakahaere - postgres-operator-ui. Ka tae mai me te kaiwhakahaere ka taea e koe te hanga me te whakakore i nga tautau, me te mahi me nga taapiri i hangaia e te kaiwhakahaere.

He Tirohanga Poto mo nga Tauākī PostgreSQL mō Kubernetes, ā mātou Kōwhiringa me ā mātou Wheako
Rarangi o nga tautau PostgreSQL

He Tirohanga Poto mo nga Tauākī PostgreSQL mō Kubernetes, ā mātou Kōwhiringa me ā mātou Wheako
Te whakahaeretanga o te taapiri

Ko tetahi atu mea whakamiharo ko te tautoko API Kapa. Ka hanga aunoa tenei tikanga nga mahi i roto i te PostgreSQL, i runga i te rarangi ingoa ingoa kua puta. Na te API ka taea e koe te whakahoki mai i te rarangi o nga kaiwhakamahi kua hanga aunoatia nga mahi.

Nga raruraru me nga otinga

Heoi, ko te whakamahinga o te kaiwhakawhanake kaore i roa kua kitea etahi ngoikoretanga nui:

  1. te kore tautoko nodeSelector;
  2. te kore e taea te whakakore i nga taapiri;
  3. i te wa e whakamahi ana i te mahi hanga raraunga, kaore e puta nga mana taunoa;
  4. I ia wa, kei te ngaro nga tuhinga, kua tawhito ranei.

Waimarie, he maha o raatau ka taea te whakatau. Me timata mai i te mutunga - nga raruraru me tuhinga.

Ko te nuinga pea, ka tupono koe ki te kore e tino marama me pehea te rehita i te taapiri me te hono i te peere taapiri ki te Kaiwhakahaere UI. Ko nga tuhinga e korero ana mo tenei, engari kei roto te tino whakamaarama PR:

  1. me mahi huna;
  2. tuku atu ki te kaiwhakahaere hei tawhā pod_environment_secret_name i roto i te CRD me nga tautuhinga kaiwhakahaere, i te ConfigMap ranei (i runga i to whakatau ki te whakauru i te kaiwhakahaere).

Heoi, i te mea ka puta, kaore e taea tenei i tenei wa. Koia matou i kohi ai to putanga o te kaiwhakahaere me etahi atu whanaketanga-tuatoru. Mo etahi atu korero mo taua mea, tirohia i raro nei.

Mena ka tukuna e koe nga tawhā mo te taapiri ki te kaiwhakahaere, ara - wal_s3_bucket me nga taviri uru ki AWS S3, katahi ka pūrua nga mea katoa: ehara i te mea ko nga turanga anake i roto i te hanga, engari ano hoki te whakaari. Kaore tenei i pai ki a maatau.

I roto i te whakaahuatanga o nga tawhā mo Spilo, koinei te takai Docker taketake mo PgSQL i te wa e whakamahi ana i te kaiwhakahaere, ka puta: ka taea e koe te tuku i tetahi tawhā. WAL_S3_BUCKET noho kau, na reira ka whakakorehia nga taapiri. Hau atu â, ua ite au i te oaoa rahi kua rite PR, i whakaae tonu matou ki to matou marau. Inaianei me taapiri noa koe enableWALArchiving: false ki tetahi rauemi kohinga PostgreSQL.

Ae, i whai waahi ki te mahi rereke ma te whakahaere i nga kaiwhakahaere 2: kotahi mo te whakaari (kaore he taapiri), me te tuarua mo te hanga. Engari i taea e matou te mahi ki tetahi.

Ae, i ako matou me pehea te whakawhiti i te uru ki nga papaa raraunga mo te S3 ka timata nga taapiri ki te uru ki te rokiroki. Me pehea te mahi i nga wharangi taapiri ki te Kaiwhakahaere UI?

He Tirohanga Poto mo nga Tauākī PostgreSQL mō Kubernetes, ā mātou Kōwhiringa me ā mātou Wheako

Me taapiri koe kia 3 nga taurangi ki te Kaiwhakahaere UI:

  • SPILO_S3_BACKUP_BUCKET
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

Whai muri i tenei, ka waatea te whakahaere o nga taapiri, i roto i ta maatau keehi ka ngawari te mahi me te whakaari, ka taea e maatau te tuku poro mai i te whakaputanga ki reira kaore he tuhinga taapiri.

Ko tetahi atu painga ko te mahi me te Teams API me te maha o nga waahi mo te hanga papaa raraunga me nga mahi ma te whakamahi i nga taputapu kaiwhakahaere. Heoi, ko te hanga karekau he motika a nga mahi. Na reira, karekau e taea e te kaiwhakamahi whai mana panui te panui ripanga hou.

He aha tera? Ahakoa te meka i roto i te waehere ko pono ana GRANT, kaore e whakamahia i nga wa katoa. E 2 nga tikanga: syncPreparedDatabases и syncDatabases. Ko te syncPreparedDatabases - ahakoa te mea kei roto i te waahanga preparedDatabases ko he tikanga defaultRoles и defaultUsers ki te hanga tūranga, karekau e whakamahia nga motika taunoa. Kei te whakareri matou i tetahi papaki kia taea ai te whakamahi aunoa i enei motika.

A ko te mea whakamutunga mo nga whakapainga e pa ana ki a maatau - paepae, e taapiri ana i te Affinity Node ki te StatefulSet i hangaia. He maha nga wa e pai ake ana o taatau kaihoko ki te whakaheke i nga utu ma te whakamahi i nga waahi waahi, a kaore e pai ki te manaaki i nga ratonga papaa raraunga. Ka taea te whakatau i tenei take na roto i nga whakaahuru, engari ko te noho mai o Node Affinity ka nui ake te maia.

He aha te mea i tupu?

I runga i nga hua o te whakaoti rapanga i runga ake nei, i mawehe atu matou i te Kaiwhakahaere Postgres mai i Zalando ki roto to putunga, kei reira ka kohia me nga papanga whaihua. A mo te pai ake, i kohia ano e matou Whakaahua Docker.

Rarangi o nga PR kua whakaaetia ki te marau:

He rawe ki te tautoko te hapori i enei PR kia eke ki runga ki te awa me te putanga o muri o te kaiwhakahaere (1.6).

Takoha! Nga korero angitu o te hekenga whakaputa

Mena kei te whakamahi koe i te Patroni, ka taea te heke te whakaputanga ora ki te kaiwhakahaere me te iti o te wa heke.

Ka taea e Spilo ki a koe te hanga tautau tatari ma te rokiroki S3 me Wal-E, i te wa e penapena tuatahitia ai te rangitaki takirua PgSQL ki S3 katahi ka panaia e te tauira. Engari me aha mena kei a koe e kore whakamahia e Wal-E i runga i nga hanganga tawhito? Ko te otinga mo tenei raru kua oti i whakaarohia i runga i te puku.

Ko te tukurua arorau PostgreSQL ka tae mai ki te whakaora. Engari, kaore matou e korero mo te hanga tuhinga me nga ohaurunga, na te mea ... he raruraru to maatau mahere.

Ko te meka he maha nga tepu kua utaina ki te papaaarangi me nga miriona rarangi, i tua atu, i whakakiia tonuhia, ka whakakorehia. Ohaurunga ngawari с copy_data, ka kapehia e te tauira hou nga mea katoa mai i te rangatira, kaore e taea e ia te pupuri i te rangatira. Ko te kape i nga ihirangi i mahi mo te wiki, engari kaore i mau ki te rangatira. I te mutunga, i awhina ahau ki te whakaoti rapanga tuhinga nga hoa mahi mai i Avito: ka taea e koe te whakawhiti raraunga ma te whakamahi pg_dump. Ka whakaahua ahau i to maatau (he ahua whakarereke) o tenei algorithm.

Ko te whakaaro ka taea e koe te ohaurunga haua kia herea ki tetahi mokamoka tukurua motuhake, ka whakatika i te tau tauwhitinga. I waatea nga tauira mo nga mahi whakaputa. He mea nui tenei na te mea ka awhina te tauira ki te hanga i te putunga rite tonu ka whiwhi tonu i nga huringa mai i te rangatira.

Ko nga whakahau e whai ake nei e whakaahua ana i te tukanga hekenga ka whakamahi i nga tohu kaihautu e whai ake nei:

  1. ariki — tūmau puna;
  2. tauira1 - te rere tauira i runga i te hanga tawhito;
  3. tauira2 - tauira arorau hou.

Mahere hekenga

1. Waihangahia he ohaurunga ki te rangatira mo nga ripanga katoa i roto i te aronuinga public turanga dbname:

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

2. Waihangatia he mokamoka tukurua ki te ariki:

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

3. Kati te tāruarua i te tauira tawhito:

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

4. Tikina te tau tauwhitinga mai i te rangatira:

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

5. Tangohia te putunga mai i te tauira tawhito. Ka mahia e matou tenei i roto i nga miro maha, ka awhina i te tere o te mahi:

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

6. Tukuake te putunga ki te tūmau hōu:

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

7. I muri i te tango i te putunga, ka taea e koe te timata te tukurua i runga i te tauira roma:

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

7. Me hanga he ohaurunga mo tetahi tauira arorau hou:

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. Me tiki oid ohaurunga:

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

9. Me kii kua riro mai oid=1000. Me hoatu te nama tauwhitinga ki te ohaurunga:

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

10. Me timata te tukurua:

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

11. Tirohia te mana ohaurunga, me mahi te tukurua:

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. I muri i te tiimatanga o te tukurua me te tukutahi i nga papaa raraunga, ka taea e koe te huri.

13. I muri i te whakakore i te tukurua, me whakatika e koe nga raupapa. He pai te korero mo tenei i roto i te tuhinga i runga i wiki.postgresql.org.

He mihi ki tenei mahere, i puta te huringa me te iti o te whakaroa.

mutunga

Ka taea e nga kaiwhakahaere Kubernetes te whakangawari i nga momo mahi ma te whakaiti i a raatau ki te hanga rauemi K8s. Heoi, i te mea kua tutuki i a raatau nga mahi miihini me o raatau awhina, he mea tika kia maumahara ka taea ano e ia te kawe mai i nga ahuatanga ohorere, na reira ma te whiriwhiri i o kaiwhakahaere.

I te whai whakaaro ki nga kaiwhakahaere Kubernetes e toru tino rongonui mo PostgreSQL, i kowhiria e matou te kaupapa mai i Zalando. A i kaha taatau ki te wikitoria i etahi raru, engari he tino pai te hua, no reira ka whakamahere matou ki te whakawhānui ake i tenei wheako ki etahi atu whakaurunga PgSQL. Mena he wheako koe ki te whakamahi i nga otinga rite, ka koa matou ki te kite i nga korero i roto i nga korero!

PS

Pānuihia hoki i runga i ta maatau blog:

Source: will.com

Tāpiri i te kōrero