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*


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





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:



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:



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/


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


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


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.

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