Blog JSystems - uwalniamy wiedzę!

Szukaj
Jak przygotować serwery do replikacji fizycznej, strumieniowej, hot-standby?




Przygotowanie serwerów

Hosty do ćwiczeń

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.

Instalacja oprogramowania na Ubuntu 22.04

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.

Konfiguracja repozytorium
[oba hosty]

# 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
Instalacja binarek/pakietów

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
Konfiguracja PostgreSQL

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///*.conf, 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@-.service, 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.service



sudo 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/
[ tylko host 1]

# 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
[oba hosty]

# 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.

Część opcjonalna - autostart usługi - ewentualnie host 1

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=0



ExecStart=/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.

Instalacja oprogramowania na RedHat/CentOS 9

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.

Konfiguracja repozytorium

# 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
Instalacja repozytorium EPEL (Extra Packages for Enterprise Linux)

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
Instalacja binarek/pakietów

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
Konfiguracja PostgreSQL

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=0



ExecStart=/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)

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

Brak komentarzy...