Nopea PostgreSQL-tietokanta on tietokanta, jonka usein luettu data mahtuu muistiin. Koko mitoitus lähtee tästä: tietokannan koko, sen todella käytössä oleva osa, yhteyksien määrä ja sitten levy ja sen marginaali. Tämä opas antaa menetelmän, lähtöasetukset 4, 8 ja 16 gigatavun muistille sekä kyselyt, joilla olemassa oleva tietokanta mitataan.
shared_buffers 25 % muistista, effective_cache_size 75 %, random_page_cost = 1.1 NVMe-SSD-levyllä.pg_dump-komennolla palvelimen ulkopuolelle ja palauttakaa säännöllisesti varmistaaksenne, että kopio toimii.Tietokantapalvelimen muisti toimii ennen kaikkea välimuistina: muistista luettu sivu palvellaan paljon nopeammin kuin levyltä luettu, NVMe-levyltäkin. Kysymys ei siis ole vain ”paljonko tietokanta vie tilaa?”, vaan ”mikä osa siitä luetaan usein?”. 50 GB:n tietokanta, josta luetaan vain viimeiset kaksitoista kuukautta, työskentelee ehkä 8 gigatavun varassa.
Olemassa olevasta tietokannasta kaksi kyselyä kertoo kokonaiskoon ja suurimmat taulut indekseineen:
SELECT pg_size_pretty(pg_database_size(current_database()));
SELECT relname AS taulu,
pg_size_pretty(pg_total_relation_size(relid)) AS koko_indekseineen
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;
Tulevan tietokannan koko arvioidaan taulu kerrallaan: vuoden päästä odotettu rivimäärä × rivin keskikoko, ja siihen lisätään indeksit, jotka ovat yleisesti 30 ja 100 %:n välillä datan koosta. Esimerkki: 2 miljoonaa riviä kuukaudessa, kukin 500 tavua, tekee vuoden päästä 12 GB dataa ja indekseineen 18 ja 24 GB:n välillä.
PostgreSQL pitää luetut sivut kahdella tasolla: omassa välimuistissaan (shared_buffers) ja järjestelmän tiedostovälimuistissa. Sen dokumentaatio suosittelee lähtökohdaksi 25 % muistista shared_buffers-asetukselle tietokannalle omistetulla palvelimella ja toteaa, että yli 40 %:n osuudesta on harvoin lisähyötyä: loput muistista hyödyttää järjestelmän välimuistia ja lajitteluja.
| Parametri | 4 GB | 8 GB | 16 GB | Tehtävä |
|---|---|---|---|---|
shared_buffers | 1 GB | 2 GB | 4 GB | PostgreSQL:n oma välimuisti |
effective_cache_size | 3 GB | 6 GB | 12 GB | Arvioitu välimuistin kokonaiskoko, joka ohjaa kyselysuunnitelmien valintaa |
work_mem | 8 MB | 16 MB | 32 MB | Jokaisen lajittelun tai hajautuksen muisti yhteyttä kohden: kerrotaan samanaikaisten kyselyjen määrällä |
maintenance_work_mem | 256 MB | 512 MB | 1 GB | Indeksien luonti ja VACUUM |
random_page_cost | 1.1 | 1.1 | 1.1 | Satunnaisen levyluvun arvioitu kustannus: oletuksena 4, selvästi yli todellisen kustannuksen NVMe-SSD-levyllä |
Nämä arvot olettavat, että tietokanta on palvelimella yksin. Jos sovellus toimii samalla palvelimella, vähentäkää ensin sen muisti (prosessit, välimuisti, käännös) ja soveltakaa prosenttiosuuksia jäljelle jäävään: 8 GB:n palvelin, joka ajaa 3 GB:n sovellusta, säädetään kuin 5 GB:n tietokantapalvelin.
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1
shared_buffers tulee voimaan vasta, kun PostgreSQL käynnistetään uudelleen; muut parametrit ladataan uudelleen ilman katkoa komennolla SELECT pg_reload_conf();.
Muistin riittävyyden kertoo välimuistista luettujen sivujen osuus. Liiketoimintasovelluksessa tai sivustossa se on yli 99 %:
SELECT round(100.0 * blks_hit / nullif(blks_hit + blks_read, 0), 2) AS osumaprosentti
FROM pg_stat_database
WHERE datname = current_database();
PostgreSQL avaa yhden prosessin yhteyttä kohden ja hyväksyy oletuksena 100 yhteyttä (max_connections). Jokainen prosessi vie levossa muutaman megatavun, enemmän lajitellessaan tai hajauttaessaan dataa (work_mem, joskus useita kertoja saman kyselyn aikana). Jos max_connections nostetaan 500:aan puheliaan sovelluksen tarpeisiin, palvelimen muisti voi loppua ensimmäisessä piikissä.
Oikea ratkaisu on yhteyspooli: transaction-tilassa toimiva PgBouncer jakaa muutaman kymmenen todellisen yhteyden sovelluksen satojen yhteyksien kesken. Sovelluskehyksillä on myös oma poolinsa (SQLAlchemy, Prisma, HikariCP): säätäkää sen koko tietokantapalvelimen vCPU:iden määrän eikä käyttäjien määrän mukaan.
PostgreSQL-palvelimen levyllä on muutakin kuin taulut:
max_wal_size), enemmän massatuonnin aikana ja vielä enemmän, jos lokin arkistointi jää jälkeen.work_mem-arvon.VACUUM FULL ja indeksin uudelleenrakennus kirjoittavat täydellisen kopion ennen kuin vanha vapautetaan.Sääntö: koko vuoden päästä ja vähintään 30 %:n marginaali. Kyse on toimintavarmuudesta: kun transaktiolokia säilyttävä levy täyttyy, PostgreSQL pysähtyy suojellakseen dataansa. Seuratkaa käyttöastetta ja laajentakaa ennen kuin se ylittää 80 %.
Suorituskyvyn kannalta jokainen transaktion vahvistus odottaa lokin kirjoittamista levylle: tallennustilan viive määrää kirjoitusten läpäisyn. Juuri tässä NVMe-SSD tekee eron, paljon enemmän kuin luvuissa, jotka muisti jo palvelee.
PostgreSQL-kysely suoritetaan yhdellä ytimellä lukuun ottamatta suuria lukuja, jotka moottori rinnakkaistaa. vCPU:iden määrä ratkaisee siis, montako raskasta kyselyä käsitellään yhtä aikaa: 2 vCPU:ta riittää liiketoimintasovellukselle julkaisuvaiheessa, ja kovassa käytössä oleville tietokannoille ja raskaille raporteille sopii 4 tai 8 vCPU:ta.
Ennen kuin lisäätte vCPU:ita, etsikää kyselyt, jotka niitä kuluttavat. Laajennus pg_stat_statements järjestää ne kokonaisajan mukaan:
shared_preload_libraries = 'pg_stat_statements'
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
SELECT calls, round(total_exec_time) AS kokonais_ms,
round(mean_exec_time::numeric, 1) AS keskiarvo_ms, query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
Julkaisuvaiheessa tietokanta samalla palvelimella sovelluksen kanssa on oikea valinta: niiden välillä ei ole verkkoviivettä, yhteys kulkee Unix-socketin kautta, ja varmuuskopioitavana ja valvottavana on yksi palvelin. Ne erotetaan, kun ne kilpailevat resursseista: käännös tai liikennepiikki tyhjentää tietokannan välimuistin, tietokanta tarvitsee koko muistin datalleen tai varmuuskopiointivaatimukset eroavat.
listen_addresses = 'localhost' niin kauan kuin vain palvelimen oma sovellus ottaa yhteyttä. Jos toisen palvelimen on päästävä tietokantaan, avatkaa portti 5432 vain sen osoitteelle, palomuurissa ja pg_hba.conf-tiedostossa.scram-sha-256 pg_hba.conf-tiedostossa, oma rooli jokaiselle sovellukselle, ilman pääkäyttäjän oikeuksia.pg_dump-komennolla, kopioituna palvelimen ulkopuolelle.pg_dump -Fc -d oma_kanta -f oma_kanta-$(date +%F).dump
createdb oma_kanta_testi
pg_restore -d oma_kanta_testi oma_kanta-2026-10-29.dump
VPS Pro toimii Intel Xeon -suorittimilla, ECC-muistilla, joka korjaa virheet lennossa, ja peilatuilla NVMe-SSD-levyillä; jokainen datalohko varmennetaan tarkistussummalla, ja salattu varmuuskopio otetaan joka yö koneen ulkopuolelle. Kokonaistuki sisältyy: kun tietokantanne hidastuu, analysoimme hitaat kyselyt ja indeksit ja kerromme sitten asetukset, jotka palauttavat sovelluksenne nopeuden.
Sen verran, että usein luettu data mahtuu muistiin. Liiketoimintasovellukselle julkaisuvaiheessa 4 GB riittää tietokanta ja sovellus mukaan lukien. Sen jälkeen mitatkaa välimuistista luettujen sivujen osuus: niin kauan kuin se pysyy yli 99 %:ssa, muisti riittää.
25 % muistista tietokannalle omistetulla palvelimella, kuten PostgreSQL:n dokumentaatio suosittelee: 1 GB 4 gigatavusta, 2 GB 8 gigatavusta, 4 GB 16 gigatavusta. Yli 40 %:n osuudesta on harvoin lisähyötyä, koska järjestelmän välimuisti hoitaa loput.
PostgreSQL hyväksyy oletuksena 100 yhteyttä, ja jokainen yhteys on muistia kuluttava prosessi. Katon nostamisen sijaan sijoittakaa PgBouncerin kaltainen yhteyspooli tietokannan eteen: muutama kymmenen todellista yhteyttä palvelee silloin sovelluksen satoja yhteyksiä.
Julkaisuvaiheessa sama palvelin on paras valinta: tietokanta vastaa ilman verkkoviivettä, ja kokonaisuus varmuuskopioidaan yhtenä. Ne erotetaan, kun toinen haittaa toista, esimerkiksi kun käännös tai liikennepiikki tyhjentää tietokannan välimuistin.
Simafri
Jutellaan hankkeestasi
Kerro meille muutamalla sanalla, mitä tarvitset: vastaamme sinulle nopeasti.
Kiitos! Pyyntösi on lähetetty. Vastaamme sinulle pian.
Suositko sähköpostia? Kirjoita meille osoitteeseen support@simafri.com.