Hvis du er ny til PostgreSQL, er den mest almindelige udfordring, du står over for, hvordan du justerer dit databasemiljø.
Når PostgreSQL er installeret, producerer det automatisk en grundlæggende postgresql.conf-fil. Denne konfigurationsfil opbevares normalt i databiblioteket afhængigt af det operativsystem, du bruger. For eksempel, i Ubuntu placerer PostgreSQL konfigurationerne (pg_hba.conf, postgresql.conf, pg_ident.conf) inde i mappen /etc/postgresql. Før du kan tune din PostgreSQL-database, skal du først finde postgresql.conf-filerne.
Men hvad er de rigtige indstillinger at bruge? og hvad er værdierne sat til i første omgang? Brug af eksterne værktøjer såsom PGTune (og alternative værktøjer som ClusterControl) vil hjælpe dig med at løse dette specifikke problem.
Hvad er PGTune?
PGtune er en konfigurationsguide, som oprindeligt blev skabt af Greg Smith fra 2ndQuadrant. Det er baseret på et Python-script, som desværre ikke længere understøttes. (Det understøtter ikke nyere versioner af PostgreSQL.) Det overgik derefter til pgtune.leopard.in.ua (som er baseret på den originale PGTune) og er nu en konfigurationsguide, du kan bruge til dine PG-databasekonfigurationsindstillinger.
PGtune bruges til at beregne konfigurationsparametre for PostgreSQL baseret på den maksimale ydeevne for en given hardwarekonfiguration. Det er dog ikke en sølvkugle, da mange indstillinger ikke kun afhænger af hardwarekonfigurationen, men også af størrelsen af databasen, antallet af klienter og kompleksiteten af forespørgsler.
Sådan bruges PGTune
Den gamle version af PGTune var baseret på python-script, som du kan påkalde via shell-kommando (ved hjælp af Ubuntu):
[email protected]:~/pgtune-master# $PWD/pgtune -L -T Mixed -i /etc/postgresql/9.1/main/postgresql.conf | sed -e '/#.*/d' | sed '/^$/N;/^\n/D'
stats_temp_directory = '/var/run/postgresql/9.1-main.pg_stat_tmp'
datestyle = 'iso, mdy'
default_text_search_config = 'pg_catalog.english'
default_statistics_target = 100
maintenance_work_mem = 120MB
checkpoint_completion_target = 0.9
effective_cache_size = 1408MB
work_mem = 9MB
wal_buffers = 16MB
checkpoint_segments = 32
shared_buffers = 480MB
Men den nye er meget nemmere og mere praktisk, da du bare kan få adgang via browseren. Bare gå til https://pgtune.leopard.in.ua/. Et godt eksempel er som nedenfor:
Alt du skal gøre er at angive følgende felter nedenfor:
- DB-version - versionen af din PostgreSQL. Det understøtter versioner af PostgreSQL fra 9.2, 9.3, 9.4, 9.5, 9.6, 10, 11 og 12.
- OS-type - OS-typen (Linux, OS X, Windows)
- DB-type - databasetypen, som hovedsageligt er den slags transaktionsbehandling din database vil håndtere (webapplikation, OLTP, datavarehusning, desktopapplikation, blandet type applikationer)
- Total hukommelse (RAM) - Den samlede hukommelse, som din PG-instans vil håndtere. Skal angive det i GiB.
- Antal CPU'er - Antal CPU'er, som PostgreSQL kan bruge CPU'er =tråde pr. kerne * kerner pr. socket * sockets
- Antal forbindelser - Maksimalt antal PostgreSQL-klientforbindelser
- Datalagring - Type datalagringsenhed, som du kan vælge mellem SSD, HDD eller SAN-baseret lagring.
Tryk derefter på knappen Generer. Alternativt kan du også køre ALTER SYSTEM-sætningen, som genererer postgresql.auto.conf, men det tager ikke før du rammer en PostgreSQL-genstart.
Hvordan sætter den værdierne
Algoritmen for dette værktøj kan grundlæggende findes her i configuration.js. Den deler den samme algoritme fra den gamle PGTune, der starter her pgtune#L477. For eksempel understøtter versioner af PostgreSQL <9.5 checkpoint_segments, men PG>=9.5 bruger min_wal_size og max_wal_size.
Indstilling af checkpoint_segments eller min_wal_size/max_wal_size afhænger af hvilken type PostgreSQL-version og DB-typen af databaseapplikationstransaktion. Se hvordan i uddraget nedenfor:
if (dbVersion < 9.5) {
return [
{
key: 'checkpoint_segments',
value: ({
[DB_TYPE_WEB]: 32,
[DB_TYPE_OLTP]: 64,
[DB_TYPE_DW]: 128,
[DB_TYPE_DESKTOP]: 3,
[DB_TYPE_MIXED]: 32
}[dbType])
}
]
} else {
return [
{
key: 'min_wal_size',
value: ({
[DB_TYPE_WEB]: (1024 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_OLTP]: (2048 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_DW]: (4096 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_DESKTOP]: (100 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_MIXED]: (1024 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB'])
}[dbType])
},
{
key: 'max_wal_size',
value: ({
[DB_TYPE_WEB]: (4096 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_OLTP]: (8192 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_DW]: (16384 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_DESKTOP]: (2048 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_MIXED]: (4096 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB'])
}[dbType])
}
]
}
Bare for at forklare kort, det registrerer, om dbVersion <9.5, så bestemmer det de foreslåede værdier for variablerne checkpoint_segments eller min_wal_size/max_wal_size baseret på typen af dbType-værdi, der er indstillet under web-UI-formularen.
Grundlæggende kan du lære mere om algoritmen om, hvordan den beslutter sig for at foreslå værdierne, ved at se på dette script configuration.js.
PostgreSQL-konfigurationsjustering med ClusterControl
Hvis du bruger ClusterControl til at oprette, bygge eller importere en klynge, foretager den automatisk en indledende tuning baseret på de givne hardwarespecifikationer. For eksempel oprettelse af en klynge med følgende jobspecifikationer nedenfor,
{
"command": "create_cluster",
"group_id": 1,
"group_name": "admins",
"job_data": {
"api_id": 1,
"cluster_name": "pg_11",
"cluster_type": "postgresql_single",
"company_id": "1",
"datadir": "/var/lib/postgresql/11/",
"db_password": "dbapgadmin",
"db_user": "dbapgadmin",
"disable_firewall": true,
"disable_selinux": true,
"generate_token": true,
"install_software": true,
"nodes": [
{
"hostname": "192.168.30.40",
"hostname_data": "192.168.30.40",
"hostname_internal": "",
"port": "5432"
},
{
"hostname": "192.168.30.50",
"hostname_data": "192.168.30.50",
"hostname_internal": "",
"port": "5432",
"synchronous": false
}
],
"port": "5432",
"ssh_keyfile": "/home/vagrant/.ssh/id_rsa",
"ssh_port": "22",
"ssh_user": "vagrant",
"sudo_password": "",
"user_id": 1,
"vendor": "default",
"version": "11"
},
"user_id": 1,
"user_name": "[email protected]"
}
Giver mig følgende tuning som vist nedenfor:
[[email protected] ~]# s9s job --log --job-id 84919 | sed -n '/stat_statements/,/Writing/p'
192.168.30.40:5432: Enabling stat_statements plugin.
192.168.30.40:5432: Setting wal options.
192.168.30.40:5432: Performance tuning.
192.168.30.40: Detected memory: 1999MB.
192.168.30.40:5432: Selected workload type: mixed
Using the following fine-tuning options:
checkpoint_completion_target: 0.9
effective_cache_size: 1535985kB
maintenance_work_mem: 127998kB
max_connections: 100
shared_buffers: 511995kB
wal_keep_segments: 32
work_mem: 10239kB
Writing file '192.168.30.40:/etc/postgresql/11/main/postgresql.conf'.
192.168.30.50:5432: Enabling stat_statements plugin.
192.168.30.50:5432: Setting wal options.
192.168.30.50:5432: Performance tuning.
192.168.30.50: Detected memory: 1999MB.
192.168.30.50:5432: Selected workload type: mixed
Using the following fine-tuning options:
checkpoint_completion_target: 0.9
effective_cache_size: 1535985kB
maintenance_work_mem: 127998kB
max_connections: 100
shared_buffers: 511995kB
wal_keep_segments: 32
work_mem: 10239kB
Writing file '192.168.30.50:/etc/postgresql/11/main/postgresql.conf'.
Derudover justerer den også dit system eller kerneparametre såsom,
192.168.30.50:5432: Tuning OS parameters.
192.168.30.50:5432: Setting vm.swappiness = 1.
Konklusion
ClusterControl-indstillingsparametrene er også baseret på den algoritme, der deles i pgtune#L477. Det er ikke fancy, men du kan ændre det til de værdier, du ønsker. Med disse indstillingsværdier giver det dig mulighed for at få en rå start, som er klar nok til at håndtere en produktionsbelastning baseret på de oprindelige givne værdier.