Blog JSystems - uwalniamy wiedzę!

Szukaj

PostgreSQL

Brak historii obciążenia bazy - jak monitorować PostgreSQL w Percona PMM

W skrócie

  • Problem: po spowolnieniu bazy nie da się ustalić, które zapytania obciążały ją o konkretnej godzinie.
  • Dlaczego: widoki statystyk PostgreSQL pokazują stan bieżący albo liczniki narastające od resetu, bez zapisu w czasie.
  • Rozwiązanie: stawiamy serwer Percona PMM, instalujemy klienta na serwerze bazy i rejestrujemy klaster ze źródłem zapytań pg_stat_statements albo pg_stat_monitor.

Ten problem dotyczy zespołów, które dowiadują się o spowolnieniu bazy po fakcie, gdy w widokach statystyk nie ma już śladu. Widoki statystyk PostgreSQL nie odpowiedzą na pytanie, co działo się o konkretnej godzinie. Pokażemy, jak postawić Percona Monitoring and Management (PMM), czyli otwartoźródłowy system monitoringu baz danych, i podłączyć do niego klaster PostgreSQL 16.

Jak to wygląda w praktyce

Rano system działał wolno, a po południu nikt nie potrafi wskazać przyczyny. Widok pg_stat_activity pokazuje tylko sesje, które istnieją w chwili zapytania. pg_stat_statements trzyma sumy od ostatniego resetu, a z czasem łączy go tylko moment tego resetu. Sprawdziliśmy to w PostgreSQL 16.4:

SELECT column_name FROM information_schema.columns
WHERE table_name = 'pg_stat_statements_info'
ORDER BY ordinal_position;

 column_name
-------------
 dealloc
 stats_reset

Wiesz więc, od kiedy liczniki rosną, ale nie wiesz, które zapytania obciążały bazę o konkretnej godzinie ani jak wyglądało wtedy użycie procesora i dysku. Bez zewnętrznego systemu monitoringu ta informacja przepada.

Dlaczego tak się dzieje

PostgreSQL nie zapisuje historii statystyk. Widoki z rodziny pg_stat_* to stan bieżący albo liczniki, które ktoś musi regularnie odczytywać i zapisywać. PMM robi to za Ciebie. Składa się z serwera (pmm-server, uruchamiany w kontenerze Docker, zbudowany między innymi na Grafanie, VictoriaMetrics i ClickHouse) oraz klienta (pmm-client) instalowanego na serwerze bazy. Klient przez lokalne eksportery, czyli małe programy zbierające metryki, odczytuje dane systemu operacyjnego i bazy. Moduł Query Analytics (QAN) pobiera statystyki zapytań z pg_stat_statements albo pg_stat_monitor i przechowuje je w czasie, więc nawet przy pg_stat_statements widzisz, jak obciążenie rozkładało się w ciągu dnia.

Gdy klienta nie da się zainstalować, na przykład w Amazon RDS, serwer PMM zbiera dane sam, przez API albo zdalne połączenie z bazą. W każdym wariancie konto monitoringu potrzebuje uprawnień do cudzych statystyk. W naszym teście rola bez nich widziała w kolumnie query widoku pg_stat_activity napis <insufficient privilege> zamiast treści zapytań innych użytkowników, a wywołanie pg_ls_waldir() kończyło się błędem permission denied for function pg_ls_waldir.

Jak to rozwiązać krok po kroku

  1. Na osobnej maszynie uruchom skrypt instalacyjny serwera z dokumentacji PMM 3: curl -fsSL https://www.percona.com/get/pmm | /bin/bash. Skrypt w razie potrzeby instaluje Dockera, pobiera obraz percona/pmm-server:3 i uruchamia kontener na porcie 443. Na Rocky Linux zainstaluj najpierw Dockera ręcznie, bo automatyczna instalacja ze skryptu może się tam nie udać. Dla typowego wdrożenia, do 30 monitorowanych węzłów, dokumentacja zaleca 4 rdzenie, 8 GB RAM i 100 GB dysku. Otwórz w przeglądarce https://adres_serwera_PMM, zaloguj się jako admin z hasłem admin i zmień hasło przy pierwszym logowaniu.
  2. Na serwerze bazy utwórz konto monitoringu. Dokumentacja PMM 3 zaleca konto z atrybutem SUPERUSER, a w lekcji kursu pokazujemy węższy wariant z rolą pg_monitor. Wybierz jeden z nich:
    -- wariant z dokumentacji PMM 3
    CREATE USER pmm WITH SUPERUSER ENCRYPTED PASSWORD 'Mocne_Haslo_1';
    
    -- wariant z lekcji kursu
    CREATE USER pmm WITH PASSWORD 'Mocne_Haslo_1';
    GRANT pg_monitor TO pmm;
    W naszym teście rola pg_monitor dała członkostwo w pg_read_all_settings, pg_read_all_stats i pg_stat_scan_tables. Klient PMM połączy się z bazą przez 127.0.0.1, więc w pg_hba.conf, przed pozostałymi wierszami host, dopisz host all pmm 127.0.0.1/32 scram-sha-256 i przeładuj konfigurację: SELECT pg_reload_conf();.
  3. Włącz źródło statystyk zapytań. Na Red Hat, Rocky i Alma pg_stat_statements jest w osobnym pakiecie: sudo dnf install -y postgresql16-contrib, na Debianie i Ubuntu w pakiecie serwera. Dokumentacja PMM zaleca w postgresql.conf (na Red Hat w /var/lib/pgsql/16/data/, na Debianie i Ubuntu w /etc/postgresql/16/main/):
    shared_preload_libraries = 'pg_stat_statements'
    track_activity_query_size = 2048
    pg_stat_statements.track = all
    track_io_timing = on
    Zrestartuj klaster (sudo systemctl restart postgresql-16 na Red Hat, sudo systemctl restart postgresql na Debianie i Ubuntu) i w bazie postgres wykonaj CREATE EXTENSION pg_stat_statements;.
  4. Na serwerze bazy zainstaluj klienta z repozytorium pmm3-client:
    # Red Hat, Rocky, Alma
    sudo yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
    sudo percona-release enable pmm3-client
    sudo yum install -y pmm-client
    
    # Debian, Ubuntu
    wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
    sudo dpkg -i percona-release_latest.generic_all.deb
    sudo percona-release enable pmm3-client
    sudo apt update
    sudo apt install -y pmm-client
    
    # kontrola instalacji
    pmm-admin --version
  5. Zarejestruj klienta na serwerze PMM. Dokumentacja PMM 3 zaleca token konta usługowego: w konsoli PMM otwórz Users and access, potem Service accounts, dodaj konto z rolą Admin i wygeneruj dla niego token (zaczyna się od glsa_ i jest pokazywany tylko raz).
    sudo pmm-admin config --server-insecure-tls \
      --server-url=https://service_token:TOKEN@adres_serwera_PMM:443
    Słowo service_token wpisujesz dosłownie, w miejsce TOKEN wklejasz token. Opcja --server-insecure-tls pomija weryfikację domyślnego, samopodpisanego certyfikatu serwera. Wariant z hasłem administratora w adresie dokumentacja odradza, bo hasło trafia do historii poleceń i listy procesów.
  6. Dodaj usługę PostgreSQL:
    sudo pmm-admin add postgresql \
      --username=pmm --password=Mocne_Haslo_1 \
      --host=127.0.0.1 --port=5432 --service-name=pg-orders
    Domyślnym źródłem zapytań jest pgstatements. Jeśli używasz pg_stat_monitor, dodaj --query-source=pgstatmonitor.

Jak sprawdzić, że zadziałało

Na serwerze bazy uruchom dwa polecenia:

pmm-admin status
pmm-admin list

W wyniku pmm-admin status wiersz Connected: true oznacza, że klient rozmawia z serwerem PMM. Przy Connected: false sprawdź adres serwera w rejestracji i to, czy zapora przepuszcza ruch z serwera bazy na port 443 serwera PMM. pmm-admin list wypisuje zarejestrowane usługi i agentów: pmm_agent powinien mieć status Connected, a pozostali agenci, w tym postgres_exporter, status Running. W konsoli PMM w przeglądarce otwórz Query Analytics i posortuj zapytania po kolumnach Load (łączny czas), Query Count (liczba wykonań) i Query Time (czas wykonania). Ustaw zakres z ostatniej godziny: jeśli widzisz wykres obciążenia z wcześniejszych minut, historia jest zbierana i jutro odpowiesz na pytanie o poranne spowolnienie.

Powiązane problemy

Wróć do listy: 112 najczęstszych pytań i problemów z PostgreSQL

Najczęściej zadawane pytania

Czy użytkownik pmm musi być superużytkownikiem?
Dokumentacja PMM 3 zaleca konto z atrybutem SUPERUSER. W lekcji kursu pokazujemy wariant z rolą pg_monitor, która daje odczyt ustawień i statystyk wszystkich sesji. W naszym teście rola bez pg_monitor widziała napis insufficient privilege zamiast treści zapytań innych użytkowników.
Czym różni się pg_stat_statements od pg_stat_monitor jako źródło zapytań w PMM?
PMM domyślnie pobiera zapytania z pg_stat_statements, a opcja --query-source=pgstatmonitor przełącza go na pg_stat_monitor. W obu przypadkach moduł Query Analytics przechowuje statystyki w czasie, więc widzisz, jak obciążenie rozkładało się w ciągu dnia, czego samo pg_stat_statements nie pokazuje.
Czy PMM może monitorować bazę, na której nie da się zainstalować klienta?
Tak. W takim przypadku, na przykład w Amazon RDS, serwer PMM sam zbiera dane przez API albo przez zdalne połączenie z bazą. Konto monitoringu nadal potrzebuje uprawnień do odczytu statystyk wszystkich sesji.
Ile zasobów potrzebuje serwer PMM?
Dla typowego wdrożenia, do 30 monitorowanych węzłów, dokumentacja PMM 3 zaleca 4 rdzenie procesora, 8 GB pamięci RAM i 100 GB miejsca na dysku. Serwer działa w kontenerze Docker, a skrypt instalacyjny sam instaluje Dockera, jeśli go brakuje, pobiera obraz i uruchamia kontener.
Jak sprawdzić, że klient PMM wysyła dane do serwera?
Uruchom pmm-admin status na serwerze bazy. Wiersz Connected: true oznacza, że połączenie z serwerem PMM działa. Polecenie pmm-admin list pokazuje zarejestrowane usługi i agentów: pmm_agent powinien mieć status Connected, a pozostali agenci, w tym postgres_exporter, status Running.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...