Jeżeli jesteś nowy w PostgreSQL, najczęstszym wyzwaniem, przed którym stajesz, jest dostrojenie środowiska bazy danych.
Po zainstalowaniu PostgreSQL automatycznie tworzy podstawowy plik postgresql.conf. Ten plik konfiguracyjny jest zwykle przechowywany w katalogu danych w zależności od używanego systemu operacyjnego. Na przykład w Ubuntu PostgreSQL umieszcza konfiguracje (pg_hba.conf, postgresql.conf, pg_ident.conf) w katalogu /etc/postgresql. Zanim będziesz mógł dostroić bazę danych PostgreSQL, musisz najpierw zlokalizować pliki postgresql.conf.
Ale jakich ustawień należy użyć? i jakie są początkowo ustawione wartości? Korzystanie z zewnętrznych narzędzi, takich jak PGTune (i alternatywnych narzędzi, takich jak ClusterControl), pomoże rozwiązać ten konkretny problem.
Co to jest PGTune?
PGTune to kreator konfiguracji, który został pierwotnie stworzony przez Grega Smitha z 2ndQuadrant. Opiera się na skrypcie Pythona, który niestety nie jest już obsługiwany. (Nie obsługuje nowszych wersji PostgreSQL.) Następnie został przeniesiony do pgtune.leopard.in.ua (opartego na oryginalnym PGTune) i jest teraz kreatorem konfiguracji, którego możesz użyć do ustawień konfiguracji bazy danych PG.
PGTune służy do obliczania parametrów konfiguracyjnych PostgreSQL na podstawie maksymalnej wydajności dla danej konfiguracji sprzętowej. Nie jest to jednak srebrna kula, ponieważ wiele ustawień zależy nie tylko od konfiguracji sprzętowej, ale także od wielkości bazy danych, liczby klientów i złożoności zapytań.
Jak korzystać z PGTune
Stara wersja PGTune była oparta na skrypcie Pythona, który można wywołać za pomocą polecenia powłoki (przy użyciu 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
Ale nowy jest o wiele łatwiejszy i wygodniejszy, ponieważ możesz uzyskać dostęp przez przeglądarkę. Wystarczy wejść na stronę https://pgtune.leopard.in.ua/. Dobry przykład jest taki jak poniżej:
Wystarczy określić poniższe pola:
- Wersja bazy danych - wersja twojego PostgreSQL. Obsługuje wersje PostgreSQL od 9.2, 9.3, 9.4, 9.5, 9.6, 10, 11 i 12.
- Typ systemu operacyjnego - typ systemu operacyjnego (Linux, OS X, Windows)
- Typ DB - typ bazy danych, który jest głównie rodzajem przetwarzania transakcyjnego obsługiwanej przez Twoją bazę danych (aplikacja internetowa, OLTP, hurtownia danych, aplikacja komputerowa, aplikacje o mieszanym typie)
- Całkowita pamięć (RAM) - Całkowita pamięć, którą obsłuży Twoja instancja PG. Musisz to określić w GiB.
- Liczba procesorów - Liczba procesorów, których PostgreSQL może używać Procesory =wątki na rdzeń * rdzenie na gniazdo * gniazda
- Liczba połączeń - Maksymalna liczba połączeń klientów PostgreSQL
- Przechowywanie danych - Rodzaj urządzenia do przechowywania danych, które można wybrać z pamięci masowej SSD, HDD lub SAN.
Następnie naciśnij przycisk Generuj. Alternatywnie możesz również uruchomić instrukcję ALTER SYSTEM, która wygeneruje postgresql.auto.conf, ale nie potrwa to dopóki nie uruchomisz restartu PostgreSQL.
Jak ustala wartości
Algorytm tego narzędzia można znaleźć w pliku configuration.js. Ma ten sam algorytm ze starego PGTune, zaczynając tutaj pgtune#L477. Na przykład wersje PostgreSQL <9.5 obsługują segmenty punktów kontrolnych, ale PG>=9.5 używa min_wal_size i max_wal_size.
Ustawienie checkpoint_segments lub min_wal_size/max_wal_size zależy od typu wersji PostgreSQL i typu transakcji aplikacji bazy danych. Zobacz jak w poniższym fragmencie:
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])
}
]
}
Pokrótce wyjaśnię, że wykrywa, czy dbVersion <9.5, a następnie określa sugerowane wartości zmiennych checkpoint_segments lub min_wal_size/max_wal_size na podstawie typu wartości dbType ustawionej w formularzu internetowego interfejsu użytkownika.
Zasadniczo możesz dowiedzieć się więcej o algorytmie decydującym o sugerowaniu wartości, patrząc na ten skrypt configuration.js.
Dostrajanie konfiguracji PostgreSQL za pomocą ClusterControl
Jeśli używasz ClusterControl do tworzenia, budowania lub importowania klastra, automatycznie wykonuje on wstępne strojenie w oparciu o podane specyfikacje sprzętowe. Na przykład tworzenie klastra z poniższymi specyfikacjami zadań,
{
"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]"
}
Zapewnia mi następujące strojenie, jak pokazano poniżej:
[[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'.
Dodatkowo dostosowuje również parametry systemu lub jądra, takie jak,
192.168.30.50:5432: Tuning OS parameters.
192.168.30.50:5432: Setting vm.swappiness = 1.
Wnioski
Parametry strojenia ClusterControl są również oparte na algorytmie udostępnionym w pgtune#L477. To nie jest wyszukane, ale możesz je zmienić na dowolne wartości. Dzięki tym wartościom ustawień możesz mieć surowy start, który jest wystarczająco gotowy do obsługi obciążenia produkcyjnego w oparciu o początkowe podane wartości.