Blog JSystems - uwalniamy wiedzę!

Szukaj
Jak poprawnie wdrożyć klaster PostgreSQL na Ubuntu? Jak sprawić by uruchamiał się automatycznie z systemem? Jak określić położenie PGDATA? Na te i inne pytania znajdziesz odpowiedzi w tym artykule :)

Z tego artykułu dowiesz się:
  • jak zainstalować binaria wybranej wersji (a nie - domyślnej dla systemu) na serwerach z systemem Ubuntu,
  • gdzie co leży,
  • jak dodać binaria PostgreSQL do PATHa,
  • jak samemu zdefiniować położenie klastra,
  • jak skonfigurować by PostgreSQL działał jako usługa (dzięki czemu wygodniej się nim zarządza),
  • jak skonfigurować automatyczny start PostgreSQL z systemem,
  • jak skonfigurować system Ubuntu w taki sposób, by nie restartował PostgreSQL w przypadku gdy zacznie kończyć się pamięć RAM,
  • jak skonfigurować system Ubuntu w taki sposób, by nie wpadał w nieskończony cykl odtwarzania.

Pierwszy krok to stworzenie pliku konfiguracji dla repozytorium jako użytkownik z uprawnieniami sudo albo root. W drugim przypadku pomijamy sudo na początku poleceń z instrukcji:

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

Pobranie i import klucza dla oficjalnego repozytorium Ubuntu do listy zaufanych kluczy w apt:

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

Aktualizacja listy dostępnych pakietów:

sudo apt-get update

Instalacja dostępnych aktualizacji:

sudo apt-get upgrade -y

Restart serwera po aktualizacji niektóre paczki, szczególnie te aktualizujące jądro linuxa, nie będą “aktywne” do następnego startu serwera:

sudo reboot 

Przystępujemy do instalacji binariów PostgreSQL. Łączymy się do serwera ponownie (na pewno nas rozłączyło przy restarcie) i wykonujemy:

sudo apt-get -y install postgresql-15

Po instalacji pakietów PostgreSQL - Ubuntu automatycznie stworzy i wystartuje domyślny klaster. Sprawdzamy, czy działa:

systemctl status postgres*
Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu: ilustracja poglądowa

Domyślnie PostgreSQL w Ubuntu będzie miał pliki rozmieszczone w takich lokalizacjach:

Katalog z binariami: /usr/lib/postgresql/15/bin/
Katalog domowy postgresa: /var/lib/postgresql


Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu: ilustracja poglądowa (2)

Część plików konfiguracyjnych znajduje się w /etc/postgresql/15/main. W tym dwa bardzo ważne i często aktualizowane: „postgresql.conf”i „pg_hba.conf”. Zajmiemy się nimi nieco później:

Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu: ilustracja poglądowa (3)

Dosyć często będziemy działać z poziomu użytkownika systemowego postgres (zostaje on utworzony w chwili instalacji PostgreSQL), dlatego warto, by miał - w swoim PATH binarki PostgreSQL. Dzięki temu nie będziemy musieli wskazywać pełnych ścieżek do binarek, które chcemy - użyć. W tym celu logujemy się na postgresa:

sudo su - postgres

Następnie już jako użytkownik systemowy postgres wykonujemy:

cat << EOF >> ~/.bash_profile
PATH=$PATH:/usr/lib/postgresql/15/bin
export PATH

EOF

Zmiana ta nie będzie widoczna od razu. Istnieją dwie możliwości. Możemy - się wylogować i zalogować na użytkownika postgres ponownie lub wykonać skrypt, który przeładuje nam zmienne środowiskowe. Aby przeładować zmienne środowiskowe, - jako użytkownik postgres musimy wykonać:

. ~/.bash_profile

Po tej operacji nasza zmienna środowiskowa PATH powinna zostać uzupełniona o katalog z binarkami PostgreSQL:

Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu: ilustracja poglądowa (4)

PGDATA w wybranej lokalizacji + autostart usługi

Nie zawsze chcemy pozostawić domyślną konfigurację. Przyjmijmy, że planujemy mieć wszystkie pliki danych i konfiguracyjne PostgreSQL w innej lokalizacji, np. na innym dysku. Miejsce, w którym składowane są dane i configi, nazywamy w PostgreSQL PGDATA. Do tego usługa powinna startować automatycznie, korzystając z nowej lokalizacji plików. W tym celu musimy wykonać kilka czynności.

Jeśli planujemy zarządzanie instancjami PostgreSQL za pomocą klastra wysokiej dostępności Patroni, to nie konfigurujemy usługi serwera PostgreSQL (poniżej), ponieważ Patroni sam zajmie się uruchamianiem i wyłączaniem usług PostgreSQL.

Przede wszystkim trzeba zatrzymać aktualnie działającą usługę i wyłączyć jej automatyczne włączanie:

sudo systemctl stop postgresql@15-main.service
sudo systemctl disable postgresql@15-main.service

sudo systemctl stop postgresql.service
sudo systemctl disable postgresql.service

Sprawdzamy, czy usługa na pewno jest wyłączona:

systemctl status postgres*

Jeśli ta lista jest pusta, możemy przystąpić do kolejnej czynności, to jest do utworzenia katalogu na nową PGDATA w wybranym miejscu i spowodowanie, by jej właścicielem był użytkownik systemowy postgres (jest tworzony automatycznie przy instalacji PostgreSQL).

sudo mkdir -m 700 /data_pg
sudo chown postgres: /data_pg/

Teraz należy zainicjalizować klaster, tj. za pomocą postgresowego narzędzia initdb utworzyć niezbędne struktury i pliki. Następnie przechodzimy na użytkownika systemowego postgres i inicjalizujemy klaster:

sudo su - postgres
initdb -D /data_pg/
PGDATA w wybranej lokalizacji + autostart usługi: Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu

Jeśli otrzymamy komunikat : “command initdb not found”, - to znaczy, że nie dodaliśmy binarek PostgreSQL do zmiennej PATH lub nie przeładowaliśmy zmiennych środowiskowych użytkownika systemowego postgres. Możemy wrócić do tego punktu i go wykonać albo podawać ścieżkę bezwzględną do konkretnej binarki, np:
/usr/lib/postgresql/15/bin/initdb
Włączamy klaster, by sprawdzić, czy działa:

pg_ctl -D /data_pg/ start
PGDATA w wybranej lokalizacji + autostart usługi: Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu (2)

Jeśli widzimy takie informacje również u siebie (chodzi o końcowe “server started”), to znaczy, że nowy klaster działa.

Zatrzymamy teraz klaster, ponieważ za chwilę skonfigurujemy go jako usługę i uruchomimy.

pg_ctl -D /data_pg/ stop

Zadbamy też o to, by usługa PostgreSQL automatycznie się uruchamiała. Inaczej musielibyśmy startować klaster za pomocą “pg_ctl” przy każdym restarcie maszyny.

Przechodzimy teraz do użytkownika systemowego z prawami do sudo i wykonujemy:

sudo nano /lib/systemd/system/postgresql-15.service

Powstanie nowy plik. Wklejamy do niego:

[Unit]
Description=PostgreSQL 15 database server
Documentation=https://www.postgresql.org/docs/15/static/
After=syslog.target
After=network-online.target

[Service]
Type=notify
User=postgres
Group=postgres
Environment=PGDATA=/data_pg/

#Wyłączenie OOM (Out Of Memory) killera dla postgresa:

OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0

ExecStart=/usr/lib/postgresql/15/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT

# wyłączony timeout, żeby postgres mógł w spokoju wykonać crash recovery podczas startu
# inaczej linux mógłby spróbować restartować usługę jeżeli nie wystartowała w X sekund
TimeoutSec=0
TimeoutStartSec=0
TimeoutStopSec=1h

[Install]
WantedBy=multi-user.target

Należy dostosować ten element pliku do swojej ścieżki do PGDATA (jeśli jest inna niż tworzona w tej instrukcji):

Environment=PGDATA=/data_pg/

Zapisujemy plik, włączamy autostart i uruchamiamy usługę:

#włączenie autostartu:

sudo systemctl enable postgresql-15.service

#uruchomienie usługi:

sudo systemctl start postgresql-15.service

Możemy ponownie sprawdzić status usługi:

systemctl status postgresql-15.service
PGDATA w wybranej lokalizacji + autostart usługi: Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu (3)

Wykonujemy - restart serwera i sprawdzamy ponownie, czy usługa wstała:

sudo reboot
sudo systemctl status postgresql-15.service

Jeżeli konfigurujemy PostgreSQL jako usługę, to należy startować i zatrzymać klaster już z poziomu systemctl, a nie pg_ctl dlatego, że proces uruchomiony przez pg_ctl i usługa nie wiedzą o sobie wzajemnie.

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

Jak zainstalować konkretną wersję PostgreSQL na Ubuntu zamiast domyślnej systemowej?
Trzeba dodać oficjalne repozytorium PostgreSQL (plik pgdg.list w katalogu sources), zaimportować klucz podpisujący, zaktualizować listę pakietów i dopiero wtedy zainstalować wybraną wersję poleceniem apt-get install postgresql-15. Dzięki repozytorium PostgreSQL dostajemy wersję, którą sami wskażemy, a nie tę, którą akurat oferuje dystrybucja.
Czym jest PGDATA i jak umieścić dane klastra w innej lokalizacji?
PGDATA to katalog, w którym PostgreSQL trzyma pliki danych i konfiguracyjne. Aby przenieść go w inne miejsce (np. na osobny dysk), zatrzymujemy domyślną usługę, tworzymy nowy katalog z właścicielem postgres, inicjalizujemy klaster narzędziem initdb z opcją -D i wskazujemy nową ścieżkę w pliku usługi systemd.
Dlaczego initdb zwraca komunikat command not found?
Oznacza to, że binaria PostgreSQL nie zostały dodane do zmiennej PATH użytkownika systemowego postgres albo nie przeładowaliśmy zmiennych środowiskowych. Można albo poprawić PATH i przeładować go poleceniem kropka spacja ~/.bash_profile, albo podawać pełną ścieżkę bezwzględną do binarki, na przykład /usr/lib/postgresql/15/bin/initdb.
Jak skonfigurować, by PostgreSQL nie był ubijany przez mechanizm OOM ani restartowany w pętli odtwarzania?
W pliku usługi systemd ustawiamy OOMScoreAdjust na -1000 oraz zmienne środowiskowe związane z oom_score_adj, co chroni proces przed mechanizmem Out Of Memory. Aby uniknąć nieskończonego cyklu odtwarzania, wyłączamy limity czasu (TimeoutSec, TimeoutStartSec, TimeoutStopSec), dzięki czemu system nie próbuje restartować usługi w trakcie odzyskiwania po awarii.
Czy trzeba konfigurować usługę PostgreSQL, jeśli używamy klastra wysokiej dostępności Patroni?
Nie. Jeśli planujemy zarządzać instancjami przez Patroni, nie konfigurujemy własnej usługi serwera PostgreSQL, ponieważ to Patroni sam zajmuje się uruchamianiem i wyłączaniem usług PostgreSQL. Ręczna konfiguracja usługi systemd dotyczy sytuacji, gdy zarządzamy klastrem samodzielnie.

Komentarze (7)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google
adam.jurkiewicz.pythonista 09-10-2024 19:44:13

Ja robię kawałek dokumentacji - bo w Debianie jest trochę inaczej: https: ** blog.jurkiewicz.tech * kurs-administracji-postgresql-zapiski-9239f6838bb4 Jakby ktoś potrzebował. Znaczki * zmień na wiadomo co, bo blog nie pozwolił mi wkleić wprost.

jezierski.tomasz 09-10-2024 04:29:16

Jakie jest hasło usera postgres?

admin 09-10-2024 04:29:16

Użytkownik postgres nie ma żadnego hasła. Aby się na niego zalogować, zaloguj się najpierw na użytkownika z uprawnieniami do sudo i wywołaj sudo su - postgres

Zaloguj się przez konto Google, aby ocenić komentarz
edwardtus 07-10-2024 09:54:13

Uwaga: Brak info, że aby zatrzymać usługi PostgreSQL należy przejść na konto użytkownika systemowego utworzonego przy instalacji systemu. Inaczej nie zatrzymamy-usuniemy usług. Po ustawieniu zmiennej PATH.

daniel.podlejski 01-10-2024 19:35:22

Polecam jednak doczytać o koncepcji pakietów z Postgresem dla Debiana i potomnych z ich dokumentacji, z pakietu postgresql-common. Podejście z tego artykułu zadziała, ale nie jest koszerne. Martin Pitt zrobił przez ostatnie 20 lat kawał dobrej roboty przy paczkowaniu Postgresa i warto z tego korzystać.

krzysztof.tys 01-10-2024 19:35:22

Ciekawa uwaga. Możesz zapodać jakimś linkiem do docu lub artykułu który o tym szerzej mówi?

Zaloguj się przez konto Google, aby ocenić komentarz
daniel.podlejski 01-10-2024 19:35:22

Niestety nie, tutejszy system komentarzy blokuje linki. Ale readme w repo postgres-comon na salsa.debian.org to dobry wstęp do tematu.

Zaloguj się przez konto Google, aby ocenić komentarz