DEV Community

Andrzej Klusiewicz
Andrzej Klusiewicz

Posted on

Profesjonalne wdrozenie klastra PostgreSQL na Ubuntu

Instalacja PostgreSQL z apt to dopiero poczatek - profesjonalne wdrozenie na Ubuntu wymaga tez przemyslanej struktury katalogow, uprawnien i parametrow startowych. Pokazujemy pelny proces.

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'
Enter fullscreen mode Exit fullscreen mode

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 -
Enter fullscreen mode Exit fullscreen mode

Aktualizacja listy dostępnych pakietów:

sudo apt-get update
Enter fullscreen mode Exit fullscreen mode

Instalacja dostępnych aktualizacji:

sudo apt-get upgrade -y
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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

systemctl status postgres*
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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

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

EOF
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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

systemctl status postgres*
Enter fullscreen mode Exit fullscreen mode

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/
Enter fullscreen mode Exit fullscreen mode

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/
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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/
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Możemy ponownie sprawdzić status usługi:

systemctl status postgresql-15.service
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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

Powiązane artykuły

Top comments (0)