Wenn Sie neu bei PostgreSQL sind, besteht die häufigste Herausforderung darin, Ihre Datenbankumgebung zu optimieren.
Bei der Installation von PostgreSQL wird automatisch eine grundlegende postgresql.conf-Datei erstellt. Diese Konfigurationsdatei wird normalerweise je nach verwendetem Betriebssystem im Datenverzeichnis gespeichert. Beispielsweise legt PostgreSQL in Ubuntu die Konfigurationen (pg_hba.conf, postgresql.conf, pg_ident.conf) im Verzeichnis /etc/postgresql ab. Bevor Sie Ihre PostgreSQL-Datenbank optimieren können, müssen Sie zuerst die postgresql.conf-Dateien finden.
Aber was sind die richtigen Einstellungen? und wie sind die werte anfangs eingestellt? Die Verwendung externer Tools wie PGTune (und alternativer Tools wie ClusterControl) hilft Ihnen bei der Lösung dieses speziellen Problems.
Was ist PGTune?
PGTune ist ein Konfigurationsassistent, der ursprünglich von Greg Smith von 2ndQuadrant erstellt wurde. Es basiert auf einem Python-Skript, das leider nicht mehr unterstützt wird. (Es unterstützt keine neueren Versionen von PostgreSQL.) Es wurde dann in pgtune.leopard.in.ua umgewandelt (das auf dem ursprünglichen PGTune basiert) und ist jetzt ein Konfigurationsassistent, den Sie für Ihre PG-Datenbankkonfigurationseinstellungen verwenden können.
PGTune wird verwendet, um Konfigurationsparameter für PostgreSQL basierend auf der maximalen Leistung für eine bestimmte Hardwarekonfiguration zu berechnen. Es ist jedoch kein Wundermittel, da viele Einstellungen nicht nur von der Hardwarekonfiguration abhängen, sondern auch von der Größe der Datenbank, der Anzahl der Clients und der Komplexität der Abfragen.
Verwendung von PGTune
Die alte Version von PGTune basierte auf einem Python-Skript, das Sie über einen Shell-Befehl (mit Ubuntu) aufrufen können:
[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
Aber das neue ist viel einfacher und bequemer, da Sie einfach über den Browser zugreifen können. Gehen Sie einfach zu https://pgtune.leopard.in.ua/. Ein gutes Beispiel ist wie folgt:
Sie müssen lediglich die folgenden Felder unten angeben:
- DB-Version - die Version Ihres PostgreSQL. Es unterstützt PostgreSQL-Versionen von 9.2, 9.3, 9.4, 9.5, 9.6, 10, 11 und 12.
- Betriebssystemtyp - Art des Betriebssystems (Linux, OS X, Windows)
- DB-Typ - der Datenbanktyp, bei dem es sich hauptsächlich um die Art der Transaktionsverarbeitung handelt, die Ihre Datenbank handhaben wird (Webanwendung, OLTP, Data Warehousing, Desktop-Anwendung, gemischte Anwendungstypen)
- Gesamtspeicher (RAM) - Der Gesamtspeicher, den Ihre PG-Instanz verarbeiten wird. Muss in GiB angegeben werden.
- Anzahl der CPUs - Anzahl der CPUs, die PostgreSQL verwenden kann CPUs =Threads pro Kern * Kerne pro Socket * Sockets
- Anzahl der Verbindungen - Maximale Anzahl von PostgreSQL-Client-Verbindungen
- Datenspeicherung - Typ des Datenspeichergeräts, das Sie zwischen SSD-, HDD- oder SAN-basiertem Speicher auswählen können.
Klicken Sie dann auf die Schaltfläche Generieren. Alternativ können Sie auch die ALTER SYSTEM-Anweisung ausführen, die postgresql.auto.conf generiert, aber es dauert nicht, bis Sie einen PostgreSQL-Neustart treffen.
Wie werden die Werte festgelegt
Der Algorithmus für dieses Tool ist im Wesentlichen hier in der configuration.js zu finden. Es teilt den gleichen Algorithmus wie das alte PGTune, beginnend hier pgtune#L477. Beispielsweise unterstützen Versionen von PostgreSQL <9.5 checkpoint_segments, aber PG>=9.5 verwendet min_wal_size und max_wal_size.
Das Festlegen von checkpoint_segments oder min_wal_size/max_wal_size hängt von der Art der PostgreSQL-Version und dem DB-Typ der Datenbankanwendungstransaktion ab. Sehen Sie im folgenden Snippet, wie das geht:
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])
}
]
}
Um es kurz zu erklären, es erkennt, ob dbVersion <9.5 ist, und bestimmt dann die vorgeschlagenen Werte für die Variablen checkpoint_segments oder min_wal_size/max_wal_size basierend auf dem Typ des dbType-Werts, der während des Web-UI-Formulars festgelegt wurde.
Grundsätzlich können Sie mehr über den Algorithmus erfahren, wie er entscheidet, die Werte vorzuschlagen, indem Sie sich dieses Skript configuration.js ansehen.
PostgreSQL-Konfigurationsoptimierung mit ClusterControl
Wenn Sie ClusterControl zum Erstellen, Bauen oder Importieren eines Clusters verwenden, führt es automatisch eine anfängliche Abstimmung basierend auf den angegebenen Hardwarespezifikationen durch. Erstellen Sie beispielsweise einen Cluster mit den folgenden Jobspezifikationen unten,
{
"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]"
}
Bietet mir die folgende Stimmung wie unten gezeigt:
[[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'.
Zusätzlich stimmt es auch Ihre System- oder Kernel-Parameter ab, wie z. B.
192.168.30.50:5432: Tuning OS parameters.
192.168.30.50:5432: Setting vm.swappiness = 1.
Fazit
Die Tuning-Parameter von ClusterControl basieren ebenfalls auf dem in pgtune#L477 freigegebenen Algorithmus. Es ist nicht schick, aber Sie können es auf beliebige Werte ändern. Mit diesen Einstellwerten können Sie einen Rohstart haben, der bereit genug ist, um eine Produktionslast basierend auf den anfänglich angegebenen Werten zu bewältigen.