Om du är ny på PostgreSQL handlar den vanligaste utmaningen du står inför om hur du finjusterar din databasmiljö.
När PostgreSQL är installerat producerar den automatiskt en grundläggande postgresql.conf-fil. Denna konfigurationsfil hålls normalt i datakatalogen beroende på vilket operativsystem du använder. Till exempel, i Ubuntu placerar PostgreSQL konfigurationerna (pg_hba.conf, postgresql.conf, pg_ident.conf) i katalogen /etc/postgresql. Innan du kan ställa in din PostgreSQL-databas måste du först hitta postgresql.conf-filerna.
Men vilka är de rätta inställningarna att använda? och vilka är värdena inställda på initialt? Att använda externa verktyg som PGTune (och alternativa verktyg som ClusterControl) hjälper dig att lösa detta specifika problem.
Vad är PGTune?
PGtune är en konfigurationsguide som ursprungligen skapades av Greg Smith från 2ndQuadrant. Det är baserat på ett Python-skript som tyvärr inte längre stöds. (Den stöder inte nyare versioner av PostgreSQL.) Den övergick sedan till pgtune.leopard.in.ua (som är baserad på den ursprungliga PGTune) och är nu en konfigurationsguide som du kan använda för dina PG-databaskonfigurationsinställningar.
PGtune används för att beräkna konfigurationsparametrar för PostgreSQL baserat på maximal prestanda för en given hårdvarukonfiguration. Det är dock inte en silverkula, eftersom många inställningar beror inte bara på hårdvarukonfigurationen, utan också på storleken på databasen, antalet klienter och frågornas komplexitet.
Hur man använder PGTune
Den gamla versionen av PGTune baserades på python-skript som du kan anropa via skalkommando (med 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 nya är mycket enklare och bekvämare eftersom du bara kan komma åt den via webbläsaren. Gå bara till https://pgtune.leopard.in.ua/. Ett bra exempel är som nedan:
Allt du behöver göra är att ange följande fält nedan:
- DB-version - versionen av din PostgreSQL. Den stöder versioner av PostgreSQL från 9.2, 9.3, 9.4, 9.5, 9.6, 10, 11 och 12.
- OS-typ - typ av operativsystem (Linux, OS X, Windows)
- DB-typ - databastypen som huvudsakligen är vilken typ av transaktionsbehandling som din databas kommer att hantera (webbapplikation, OLTP, datalager, skrivbordsapplikation, blandad typ av applikationer)
- Totalt minne (RAM) - Det totala minnet som din PG-instans kommer att hantera. Behöver ange det i GiB.
- Antal processorer - Antal processorer som PostgreSQL kan använda processorer =trådar per kärna * kärnor per socket * sockets
- Antal anslutningar - Maximalt antal PostgreSQL-klientanslutningar
- Datalagring - Typ av datalagringsenhet som du kan välja mellan SSD, HDD eller SAN-baserad lagring.
Klicka sedan på knappen Generera. Alternativt kan du också köra ALTER SYSTEM-satsen som genererar postgresql.auto.conf, men det tar inte förrän du träffar en PostgreSQL-omstart.
Hur sätter det värdena
Algorithmen för det här verktyget finns i princip här i configuration.js. Den delar samma algoritm från den gamla PGTune som börjar här pgtune#L477. Till exempel, versioner av PostgreSQL <9.5 stöder checkpoint_segments, men PG>=9.5 använder min_wal_size och max_wal_size.
Inställning av checkpoint_segments eller min_wal_size/max_wal_size beror på vilken typ av PostgreSQL-version och DB-typ av databasapplikationstransaktion. Se hur i utdraget nedan:
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])
}
]
}
Bara för att förklara kort, den upptäcker om dbVersion <9.5, sedan bestämmer den de föreslagna värdena för variablerna checkpoint_segments eller min_wal_size/max_wal_size baserat på typen av dbType-värde som ställts in under webbgränssnittsformuläret.
I grund och botten kan du lära dig mer om algoritmen om hur den bestämmer sig för att föreslå värdena genom att titta på det här skriptet configuration.js.
PostgreSQL-konfigurationsinställning med ClusterControl
Om du använder ClusterControl för att skapa, bygga eller importera ett kluster, gör det automatiskt en initial justering baserat på de givna hårdvaruspecifikationerna. Till exempel, skapa ett kluster med följande jobbspecifikationer nedan,
{
"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]"
}
Ger mig följande stämning som visas nedan:
[[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'.
Dessutom justerar den också ditt system eller kärnparametrar som,
192.168.30.50:5432: Tuning OS parameters.
192.168.30.50:5432: Setting vm.swappiness = 1.
Slutsats
ClusterControl-inställningsparametrarna är också baserade på algoritmen som delas i pgtune#L477. Det är inte snyggt, men du kan ändra det till vilka värden du vill. Med dessa inställningsvärden kan du få en råstart som är redo nog att hantera en produktionsbelastning baserat på de initiala givna värdena.