Blog JSystems - uwalniamy wiedzę!

Szukaj
Z tego artykułu dowiesz się:
  • czym jest Percona Monitoring and Management (PMM) i w jakim celu się go stosuje,
  • jak zainstalować serwer PMM na Ubuntu,
  • jak zainstalować serwer PMM na systemach z rodziny Red Hat,
  • jak zainstalować klientów PMM na klastrach PostgreSQL i podpiąć je do serwera PMM,
  • jak korzystać z PMM,
  • jak zintegrować PMM z pg_stat_statements i pg_stat_monitor,
  • jak tworzyć własne metryki do obserwacji w PMM

To narzędzie open source do monitoringu baz danych PostgreSQL, MySQL, MongoDB i pochodnych. Oparte na Grafanie, VictoriaMetrics, ClickHouse, alertmanager, PostgreSQL i innych.
Składa się z części serwerowej (pmm-server) i klienta instalowanego na serwerze bazodanowym (pmm-client). Klient zbiera informacje o systemie operacyjnym i bazie danych za pomocą eksporterów zainstalowanych lokalnie na serwerze db. W przypadku, kiedy nie chcemy lub nie możemy zainstalować klienta, np. RDS, część serwerowa przejmuje odpowiedzialność za zbieranie informacji. Dla RDS za pomocą API pobiera informacje o systemie operacyjnym i klastrze postgresa lub w przypadku klasycznych implementacji może łączyć się zdalnie do postgresa i zbierać dane do monitoringu.

Instalacja serwera jest bardzo prosta, można ją wykonać jednym poleceniem, jako root lub z uprawnieniami roota. Na serwerze 4 lub 5 wykonujemy:

curl -fsSL https://www.percona.com/get/pmm | /bin/bash

Skrypt sam wykrywa system operacyjny, instaluje dockera, pobiera obraz dla dockera i uruchamia PMM.

Starting PMM server...

Created PMM Data Volume: pmm-data

Created PMM Server: pmm-server

    Use the following command if you ever need to update your container by hand:

    docker run -d -p 443:443 --volumes-from pmm-data --name pmm-server --restart always percona/pmm-server:2



PMM Server has been successfully setup on this system!



You can access your new server using one of the following web addresses:

    https://172.17.0.1:443/

    https://10.0.2.15:443/

    https://192.168.56.15:443/

    https://127.0.0.1:443/



The default username is 'admin' and the password is 'admin' :)

Note: Some browsers may not trust the default SSL certificate when you first open one of the urls above.

If this is the case, Chrome users may want to type 'thisisunsafe' to bypass the warning.

Po zainstalowaniu możemy otworzyć konsolę PMM w przeglądarce, używając użytkownika i hasła admin/admin, przy pierwszym logowaniu zmieniamy hasło.

Od razu po instalacji monitorowana będzie jedna instancja postgresa, ponieważ PMM również stoi na Postgresie i monitoruje też sam siebie.

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa

Kolejnym krokiem będzie instalacja klienta na serwerach z postgresem.

Pobranie i instalacja repozytorium i pmm-clienta na Ubuntu

# pobieramy informacje o repozytorium

wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb



# instalacja repozytorium

sudo dpkg -i percona-release_latest.generic_all.deb

Aktualizacja informacji o paczkach dostępnych w repozytoriach i instalacja klienta

sudo apt update



sudo apt install -y pmm2-client

Pobranie i instalacja repozytorium i pmm-clienta na systemach z rodziny Red Hat

# pobieramy informacje o repozytorium

sudo dnf install -y \

https://repo.percona.com/yum/percona-release-latest.noarch.rpm



# instalacja klienta

sudo dnf install -y pmm2-client

Sprawdzamy zainstalowaną wersję PMM serwera i klientów na wszystkich serwerach, musi być wszędzie taka sama. Następnie możemy zarejestrować klienta na serwerze. W miejsce X.X.X.X wstawiamy IP serwera:

pmm-admin --version



sudo pmm-admin config --server-insecure-tls --server-url=https://admin:haslo@X.X.X.X:443 <adresserveraklienta> generic(lub container) <nazwa>



sudo pmm-admin config --server-insecure-tls --server-url=https://admin:qwe123@192.168.0.23:443 192.168.0.50 generic pg2

Przed dodaniem postgresa do monitoringu musimy stworzyć użytkownika z odpowiednimi uprawnieniami.

CREATE USER pmm WITH PASSWORD '******';



grant pg_monitor to pmm;

Następnie dodajemy odpowiednie wpisy do pg_hba.conf dla użytkownika 'pmm', przeładowujemy konfigurację i sprawdzamy, czy użytkownik jest pytany o hasło przy logowaniu.

# na serwerze bazodanowym

# edycja pg_hba

vi /postgres/data/pg_hba.conf

host all pmm <adres_ip_serwera_PMM>/32 md5

# przeładowanie konfiguracji

psql -c "select pg_reload_conf()"



# test połączenia z serwera z PMM

psql -h <adres_ip_serwera_PMM> -U pmm postgres

Ostatnim krokiem będzie zarejestrowanie klienta na serwerze, co automatycznie rozpocznie zbieranie danych z postgresa i systemu operacyjnego.

# z serwera bazodanowego z zainstalowanym pmm-clientem

postgres@ubuntu:/etc/postgresql/15/main$ pmm-admin add postgresql \

--username=pmm \

--password=<haslo_uzytkownika_pmm> \

--server-url=https://admin:haslo@<adres_ip_serwera_PMM>:443 \

--server-insecure-tls \

--service-name=nazwa \

--query-source="pgstatmonitor"

Po zarejestrowaniu klienta i serwisu dla postgresa PMM automatycznie zacznie monitorować setki parametrów. Na stronie głównej mamy przegląd naszego środowiska, gdzie od razu po otworzeniu strony możemy zobaczyć, które serwery monitoring wykrywa jako potencjalnie problematyczne.

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa (2)

Pulpity z bardziej szczegółowymi informacjami znajdziemy w menu po lewej lub klikając na "Home Dashboard" na górze ekranu. Z odpowiednich kategorii wybieramy interesujące nas widoki, sortujemy według serwerów lub środowisk, które chcemy sprawdzić, i mamy - przegląd informacji o serwerach oraz bazach danych.

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa (3)
Integracja z pg_stat_statements i pg_stat_monitor

Dodając postgresa do monitoringu przez linię poleceń, PMM domyślnie włącza integrację z pg_stat_statements. Jeżeli chcielibyśmy skorzystać z pg_stat_monitor, musimy dodać przełącznik --query-source="pgstatmonitor"

postgres@ubuntu:/etc/postgresql/15/main$ pmm-admin add postgresql \

--username=pmm \

--password=123 \

--server-url=https://admin:haslo@X.X.X.X:443 \

--server-insecure-tls \

--service-name=nazwa \

--query-source="pgstatmonitor"

Dzięki integracji z oboma rozszerzeniami mamy możliwość wygodnej analizy zapytań, z przeglądem ich statystyk. Dla obu rozszerzeń dane są rozłożone w czasie, więc nawet jeżeli korzystamy z pg_stat_statements, możemy śledzić, jak w czasie rozkładały się zapytania, czego nie możemy zrobić z samym rozszerzeniem. Używając pg_stat_monitor, razem z przykładowymi zapytaniami, mamy możliwość sprawdzenia histogramów, listy relacji, z których zapytanie korzystało razem z ich definicją oraz przejrzenia planów wykonania, jeżeli je zbieramy.

Do narzędzia Query Analytics, w którym mamy przegląd zgromadzonych zapytań, możemy przejść z ekranu głównego za pomocą przycisku w prawym górnym rogu:

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa (4)

lub menu znajdującego się po lewej stronie:

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa (5)

Wewnątrz znajdziemy wszystkie zapytania, które były przechwycone przez pg_stat_statements lub pg_stat_monitor, z czasem ich wykonania, częstotliwością oraz liczbą. Dobrą praktyką jest od czasu do czasu wykonywać analizę zapytań. Można polecić trzy kategorie, top X najczęściej wykonywanych zapytań, posortowane przez "Query Count", top X zapytań, których suma czasów wykonania była najdłuższa, sortowane według kolumny "Load" oraz X najdłuższych zapytań w bazie, posortowane przez "Query Time". Często poprawiając te zapytania, możemy znacząco obniżyć obciążenie w bazie danych i jednocześnie poprawić jej wydajność.

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa (6)

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa (7)
Customowe zapytania

Jeżeli jednak brakuje nam jakiegokolwiek parametru, możemy go dodać w bardzo prosty sposób - za pomocą "custom queries". Wystarczy, że dodamy brakujące zapytanie w formacie YAML do jednego z katalogów w jednym z poniższych katalogów na serwerze, na którym działa postgres_exporter, lub w kontenerze pmm-server dla postgresa w chmurze, np.rds

ls /usr/local/percona/pmm2/collectors/custom-queries/postgresql

high-resolution - low-resolution - medium-resolution

Aby skorzystać z własnych zapytań do monitoringu baz na RDS, lub gdziekolwiek indziej, gdzie nie mamy dostępu do systemu operacyjnego i - nie możemy zainstalować PMM clienta, możemy na serwerze, na którym zainstalowany jest PMM, otworzyć konsolę dla kontenera pmm-server i w ten sam sposób dodać własne zapytania:

sudo docker exec -it pmm-server /bin/bash



ls /usr/local/percona/pmm2/collectors/custom-queries/postgresql

high-resolution - low-resolution - medium-resolution

Katalogi low, medium i high odpowiadają interwałom, w jakim dane zapytanie będzie wykonywane. Znajdziemy je w ustawieniach PMM i możemy ustawić według upodobań.
Przykładowo, do monitorowania konfliktów blokad - możemy stworzyć plik w wybranym katalogu, high, medium lub low resolution. Podany poniżej przykład został włączony do postgres_exportera w wersji 3.37 z mojej inicjatywy, jest to projekt z otwartym źródłem, więc każdy może dokonać jakiś zmian i zaproponować ich wdrożenie, o czym nieco informacji na końcu w ramach ciekawostki.

vi /usr/local/percona/pmm2/collectors/custom-queries/postgresql/high-resolution/pg_lock_conflicts.yml



pg_lock_conflicts:

  query: "SELECT blockinga.pid AS blocking_pid, count(*) as count FROM pg_catalog.pg_locks blockedl JOIN pg_stat_activity blockeda ON blockedl.pid = blockeda.pid JOIN pg_catalog.pg_locks blockingl ON(blockingl.transactionid=blockedl.transactionid AND blockedl.pid != blockingl.pid) JOIN pg_stat_activity blockinga ON blockingl.pid = blockinga.pid WHERE NOT blockedl.granted group by blocking_pid"

  metrics:

    - blocking_pid:

        usage: "LABEL"

        description: "PID of blocking session"

    - count:

        usage: "GAUGE"

        description: "Number of blocked sessions"

Dodając niestandardowe zapytania, musimy pamiętać, że każdy skrypt będzie wykonywany co zadany interwał, korzystając z własnego połączenia do postgresa. Im więcej skryptów, tym więcej zapytań. Możemy wpisać kilka zapytań do jednego skryptu, ale musimy mieć pewność, że skrypt zdąży się wykonać w czasie "metric resolution".

W ramach ciekawostki wspomnianej wcześniej, PMM i postgres_exporter to oprogramowanie open source, dlatego zawsze możemy sięgnąć do źródła i dopisać sobie własne zapytania do exportera i podmienić tylko plik wykonywalny postgres_exporter w obrazie "pmm-server" lub dla pmm-agenta na serwerze z bazą danych, co również jest dość proste. A jeżeli uważamy, że jest ono bardzo dobre i mogłoby zostać włączone do projektu, możemy wysłać Pull Request ze swoimi zmianami, a po weryfikacji może zostać włączony do głównego repozytorium.

https://github.com/percona/postgres_exporter/blob/pmm-2.38.0/cmd/postgres_exporter/queries.go https://github.com/percona/postgres_exporter/blob/pmm-2.38.0/cmd/postgres_exporter/postgres_exporter.go

Do pliku queries.go dopisujemy zapytanie opisane wartością, pod którą nowa metryka pojawi się w PMM.

  "pg_lock_conflicts": {

    {

      semver.MustParseRange(">0.0.0"),

                        `SELECT blockinga.pid AS blocking_pid, count(*) as count

                        FROM pg_catalog.pg_locks blockedl

                        JOIN pg_stat_activity blockeda ON blockedl.pid = blockeda.pid

                        JOIN pg_catalog.pg_locks blockingl ON(blockingl.transactionid=blockedl.transactionid

                          AND blockedl.pid != blockingl.pid)

                        JOIN pg_stat_activity blockinga ON blockingl.pid = blockinga.pid

                        WHERE NOT blockedl.granted

                        group by blocking_pid`,

    },

  },

Do pliku postgres_exporter.go dopisujemy opis zbieranych wartości wraz z ich typem, do dyspozycji mamy LABEL czyli tekst, GAUGE wartość liczbowa parametru, COUNTER licznik, który może tylko rosnąć lub DISCARD, jeżeli danej wartości nie chcemy zwracać w PMM. Każda wartość zwracana przez zapytanie powinna być tutaj uwzględniona.

"pg_lock_conflicts":{

  map[string]ColumnMapping{

  "blocking_pid": {LABEL, "PID of blocking session", nil, nil},

  "count": {GAUGE, "Number of blocked sessions", nil, nil},

  },

 true,

 0,

 },

A następnie skompilować wg instrukcji https://github.com/percona/postgres_exporter/tree/pmm-2.38.0

Konfiguracja monitoringu Patroni na podstawie danych z RestAPI /metrics

PMM umożliwia również dodawanie własnych "exporterów", czyli źródeł danych dla monitoringu. W przypadku Patroni możemy w bardzo prosty sposób wykorzystać jego RestAPI nasłuchujące na porcie 8008, aby rozpocząć zbieranie informacji o klastrze do monitoringu.

Konfiguracja zewnętrznego exportera w PMM ogranicza się do wykonania jednego polecenia na każdym z serwerów Patroni pod warunkiem, że mamy tam już skonfigurowany klienta PMM (usługa pmm-client).

pmm-admin add external --listen-port=8008 --service-name=patroni-szkolenie-pgX

Jako service name podajemy dowolną nazwę, która pozwoli nam na łatwą identyfikację monitorowanego klastra Patroni. Od tego momentu wartości dostępne w RestAPI dla zapytania /metics będą widoczne w PMM.

Aby od razu sobie te informacje zwizualizować, możemy dodać nowy pulpit zawierający widoki dla Patroni, klikając na ikonę "Dashboards", a następnie " + Import",

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa (8)

importując pulpit o numerze identyfikacyjnym 18870. Jest to szablon dostępny na oficjalnych stronach grafany przygotowany właśnie pod RestAPI Patroni

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa (9)

Podajemy nazwę dla importowanego pulpitu oraz wybieramy, gdzie ma zostać zapisany. Może być to dowolny katalog w PMM, najlepiej wybrać ten, który będzie dla nas najwygodniejszy w użyciu. W polu metrics wybieramy "Metrics", powinna być dostępna tylko jedna opcja, jeżeli konfiguracja PMM nie była wcześniej modyfikowana.

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa (10)

Mamy teraz dostęp do pulpitu obrazującego wszystkie wartości z dostępnej z Patroni /metrics, oprócz patroni_xlog_replayed_timestamp, patroni_cluster_unlocked oraz patroni_failsafe_mode_is_active.

Nowy pulpit znajdziemy, klikając na link "Insight / Home Dashboard":

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa (11)

Następnie nawigujemy do katalogu, w którym zapisaliśmy zaimportowany pulpit i klikamy na "PostgreSQL Patroni".

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa (12)

Monitoring PostgreSQL z Percona Monitoring and Management (PMM): ilustracja poglądowa (13)
Baner szkolenia Administracja, replikacja i tuning baz danych PostgreSQL w JSystems, terminy gwarantowane

Szkolenie Administracja, replikacja i tuning baz danych PostgreSQL →

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Czym jest Percona Monitoring and Management (PMM)?
PMM to narzędzie open source do monitoringu baz danych, między innymi PostgreSQL, MySQL i MongoDB. Oparte jest na Grafanie oraz innych składnikach i dzieli się na część serwerową (pmm-server) oraz klienta instalowanego na serwerze bazodanowym (pmm-client), który zbiera dane za pomocą lokalnych eksporterów.
Jak zainstalować serwer PMM?
Instalacja serwera sprowadza się do jednego polecenia uruchamianego jako root lub z uprawnieniami roota, pobierającego skrypt instalacyjny Percony. Skrypt sam wykrywa system operacyjny, instaluje Dockera, pobiera obraz i uruchamia PMM. Po instalacji logujesz się przez przeglądarkę na koncie admin i zmieniasz hasło.
Jak dodać instancję PostgreSQL do monitorowania w PMM?
Najpierw tworzysz w bazie użytkownika z nadaną rolą pg_monitor i dodajesz wpis dla niego w pliku pg_hba.conf, a następnie przeładowujesz konfigurację. Potem rejestrujesz klienta poleceniem pmm-admin add postgresql, co automatycznie rozpoczyna zbieranie danych o bazie i systemie operacyjnym.
Czym różni się integracja z pg_stat_statements od pg_stat_monitor?
Dodając PostgreSQL do monitoringu, PMM domyślnie włącza integrację z pg_stat_statements. Aby użyć pg_stat_monitor, dodajesz przełącznik query-source ustawiony na pgstatmonitor. To rozszerzenie daje dodatkowo histogramy, listę relacji użytych w zapytaniu oraz plany wykonania, jeśli są zbierane.
Do czego służy narzędzie Query Analytics w PMM?
Query Analytics daje przegląd zgromadzonych zapytań przechwyconych przez pg_stat_statements lub pg_stat_monitor, wraz z czasem wykonania, częstotliwością i liczbą wywołań. Warto co jakiś czas analizować najczęściej wykonywane zapytania oraz te o najdłuższym łącznym i pojedynczym czasie wykonania.

Komentarze (0)

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

Brak komentarzy...