W przykładach korzystać będziemy z 2 linuxowych hostów, z których jeden zawsze będzie pełnił rolę serwera głównego a drugi repliki. Każdy z nich powinien mieć przynajmniej 2CPU i 4GB RAM. Osobiście preferuję Ubuntu, ale przykłady możemy wykonać też na CentOS. W materiałach znajdziemy instrukcje do instalacji na obu dystrybucjach.
Domyślnie dostępne repozytoria są zazwyczaj bardzo przestarzałe, dlatego aby korzystać z najnowszych dostępnych wersji, musimy dodać oficjalne repozytoria PostgreSQL dla naszej dystrybucji, w przypadku ubuntu: https://www.postgresql.org/download/linux/ubuntu/
Poniższe kroki powinniśmy wykonać przed instalacją jakichkolwiek pakietów na każdym z serwerów.
# 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, ponieważ niektóre paczki, szczególnie te aktualizujące jądro linuxa, nie będą "aktywne" do następnego startu serwera:
sudo reboot
Do wykonania przykładów i ćwiczeń z replikacji strumieniowej zainstaluj postgresa w wersji 15, ale na wyższych wszystko również powinno działać w ten sam sposób:
sudo apt-get -y install postgresql-15
Po instalacji pakietów Postgresa Ubuntu automatycznie stworzy i wystartuje domyślny klaster na obu serwerach.
systemctl status postgres*
Pliki konfiguracyjne dla Postgresa na systemach Debian/Ubuntu, stworzone automatycznie po instalacji lub za pomocą PostgreSQL database-cluster manager, znajdują się w innej lokalizacji niż domyślnie, dla klastrów zainicjalizowanych poprzez initdb.
Postgres zainicjalizowany klasycznie przechowuje pliki konfiguracyjne w katalogu głównym Postgresa, tzn. katalogu, do którego został wykonany initdb, określonego przez parametr -D lub zmienną systemową PGDATA, lub w katalogu określanym przez parametr Postgresa data_directory.
Na systemach z rodziny Debian, jeżeli korzystamy z narzędzi dedykowanych dla Debiana/Ubuntu, PostgreSQL database-cluster manager, przykładowo pg_createcluster, pg_lsclusters, pg_ctlcluster, etc., pliki konfiguracyjne znajdują się w katalogu systemowym /etc./etc/postgresql/
, a domyślny katalog PGDATA znajduje się w katalogu domowym postgresa:/var/lib/postgresql/
, przykładowo /var/lib/postgresql/15/main
. Każdy klaster postgresa stworzony za pomocą pg_createcluster ma również swoją usługę w systemd, korzystają one ze wspólnej konfiguracji postgresql@.service, a ich usługi nazwane są postgresql@
, przykładowo postgresql@15-main.service
.
Dla uzyskania doświadczenia jak najbardziej zbliżonego dla różnych systemów operacyjnych stworzymy nowy klaster za pomocą klasycznej inicjalizacji przez initdb, a ten stworzony automatycznie zatrzymamy. Poniższe instrukcje powtarzamy dla obu serwerów, na których wcześniej zainstalowaliśmy postgresa.
# sprawdzenie uruchomionych usług postgresa i działających procesów postgresa:
systemctl status postgres*
ps -ef | grep postgres
# zatrzymanie usług oraz wyłączenie automatycznego startu:
sudo systemctl stop postgresql@15-main.service
sudo systemctl disable postgresql@15-main.servicesudo systemctl stop postgresql.service
sudo systemctl disable postgresql.service
# Upewniamy się, że procesy PostgreSQL już nie działają. Lista powinna być pusta po wykonaniu tego polecenia:
systemctl status postgres*
ps -ef | grep postgres
Drugie polecenie "ps -ef" za każdym razem zwróci jedną linię z istniejącym procesem, ponieważ zawsze zwraca również samo siebie. Istotne jest, żeby nie działał żaden proces z nazwą w stylu "/usr/lib/postgresql/15/bin/postgres" czy "/usr/lib/postgresql/15/bin/postmaster", który jest głównym procesem postgresa.
# utworzenie katalogu PGDATA na serwerach:
sudo mkdir -m 700 /data_pg
sudo chown postgres: /data_pg/
# inicjalizacja, uruchomienie klastra i autostart usługi tylko na serwerze 1.
sudo -i -u postgres /usr/lib/postgresql/15/bin/initdb -D /data_pg/
sudo -i -u postgres /usr/lib/postgresql/15/bin/pg_ctl -D /data_pg start
# aktualizacja zmiennej systemowej PATH dla użytkownika postgres (użytkownik systemowy postgres jest tworzony automagicznie w trakcie instalacji binarek serwera PostgreSQL) w celu dodania wszystkich binarek PostgreSQL do PATH. Dzięki temu nie będziemy musieli podawać pełnych ścieżek do narzędzi PostgreSQL.
Poniższe kroki wykonujemy jako użytkownik postgres.
Możemy przejść do użytkownika postgres w ten sposób:
sudo su - postgres
Załadują nam się też zmienne środowiskowe użytkownika postgres. Następnie jako użytkownik postgres wykonujemy poniższy kod, wklejamy go w całości do konsoli:
cat << EOF >> ~/.bash_profile
PATH=$PATH:/usr/lib/postgresql/15/bin
export PATH
EOF
Uwaga! Zmiana ta wymaga przelogowania użytkownika postgres lub ręczne załadowanie zmiennych za pomocą:
. ~/.bash_profile
Na potrzeby przykładu stworzymy nowy klaster za pomocą initdb, dlatego nie będzie on posiadał swojej usługi systemd, przez co nie będzie mógł mieć włączonego autostartu. Jeżeli jednak chcielibyśmy stworzyć klaster z automatycznym startem po uruchomieniu systemu, możemy ręcznie stworzyć plik konfiguracyjny dla usługi w systemd i włączyć dla niej autostart. Albo stworzyć klaster za pomocą narzędzi postgresql-common, pg_createcluster, wtedy jednak musimy pamiętać o ręcznym kopiowaniu plików konfiguracyjnych podczas wykonywania kopii zapasowych, dlatego, że wszystkie konfigi znajdują się poza katalogiem PGDATA.
Poniżej znajduje się opis konfiguracji autostartu usługi PostgreSQL w nowej lokalizacji (/data_pg).
Część opcjonalna, nie jest wymagana podczas wykonywania przykładów, ale warto wiedzieć, jak to zrobić i robić to na swoich systemach produkcyjnych.
Przykładowo (poniższe wykonujemy jako użytkownik systemowy z prawami do sudo, nie jako użytkownik postgres):
vagrant@ubuntu:~$ sudo nano /lib/systemd/system/postgresql-15.service
Do otwartego pliku wklejamy:
[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/#Wylaczenie OOM (Out Of Memory) killera dla postgresa:
OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0ExecStart=/usr/lib/postgresql/15/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT# wylaczony timeout, zeby postgres mogl w spokoju wykonac crash recovery podczas startu
# inaczej linux moglby probowac restartowac usluge jezeli nie wystartowala w X sekund
TimeoutSec=0
TimeoutStartSec=0
TimeoutStopSec=1h[Install]
WantedBy=multi-user.target
Następnie wykonujemy:
vagrant@ubuntu:~$ systemctl status postgresql-15.service
○ postgresql-15.service - PostgreSQL 15 database server
Loaded: loaded (/lib/systemd/system/postgresql-15.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://www.postgresql.org/docs/15/static/
Włączamy autostart:
vagrant@ubuntu:~$ sudo systemctl enable postgresql-15.service
Jeżeli wcześniej uruchomiliśmy postgresa za pomocą pg_ctl, próba sprawdzenia stanu usługi systemd dla postgresa, za pomocą systemctl status postgresql-15.service, zwróci informację, że postgres nie jest uruchomiony. Jak na powyższym przykładzie: "Active: inactive (dead)".
Aby zacząć korzystać z usługi, musimy zatrzymać postgresa uruchomionego za pomocą pg_ctl, a następnie uruchomić usługę.
Sprawdzenie, czy jakiś postgres działa:
vagrant@ubuntu:~$ ps -ef | grep postgres
Jeżeli działa, zatrzymujemy go za pomocą:
vagrant@ubuntu:~$ sudo -i -u postgres /usr/lib/postgresql/15/bin/pg_ctl -D /data_pg stop
Uruchamiamy usługę:
vagrant@ubuntu:~$ sudo systemctl start postgresql-15.service
Weryfikacja, czy usługa działa i czy autostart jest włączony, pogrubiony enabled:
vagrant@ubuntu:~$ systemctl status postgresql-15.service● postgresql-15.service - PostgreSQL 15 database server
Loaded: loaded (/lib/systemd/system/postgresql-15.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-08-02 19:20:05 UTC; 2s ago
Docs: https://www.postgresql.org/docs/15/static/
Main PID: 1755 (postmaster)
Tasks: 6 (limit: 19037)
Memory: 19.3M
CGroup: /system.slice/postgresql-15.service
├─1755 /usr/lib/postgresql/15/bin/postmaster -D /data_pg/
Od teraz uruchamiając, zatrzymując czy restartując klaster, nie powinniśmy używać pg_ctl, a właśnie skonfigurowaną usługę systemd.
Postgres dostępny w oficjalnym repozytorium RedHat9 / CentOS9 to wersja 13.X. Co nie jest może najstarszą wspieraną wersją, do tego w najnowszej minor wersji zawierającej wszystkie dostępne łatki i aktualizacje, ale jest 2 główne wydania do tyłu. Aby zainstalować najnowszą wersję postgresa, 15, musimy zainstalować oficjalne repozytoria yum PGDG.
Poniższe kroki powinniśmy wykonać przed instalacją jakichkolwiek pakietów na każdym z serwerów.
# Instalacja repozytorium z pliku RPM:
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Wyłączenie domyślnie dostępnego pakietu postgresa;
sudo dnf -qy module disable postgresql
# Instalacja dostępnych aktualizacji:
sudo yum upgrade -y
# Restart serwera po aktualizacji, ponieważ niektóre paczki, szczególnie te aktualizujące jądro linuxa, nie będą "aktywne" do następnego startu serwera:
sudo reboot
Na niektórych systemach repozytorium EPEL dostępne jest domyślnie, jeśli jednak dnf install zwróci nam błąd o brakujących pakietach, powinniśmy je dodać.
# Włączenie Code Ready Builder, który wymagany jest przez wiele pakietów w EPEL
sudo dnf config-manager --set-enabled crb
# Konfiguracja repozytoriów EPEL
sudo dnf -y install \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm \
https://dl.fedoraproject.org/pub/epel/epel-next-release-latest-9.noarch.rpm
Do wykonania przykładów i ćwiczeń z replikacji strumieniowej zainstaluj postgresa w wersji 15, ale na wyższych wszystko również powinno działać w ten sam sposób:
sudo dnf --enablerepo=pgdg-rhel9-extras install -y postgresql15-server
Oba serwery
Po instalacji pakietów Postgresa, na obu serwerach, należy stworzyć strukturę katalogów.
# utworzenie katalogu
# w odróżnieniu od Ubuntu, tutaj nie będzie domyślnie wystartowanej instancji:
sudo mkdir -m 700 /data_pg
sudo chown postgres: /data_pg/
# inicjalizacja i start nowego klastra, tylko na serwerze 1:
sudo su - postgres
/usr/pgsql-15/bin/initdb -D /data_pg/
/usr/pgsql-15/bin/pg_ctl -D /data_pg start
# aktualizacja zmiennej systemowej PATH dla użytkownika postgres, jako użytkownik postgres w
# celu dodania wszystkich binarek PostgreSQL do PATH. Dzięki temu nie będziemy musieli
# podawać pełnych ścieżek do narzędzi PostgreSQL.
cat << EOF >> ~/.bash_profile
PATH=$PATH:/usr/pgsql-15/bin
export PATH
EOF
Uwaga! Zmiana ta wymaga przelogowania użytkownika postgres lub ręczne załadowanie zmiennych za pomocą:
. ~/.bash_profile
Stworzony na potrzeby szkolenia klaster nie będzie posiadał swojej usługi systemd, dlatego nie będzie mógł mieć włączonego autostartu. Jeżeli jednak chcielibyśmy stworzyć klaster z automatycznym startem po uruchomieniu systemu, moglibyśmy ręcznie stworzyć plik konfiguracyjny dla usługi w systemd i włączyć dla niego autostart.
Przykładowo:
[vagrant@centos ~]$ sudo vi /lib/systemd/system/postgresql-15.service
Do otwartego pliku wklejamy:
[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/# wylaczenie OOM (Out Of Memory) killera dla postgresa
OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0ExecStart=/usr/pgsql-15/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT# wylaczony timeout, zeby postgres mogl w spokoju wykonac crash recovery podczas startu
# inaczej linux moglby probowac restartowac usluge jezeli nie wystartowala w X sekund
TimeoutSec=0
TimeoutStartSec=0
TimeoutStopSec=1h[Install]
WantedBy=multi-user.target
Jeżeli plik już istniał, zamiast edytować ten plik, powinniśmy użyć polecenia
[vagrant@centos ~]$ sudo systemctl edit postgresql-15.service
I do otwartego w ten sposób pliku dodać wartości które chcemy zmienić, pomiędzy oznaczone komentarzem linie. Np.
### Editing /etc/systemd/system/postgresql-15.service.d/override.conf
### Anything between here and the comment below will become the new contents of the file[Service]
Environment=PGDATA=/data_pg/### Lines below this comment will be discarded
W ten sposób zmiany te przetrwają aktualizacje Postgresa do wyższej minor wersji, np. Z 15.4 na 15.5.
Sprawdzamy status usługi oraz poprawność pliku konfiguracyjnego (jeżeli polecenie zwraca wynik podobny do poniższego,oznacza, że jest poprawny):
[vagrant@centos ~]$ sudo systemctl status postgresql-15.service
○ postgresql-15.service - PostgreSQL 15 database server
Loaded: loaded (/lib/systemd/system/postgresql-15.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://www.postgresql.org/docs/15/static/
Włączamy autostart:
[vagrant@centos ~]$ sudo systemctl enable postgresql-15.service
Jeżeli wcześniej uruchomiliśmy postgresa za pomocą pg_ctl, próba sprawdzenia stanu usługi systemd dla postgresa, za pomocą systemctl status postgresql-15.service, zwróci informację, że postgres nie jest uruchomiony. Jak na powyższym przykładzie: "Active: inactive (dead)".
Aby zacząć korzystać z usługi, musimy zatrzymać postgresa uruchomionego za pomocą pg_ct, a następnie uruchomić usługę.
Sprawdzenie, czy jakiś postgres działa:
[vagrant@centos ~]$ ps -ef | grep postgres
Jeżeli działa, zatrzymujemy go za pomocą:
[vagrant@centos ~]$ sudo -i -u postgres /usr/pgsql-15/bin/pg_ctl -D /data_pg stop
Uruchomienie usługi:
[vagrant@centos ~]$ sudo systemctl start postgresql-15.service
Weryfikacja, czy usługa działa i czy autostart jest włączony, pogrubiony enabled:
[vagrant@centos ~]$ sudo systemctl status postgresql-15.service● postgresql-15.service - PostgreSQL 15 database server
Loaded: loaded (/lib/systemd/system/postgresql-15.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-08-02 19:47:23 UTC; 8s ago
Docs: https://www.postgresql.org/docs/15/static/
Main PID: 4587 (postmaster)
Tasks: 6 (limit: 19037)
Memory: 19.3M
CGroup: /system.slice/postgresql-15.service
4587 /usr/pgsql-15/bin/postmaster -D /data_pg/
Od teraz uruchamiając, zatrzymując czy restartując klaster, nie powinniśmy używać pg_ctl, a właśnie skonfigurowanej usługi systemd.
Komentarze (0)
Brak komentarzy...