Manoratra ao amin'ny PostgreSQL amin'ny sublight izahay: mpampiantrano 1, andro 1, 1TB

Vao haingana aho no nilaza taminao ny fomba, mampiasa fomba mahazatra mahazatra hampitombo ny fahombiazan'ny fangatahana famakiana SQL avy amin'ny angon-drakitra PostgreSQL. Androany isika dia hiresaka momba ny fomba azo atao amin'ny fomba mahomby kokoa ny firaketana ao amin'ny angon-drakitra nefa tsy mampiasa "twists" ao amin'ny config - amin'ny alàlan'ny fandaminana tsara ny fikorianan'ny data.

Manoratra ao amin'ny PostgreSQL amin'ny sublight izahay: mpampiantrano 1, andro 1, 1TB

#1. fizarana

Lahatsoratra momba ny fomba sy ny antony mahamety ny fandaminana fampiharana fizarana "amin'ny teoria" efa nisy, eto isika dia hiresaka momba ny fampiharana ny fomba fiasa sasany ao anatintsika serivisy fanaraha-maso ho an'ny mpizara PostgreSQL an-jatony.

"Ny zavatra efa lasa..."

Tany am-boalohany, toy ny MVP rehetra, dia nanomboka tamin'ny enta-mavesatra somary maivana ny tetikasanay - ho an'ireo lohamilina folo tena manan-danja ihany no nanaovana ny fanaraha-maso, ny latabatra rehetra dia somary matevina... Saingy rehefa nandeha ny fotoana, dia nihamaro ny isan'ny mpampiantrano narahi-maso. , ary nanandrana nanao zavatra tamin'ny iray indray izahay latabatra 1.5TB ny habeny, tsapanay fa na dia azo natao aza ny nanohy ny fiainana toy izany, dia tena nahasosotra izany.

Saika mitovy amin'ny vanim-potoana mahafinaritra ny fotoana, ny dikan-teny samihafa amin'ny PostgreSQL 9.x dia mifandraika, ka ny fizarana rehetra dia tsy maintsy natao "tanana" - amin'ny alàlan'ny lova latabatra sy trigger routing amin'ny dynamic EXECUTE.

Manoratra ao amin'ny PostgreSQL amin'ny sublight izahay: mpampiantrano 1, andro 1, 1TB
Ny vahaolana azo dia nivadika ho ampy ho an'ny rehetra ka azo adika amin'ny tabilao rehetra:

  • Nambara ny tabilaon'ny ray aman-dreny "header" tsy misy na inona na inona, izay mamaritra ny zava-drehetra indexes sy trigger ilaina.
  • Ny firaketana avy amin'ny fomba fijerin'ny mpanjifa dia natao tao amin'ny tabilao "root", ary ampiasaina anatiny routing trigger BEFORE INSERT nampidirina “ara-batana” tao amin'ny fizarana ilaina ny rakitsoratra. Raha mbola tsy nisy izany, dia nahazo exception izahay ary...
  • … amin'ny fampiasana CREATE TABLE ... (LIKE ... INCLUDING ...) dia noforonina mifototra amin'ny môdelin'ny latabatra ray aman-dreny fizarana misy famerana amin'ny daty tianaka rehefa alaina ny data dia ao anatiny ihany no vakiana.

PG10: andrana voalohany

Saingy ny fizarazarana amin'ny alalan'ny lova dia tsy mifanaraka amin'ny tantara ara-tantara amin'ny fiatrehana an-tsoratra mavitrika na fizarazarana ankizy marobe. Ohatra, azonao tsaroana fa ny algorithm amin'ny fisafidianana ny fizarana ilaina dia nanana fahasarotana efamira, fa miasa miaraka amin'ny fizarana 100+ izany, ianao mihitsy no mahatakatra ny fomba...

Ao amin'ny PG10 ity toe-javatra ity dia nohatsaraina tanteraka tamin'ny fampiharana ny fanohanana fizarazarana teratany. Noho izany, niezaka nampihatra izany avy hatrany izahay taorian’ny nifindrana ny fitahirizana, saingy...

Araka ny hita taorian'ny nandavahana ny boky, ny latabatra voazarazara amin'ity dikan-teny ity dia:

  • tsy manohana famaritana fanondroana
  • tsy manohana trigger eo aminy
  • tsy mety ho "taranaka" na iza na iza
  • aza manohana INSERT ... ON CONFLICT
  • tsy afaka mamorona fizarana ho azy

Nahazo kapoka mampanaintaina tamin'ny handriny tamin'ny rake, dia nahatsapa izahay fa tsy ho vita izany raha tsy misy fanovana ny fampiharana, ary nahemotra ny fikarohana fanampiny nandritra ny enim-bolana.

PG10: vintana faharoa

Noho izany, nanomboka namaha ny olana nipoitra tsirairay izahay:

  1. Satria triggers ary ON CONFLICT Hitanay fa mbola mila azy ireo etsy sy eroa izahay, ka nanao dingana mpanelanelana izahay mba hamahana azy ireo latabatra proxy.
  2. Esory ny "routing" amin'ny trigger - izany hoe avy amin'ny EXECUTE.
  3. Nesorin’izy ireo mitokana izany latabatra môdely misy index rehetraka tsy hita ao amin'ny latabatra proxy akory izy ireo.

Manoratra ao amin'ny PostgreSQL amin'ny sublight izahay: mpampiantrano 1, andro 1, 1TB
Farany, taorian'izany rehetra izany dia nozarainay ny latabatra lehibe. Ny famoronana fizarana vaovao dia mbola navela ho an'ny feon'ny fieritreretan'ny fampiharana.

Diksionera "sawing".

Toy ny tamin'ny rafitra famakafakana rehetra dia nanana ihany koa izahay "facts" sy "cuts" (rakibolana). Amin'ity tranga ity dia nanao zavatra izy ireo, ohatra, vatana modely fanontaniana miadana mitovy na ny lahatsoratry ny fangatahana.

Ny "Facts" dia nozaraina nandritra ny andro ela, ka nofafanay tamim-pahatoniana ireo fizarana efa lany andro, ary tsy nanelingelina anay (log!). Saingy nisy olana tamin'ny rakibolana...

Tsy lazaina intsony fa be dia be izy ireo, fa eo ho eo 100TB amin'ny "zava-misy" dia niteraka rakibolana 2.5TB. Tsy afaka mamafa na inona na inona amin'ny latabatra toy izany ianao, tsy azonao atao ny manindry azy ao anatin'ny fotoana mety, ary ny fanoratana azy dia nihena tsikelikely.

Toy ny diksionera... ao anatin'izany dia tokony aseho indray mandeha isan-karazany ny fidirana tsirairay ... ary marina izany, saingy!.. Tsy misy misakana antsika tsy hanana. rakibolana mitokana ho an'ny andro tsirairay! Eny, mitondra fihenam-bidy sasany izany, saingy mamela izany:

  • manoratra/mamaky haingana kokoa noho ny haben'ny fizarana kely kokoa
  • mandany fahatsiarovana kely kokoa amin'ny alàlan'ny fiasana miaraka amin'ireo indexes compact kokoa
  • mitahiry angona kely kokoa noho ny fahafahana manala haingana ny lany andro

Vokatry ny fepetra rehetra sarotra Ny enta-mavesatra CPU dia nihena ~ 30%, ny kapila enta-mavesatra ~ 50%:

Manoratra ao amin'ny PostgreSQL amin'ny sublight izahay: mpampiantrano 1, andro 1, 1TB
Nandritra izany fotoana izany, nanohy nanoratra zavatra mitovy tanteraka izahay tao amin'ny angon-drakitra, miaraka amin'ny entana kely kokoa.

#2. Ny fivoaran'ny database sy ny refactoring

Dia niorim-paka tamin’izay anananay izahay samy manana ny fizaràna azy ny andro tsirairay miaraka amin'ny angona. Raha ny marina, CHECK (dt = '2018-10-12'::date) - ary misy fanalahidin'ny fizarazarana sy ny fepetra ho an'ny firaketana an-tsoratra mba hianjera ao amin'ny fizarana manokana.

Koa satria ny tatitra rehetra ao amin'ny serivisinay dia natsangana ao anatin'ny tontolon'ny daty iray manokana, ny fanondroana azy ireo hatramin'ny "fotoana tsy voazara" dia karazany rehetra. (Server, daty, Template Plan), (Server, daty, Plan node), (daty, Kilasy diso, Server), ...

Miaina isaky ny fizarana anefa izy ireo izao ny kopiao isaky ny fanondroana toy izany... Ary ao anatin'ny fizarana tsirairay ny daty dia tsy miova... Hita fa ao anatin'ny index tsirairay toy izany isika izao ampidiro tsotra fotsiny ny constant toy ny iray amin'ireo saha, izay mampitombo ny habeny sy ny fotoana fitadiavana azy, nefa tsy mitondra vokatra. Navelan'izy ireo ho azy ny rake, oops...

Manoratra ao amin'ny PostgreSQL amin'ny sublight izahay: mpampiantrano 1, andro 1, 1TB
Ny fitarihana ny fanatsarana dia mazava - tsotra esory ny saha daty amin'ny tondro rehetra amin'ny latabatra voazarazara. Raha jerena ny habetsahantsika, ny tombony dia eo amin'ny 1TB/herinandro!

Andeha hojerentsika izao fa mbola tsy maintsy noraketina io terabyte io. Izany hoe isika koa tokony ho kely kokoa izao ny kapila! Ity sary ity dia mampiseho mazava tsara ny vokatra azo avy amin'ny fanadiovana, izay natokanay herinandro:

Manoratra ao amin'ny PostgreSQL amin'ny sublight izahay: mpampiantrano 1, andro 1, 1TB

#3. "Manaparitaka" ny enta-mavesatra ambony

Ny iray amin'ireo olana lehibe amin'ny rafitra feno entana dia synchronization tafahoatra asa sasany tsy mitaky izany. Indraindray "satria tsy voamarik'izy ireo", indraindray "mora kokoa izany", fa na ho ela na ho haingana dia tsy maintsy manala izany ianao.

Andeha hojerentsika ny sary teo aloha ary hojerentsika fa manana disk isika "pumps" eo ambanin'ny entana misy amplitude roa eo anelanelan'ny santionany mifanakaiky, izay mazava ho azy fa "amin'ny statistika" dia tsy tokony hitranga amin'ny hetsika maromaro toy izany:

Manoratra ao amin'ny PostgreSQL amin'ny sublight izahay: mpampiantrano 1, andro 1, 1TB

Tena mora tratrarina izany. Efa nanomboka ny fanaraha-maso mpizara efa ho 1000, ny tsirairay dia karakarain'ny kofehy lojika misaraka, ary ny kofehy tsirairay dia mamerina ny fampahalalana voaangona halefa any amin'ny tahiry amin'ny fatrany, toy izao:

setInterval(sendToDB, interval)

Ny olana eto dia mipetraka amin'ny zava-misy marina ny kofehy rehetra dia manomboka amin'ny fotoana mitovy, ka ny fotoana nandefasana azy ireo dia saika mifanandrify hatrany amin’ny “zava-misy”. Oay #2...

Soa ihany fa mora amboarina io, manampy "random" run-up amin'ny fotoana:

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

#4. Mitahiry izay ilainay izahay

Ny olan'ny highload nentim-paharazana fahatelo dia tsy misy cache aiza izy afaka be.

Ohatra, nataontsika ny mamakafaka amin'ny lafin'ny node plan (ireo rehetra ireo Seq Scan on users), fa avy hatrany dia eritrereto fa izy ireo, amin'ny ankapobeny, mitovy - nanadino.

Tsia, mazava ho azy, tsy misy na inona na inona voasoratra ao amin'ny database indray, izany dia manapaka ny trigger amin'ny INSERT ... ON CONFLICT DO NOTHING. Saingy mbola tonga any amin'ny angon-drakitra io angona io, ary tsy ilaina izany mamaky mba hanamarinana ny fifandirana tsy maintsy atao. Oay #3...

Ny fahasamihafan'ny isan'ny rakitra alefa any amin'ny angon-drakitra alohan'ny / aorian'ny fandefasana ny caching dia miharihary:

Manoratra ao amin'ny PostgreSQL amin'ny sublight izahay: mpampiantrano 1, andro 1, 1TB

Ary izao ny fihenan'ny entana fitahirizana:

Manoratra ao amin'ny PostgreSQL amin'ny sublight izahay: mpampiantrano 1, andro 1, 1TB

Итого

"Terabyte-isan'andro" dia toa mampatahotra fotsiny. Raha manao ny zava-drehetra tsara ianao, dia izao 2^40 octet / 86400 segondra = ~12.5MB/sfa na dia ny screws IDE desktop aza dia nitazona. 🙂

Saingy tena zava-dehibe, na dia misy "skew" avo folo heny amin'ny enta-mavesatra mandritra ny andro aza, dia afaka mahafeno mora foana ny fahaizan'ny SSD maoderina ianao.

Manoratra ao amin'ny PostgreSQL amin'ny sublight izahay: mpampiantrano 1, andro 1, 1TB

Source: www.habr.com

Add a comment