Kākau mākou ma PostgreSQL ma ka sublight: 1 host, 1 lā, 1TB

I kēia mau lā, ua haʻi wau iā ʻoe pehea, me ka hoʻohana ʻana i nā meaʻai maʻamau hoʻonui i ka hana o nā nīnau heluhelu SQL mai PostgreSQL waihona. I kēia lā e kamaʻilio mākou pehea hiki ke hoʻopaʻa ʻia me ka maikaʻi i ka waihona me ka hoʻohana ʻole ʻana i nā "twists" i ka config - ma ka hoʻonohonoho pono ʻana i nā kahe ʻikepili.

Kākau mākou ma PostgreSQL ma ka sublight: 1 host, 1 lā, 1TB

#1. Māhele ʻāpana

He ʻatikala e pili ana i ke kumu a me ke kumu e pono ai ka hoʻonohonoho ʻana i hoʻohana ʻia i ka ʻāpana "ma ke kumumanaʻo" ua hala mua, eia mākou e kamaʻilio e pili ana i ka hana o ka hoʻopili ʻana i kekahi mau ala i loko o kā mākou lawelawe nānā no nā haneli o nā kikowaena PostgreSQL.

"ʻO nā mea o nā lā i hala ..."

I ka wā mua, e like me nā MVP, ua hoʻomaka kā mākou papahana ma lalo o kahi haʻahaʻa māmā - ua mālama ʻia ka nānā ʻana no nā kikowaena koʻikoʻi he ʻumi wale nō, paʻa nā papa a pau ... , a ua ho'āʻo hou mākou e hana i kekahi mea me kekahi o nā papa 1.5TB ka nui, ua ʻike mākou ʻoiai hiki ke hoʻomau i ka noho ʻana e like me kēia, he mea paʻakikī loa ia.

Ua like nā manawa me nā manawa epic, pili nā mana like ʻole o PostgreSQL 9.x, no laila pono e hana ʻia nā ʻāpana āpau "ma ka lima" - ma o hoʻoilina papaʻaina a me nā mea hoʻoulu alahele me ka dynamic EXECUTE.

Kākau mākou ma PostgreSQL ma ka sublight: 1 host, 1 lā, 1TB
ʻO ka hopena i hoʻololi ʻia ua lawa ke ao holoʻokoʻa i hiki ke unuhi ʻia i nā papa āpau:

  • Ua haʻi ʻia kahi papa ʻaina makua "header" hakahaka, nāna i wehewehe i nā mea a pau nā indexes pono a me nā mea hoʻoulu.
  • Ua hana ʻia ka moʻolelo mai ka manaʻo o ka mea kūʻai aku ma ka papa "aʻa", a me ka hoʻohana ʻana i loko routing trigger BEFORE INSERT ua hoʻokomo ʻia ka moʻolelo i loko o ka ʻāpana i makemake ʻia. Inā ʻaʻohe mea like, loaʻa iā mākou kahi ʻokoʻa a...
  • … ma ka hoʻohana ʻana CREATE TABLE ... (LIKE ... INCLUDING ...) ua hana ʻia ma muli o ke kumu hoʻohālike o ka papa makua ʻāpana me ka palena i ka lā i makemake ʻiano laila ke kiʻi ʻia ka ʻikepili, hana ʻia ka heluhelu ʻana ma loko wale nō.

PG10: hoao mua

Akā, ʻaʻole i kūpono ka hoʻokaʻawale ʻana ma o ka hoʻoilina i ka wā kahiko e pili ana i kahi kahawai kākau ikaika a i ʻole ka nui o nā ʻāpana keiki. No ka laʻana, hiki iā ʻoe ke hoʻomanaʻo i ka algorithm no ke koho ʻana i ka ʻāpana i koi ʻia paʻakikī quadratic, e hana ana me 100+ pauku, maopopo iā ʻoe iho pehea...

Ma PG10, ua hoʻoikaika nui ʻia kēia kūlana ma ka hoʻokō ʻana i ke kākoʻo hoʻokaʻawale ʻōiwi. No laila, ua hoʻāʻo koke mākou e hoʻopili koke ma hope o ka neʻe ʻana i ka waihona, akā ...

E like me ka mea i ʻike ʻia ma hope o ka ʻeli ʻana i ka manual, ʻo ka papa ʻaina i hoʻokaʻawale ʻia ma kēia ʻano:

  • ʻaʻole kākoʻo i nā wehewehe kikoʻī
  • ʻaʻole kākoʻo i nā mea hoʻoulu ma luna ona
  • ʻaʻole hiki ke "moʻo" na kekahi
  • mai kākoʻo INSERT ... ON CONFLICT
  • ʻaʻole hiki ke hoʻopuka maʻalahi i kahi ʻāpana

Ma hope o ka loaʻa ʻana o kahi ʻeha ʻeha i ka lae me kahi rake, ua ʻike mākou he mea hiki ʻole ke hana me ka ʻole o ka hoʻololi ʻana i ka noi, a hoʻopanee hou i ka noiʻi no ʻeono mahina.

PG10: manawa lua

No laila, ua hoʻomaka mākou e hoʻoponopono i nā pilikia i kū mai kēlā me kēia:

  1. No ka mea, hoʻomaka a ON CONFLICT Ua ʻike mākou ua makemake mākou iā lākou ma ʻaneʻi a ma laila, no laila ua hana mākou i kahi pae waena e hana ai papa koho.
  2. Ua wehe ʻia ka "routing" in triggers - ʻo ia hoʻi, mai EXECUTE.
  3. Lawe kaʻawale lākou papa kuhikuhi me na kuhikuhino laila ʻaʻole lākou i loaʻa i ka papa koho.

Kākau mākou ma PostgreSQL ma ka sublight: 1 host, 1 lā, 1TB
ʻO ka hope, ma hope o kēia mau mea a pau, ua hoʻokaʻawale mākou i ka papaʻaina ma ke ʻano maoli. Ke waiho ʻia nei ka hana ʻana o kahi ʻāpana hou i ka lunamanaʻo o ka noi.

"Sawing" puke wehewehe'ōlelo

E like me kekahi ʻōnaehana analytical, ua loaʻa iā mākou "ʻoiaʻiʻo" a "ʻoki" (mau puke wehewehe'ōlelo). I ko mākou hihia, ma kēia kūlana ua hana lākou, no ka laʻana, kino template nā nīnau lohi like a i ʻole ke kikokikona o ka nīnau ponoʻī.

Ua hoʻokaʻawale ʻia nā "Facts" i ka lā no ka manawa lōʻihi, no laila ua holoi mākou i nā ʻāpana kahiko, ʻaʻole lākou i hoʻopilikia iā mākou (logs!). Akā he pilikia me nā puke wehewehe ʻōlelo...

ʻAʻole e ʻōlelo he nui lākou, akā ma kahi o ʻO 100TB o nā "ʻoiaʻiʻo" i loaʻa i kahi puke wehewehe'ōlelo 2.5TB. ʻAʻole hiki iā ʻoe ke hoʻopau maʻalahi i kekahi mea mai kēlā papaʻaina, ʻaʻole hiki iā ʻoe ke hoʻopaʻa iā ia i ka manawa kūpono, a ua lohi iki ke kākau ʻana iā ia.

E like me ka puke wehewehe ʻōlelo... i loko o ia mea, pono e hōʻike ʻia kēlā me kēia helu i hoʻokahi manawa pono... a pololei kēia, akā!.. ʻAʻohe mea e kāohi iā mākou mai ka loaʻa ʻana. he puke wehewehe wehewehe ʻokoʻa no kēlā me kēia lā! ʻAe, lawe mai kēia i kekahi redundancy, akā ʻae ia:

  • kākau/heluhelu ʻoi aku ka wikiwiki ma muli o ka liʻiliʻi o ka ʻāpana
  • e hoemi i ka hoomanao ana ma ka hana ʻana me nā papa kuhikuhi paʻa
  • e mālama i nā ʻikepili liʻiliʻi ma muli o ka hiki ke wehe koke i ka wā kahiko

Ma muli o ka paʻakikī holoʻokoʻa o nā ana Ua hoʻemi ʻia ka ukana CPU e ~30%, hoʻouka diski e ~50%:

Kākau mākou ma PostgreSQL ma ka sublight: 1 host, 1 lā, 1TB
I ka manawa like, ua hoʻomau mākou e kākau i ka mea like i loko o ka waihona, me ka liʻiliʻi o ka ukana.

#2. Hoʻoulu ʻikepili a me refactoring

No laila ua hoʻoholo mākou i ka mea i loaʻa iā mākou aia i kēlā me kēia lā kona ʻāpana ponoʻī me ka ʻikepili. ʻOiaʻiʻo, CHECK (dt = '2018-10-12'::date) - a aia kahi kī hoʻokaʻawale a me ke ʻano o kahi moʻolelo e hāʻule i loko o kahi ʻāpana kikoʻī.

No ka mea ua kūkulu ʻia nā hōʻike āpau i kā mākou lawelawe i loko o ka pōʻaiapili o kahi lā kikoʻī, ʻo nā ʻano kuhikuhi no lākou mai ka "manawa ʻole i hoʻokaʻawale ʻia" ʻo ia nā ʻano āpau. (Server, ʻO ka lā, Papa Hoʻolālā), (Server, ʻO ka lā, Hoʻolālā node), (ʻO ka lā, Papa hewa, Server)...

Akā i kēia manawa ke noho nei lākou ma kēlā me kēia ʻāpana kou mau kope kēlā me kēia papa kuhikuhi... A i loko o kēlā me kēia ʻāpana he lā mau... Ua ʻike ʻia i kēia manawa aia mākou i kēlā me kēia papa kuhikuhi komo wale i kahi mau e like me kekahi o nā māla, e hoʻonui ana i kona leo a me ka manawa huli no ia, akā ʻaʻole i lawe mai i kahi hopena. Ua waiho lākou i ka rake iā lākou iho, oops...

Kākau mākou ma PostgreSQL ma ka sublight: 1 host, 1 lā, 1TB
ʻIke ʻia ke kuhikuhi o ka loiloi - maʻalahi wehe i ke kahua lā mai nā papa kuhikuhi ma nā papa ʻaina. Hāʻawi ʻia i kā mākou mau puke, pili ka loaʻa 1TB / pule!

I kēia manawa, e hoʻomaopopo kākou e hoʻopaʻa ʻia kēia terabyte ma kekahi ʻano. ʻO ia hoʻi mākou i kēia manawa pono ka hoʻouka ʻana o ka disk! Hōʻike maopopo kēia kiʻi i ka hopena i loaʻa mai ka hoʻomaʻemaʻe, kahi a mākou i hoʻolaʻa ai i hoʻokahi pule:

Kākau mākou ma PostgreSQL ma ka sublight: 1 host, 1 lā, 1TB

#3. "Hoʻolaha" i ka haʻawe kiʻekiʻe

ʻO kekahi o nā pilikia nui o nā ʻōnaehana hoʻouka ka hoʻolikelike ʻana kekahi mau hana e pono ole ai. I kekahi manawa "no ka mea ʻaʻole lākou i ʻike", i kekahi manawa "ʻoi aku ka maʻalahi o ia ala", akā ma hope a ma hope paha e hoʻopau ʻoe.

E hoʻonui kāua i ke kiʻi mua a ʻike mākou he disk "pumps" ma lalo o ka ukana me ka amplitude pālua ma waena o nā laʻana pili, ʻaʻole pono e "heluhelu" me nā hana he nui:

Kākau mākou ma PostgreSQL ma ka sublight: 1 host, 1 lā, 1TB

He mea maʻalahi kēia e hoʻokō. Ua hoʻomaka mākou e nānā kokoke 1000 kikowaena, ua hoʻoponopono ʻia kēlā me kēia me kahi loilo like ʻole, a hoʻihoʻi kēlā me kēia pae i ka ʻike i hōʻiliʻili ʻia e hoʻouna ʻia i ka waihona ma kahi alapine, e like me kēia:

setInterval(sendToDB, interval)

Aia ka pilikia ma ʻaneʻi i ka ʻoiaʻiʻo hoʻomaka nā lola a pau i ka manawa like, no laila, ʻaneʻane like nā manawa hoʻouna ʻana "i ke kiko." ʻAe #2...

ʻO ka mea pōmaikaʻi, he maʻalahi kēia e hoʻoponopono, e hoʻohui i kahi "random" run-up e ka manawa:

setInterval(sendToDB, interval * (1 + 0.1 * (Math.random() - 0.5)))

#4. Hoʻopili mākou i nā mea e pono ai mākou

ʻO ke kolu o ka pilikia hoʻouka kuʻuna maʻamau ʻaʻohe huna huna mahea oia hiki e.

No ka laʻana, hiki iā mākou ke nānā i nā ʻōlelo o nā nodes hoʻolālā (ʻo kēia mau mea āpau Seq Scan on users), akā e noʻonoʻo koke ʻo lākou, no ka hapa nui, like - poina lākou.

ʻAʻole, ʻoiaʻiʻo, ʻaʻohe mea i kākau hou ʻia i ka waihona, ʻoki kēia i ke kumu me INSERT ... ON CONFLICT DO NOTHING. Akā, hiki i kēia ʻikepili i ka waihona, a ʻaʻole pono heluhelu e nānā i ka paio pono e hana. ʻAe #3...

ʻIke ʻia ka ʻokoʻa o ka helu o nā moʻolelo i hoʻouna ʻia i ka waihona ma mua/ma hope o ka hiki ʻana o ka cache:

Kākau mākou ma PostgreSQL ma ka sublight: 1 host, 1 lā, 1TB

A ʻo kēia ka hāʻule ʻana o ka ukana waihona:

Kākau mākou ma PostgreSQL ma ka sublight: 1 host, 1 lā, 1TB

Hōʻuluʻulu

ʻO "Terabyte-per-day" he mea weliweli wale nō. Inā hana pono ʻoe i nā mea a pau, a laila pololei kēia 2^40 bytes / 86400 kekona = ~12.5MB/sʻo ia hoʻi i paʻa ʻia nā ʻōkuhi IDE desktop. 🙂

Akā ʻo ke koʻikoʻi, ʻoiai me ka ʻumi "skew" o ka ukana i ka lā, hiki iā ʻoe ke hoʻokō maʻalahi i nā mana o nā SSD hou.

Kākau mākou ma PostgreSQL ma ka sublight: 1 host, 1 lā, 1TB

Source: www.habr.com

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