
W przykładach korzystać będziemy z 5 linuxowych hostów. 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.
Trzy z pięciu serwerów posłużą do konfiguracji klastra PostgreSQL o wysokiej dostępności na podstawie Patroni i ETCD. Patroni to darmowe narzędzie open source do automagicznego zarządzania klastrem postgresa, a ETCD to magazynu klucz-wartość, który jest również wykorzystywany do osiągnięcia porozumienia, który z serwerów standby w Patroni jest najlepszym kandydatem na przejęcie roli lidera podczas awaryjnego przełączania. Również na nich stworzymy klastry na potrzebę przykładów z kopii zapasowych i replikacji.
Kolejny wykorzystamy jako serwer kopii zapasowych Barman i pgBackRest, a na ostatnim zainstalujemy PgBouncer oraz HAProxy, które będą działały jako pula połączeń (connection pooler) oraz load balancer.
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/
Instrukcje instalacji są wspólne dla przykładów z narzędzi do wykonywania kopii zapasowych, replikacji, konfiguracji Patroni i ETCD, konfiguracji pojedynczego punktu dostępu (pgbouncer) oraz monitoringu. Nie potrzebujemy wszystkich do każdego przykładu. Warto o tym pamiętać, jeżeli korzystamy z chmury i za każdy serwer musimy dodatkowo zapłacić, wtedy warto uruchomić tylko tyle serwerów, ile rzeczywiście potrzebujemy do wykonania danego przykładu.
[hosty 1-5: wszystkie]
Powinniśmy je 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
Instrukcje dla każdego z serwerów z osobna, z podziałem na przykłady, w których będą wykorzystywane.
[host 1] przeznaczony na Postgresa 15, Patroni oraz ETCD
Do wykonania przykładów z kopii zapasowych za pomocą Barmana zainstaluj:
sudo apt-get -y install postgresql-15 barman-cli
Do wykonania przykładów z kopii zapasowych za pomocą pgBackRest zainstaluj:
sudo apt-get -y install postgresql-15 pgbackrest
Do wykonania przykładów z replikacji, tutaj wystarczy jeden z pakietów, pgbackrest lub barman-cli w zależności które narzędzie do kopii zapasowych skonfigurujemy w celu stworzenia repliki z backupów:
sudo apt-get -y install postgresql-15 pgbackrest barman-cli
Do wykonania przykładów z autovacuuma i pg_repacka:
sudo apt-get -y install postgresql-15 postgresql-15-repack
Do przykładów z Patroni, skalowania, monitoringu:
sudo apt-get -y install postgresql-15 patroni etcd-server etcd-client pgbackrest
[hosty 2-3] - przeznaczony na Postgresa 15, Patroni oraz ETCD.
Do wykonania przykładów z replikacji, tutaj wystarczy jeden z pakietów, pgbackrest lub barman-cli, w zależności które narzędzie do kopii zapasowych skonigurujemy w celu stworzenia repliki z backupów:
sudo apt-get -y install postgresql-15 pgbackrest barman-cli
Do przykładów z Patroni, skalowania, monitoringu:
sudo apt-get -y install postgresql-15 patroni etcd-server etcd-client pgbackrest
[host 4] - serwer wykorzystywany jako pojedynczy punkt dostępu dla Postgresa zainstalowanego na serwerach 1-3. Instalujemy na nim pgbouncer, haproxy oraz pakietu postgresql-15 i postgresql-client-15, które zawierają pgbench i biblioteki wykorzystywane do zdalnego połączenia i benchmarkowania postgresa:
sudo apt-get -y install pgbouncer haproxy postgresql-15 postgresql-client-15
[host 5] - serwer, z którego będziemy wykonywać oraz przechowywać kopie zapasowe postgresa.
Do przykładów z Barmana i replikacji klastra korzystającego z barmana:
sudo apt-get -y install barman barman-cli
Do przykładów z pgbackresta, replikacji klastra korzystającego z pgbackresta oraz Patroni:
sudo apt-get -y install pgbackrest
[hosty 1-3]
Po instalacji pakietów Postgresa, na serwerach 1-3, Ubuntu automatycznie stworzy i wystartuje domyślny klaster.
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/<wersja_postgresa>/<nazwa_klastra>/*.conf
, a domyślny katalog PGDATA znajduje się w katalogu domowym postgresa: /var/lib/postgresql/<wersja_postgresa>/<nazwa_klastra>
, 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@<wersja_postgresa>-<nazwa_klastra>.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 trzech serwerów (serwery 1-3), na których 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 na serwerach 1-3:
sudo mkdir -m 700 /data_pg
sudo chown postgres: /data_pg/
[host 1]
# inicjalizacja, uruchomienie klastra i autostart usługi tylko na serwerze 1. Jeśli konfigurujesz hosty na potrzeby Patroni, pomiń ten krok.
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
[hosty 1-3]
# 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. Planując konfigurację Patroni w przyszłości, nie potrzebujemy również autostartu, ponieważ zajmuje się tym proces Patroni. Jeżeli jednak chcielibyśmy stworzyć klaster z automatycznym startem po uruchomieniu systemu, moglibyśmy użyć narzędzia dostępnego w Ubuntu "pg_createcluster" albo ręcznie stworzyć plik konfiguracyjny dla usługi w systemd i włączyć dla niego autostart.
Poniżej znajduje się opis konfiguracji autostartu usługi PostgreSQL w nowej lokalizacji (/data_pg). Na potrzeby Patroni nie konfigurujemy autostartu usługi, ponieważ Patroni będzie się tym zajmował za nas.
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.11. 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.
Instrukcje instalacji są wspólne dla przykładów z narzędzi do wykonywania kopii zapasowych, replikacji, konfiguracji Patroni i ETCD, konfiguracji pojedynczego punktu dostępu (pgbouncer) oraz monitoringu. Jednak nie do każdego ćwiczenia potrzebujemy wszystkie. Warto o tym pamiętać, jeżeli korzystamy z chmury i za każdy serwer musimy dodatkowo zapłacić. Wtedy warto uruchomić tylko tyle serwerów, ile rzeczywiście potrzebujemy do wykonania danego ćwiczenia.
# Konfiguracja 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 binarek/pakietów
Instrukcje dla każdego z serwerów z osobna, z podziałem na przykłady, w których będą wykorzystywane.
Serwer 1 przeznaczone na Postgresa 15, Patroni oraz ETCD
Do wykonania przykładów z kopii zapasowych za pomocą Barmana zainstaluj:
sudo dnf --enablerepo=pgdg-rhel9-extras install -y postgresql15-server barman-cli
Do wykonania przykładów z kopii zapasowych za pomocą pgBackRest zainstaluj:
sudo dnf --enablerepo=pgdg-rhel9-extras install -y postgresql15-server pgbackrest
Do wykonania przykładów z replikacji, tutaj wystarczy jeden z pakietów, pgbackrest lub barman-cli w zależności, które narzędzie do kopii zapasowych skonfigurujemy w celu stworzenia repliki z backupów:
sudo dnf --enablerepo=pgdg-rhel9-extras install -y postgresql15-server pgbackrest barman-cli
Do wykonania przykładów z autovacuuma i pg_repacka:
sudo dnf --enablerepo=pgdg-rhel9-extras install -y postgresql15-server postgresql15-contrib pg_repack_15
Do przykładów z Patroni, skalowania, monitoringu:
sudo dnf --enablerepo=pgdg-rhel9-extras install -y postgresql15-server postgresql15-contrib patroni patroni-etcd etcd pgbackrest
Serwer 2-3 - przeznaczony na Postgresa 15, Patroni oraz ETCD.
Do wykonania przykładów z replikacji, tutaj wystarczy jeden z pakietów, pgbackrest lub barman-cli w zależności, które narzędzie do kopii zapasowych skonigurujemy w celu stworzenia repliki z backupów:
sudo dnf --enablerepo=pgdg-rhel9-extras install -y postgresql15-server pgbackrest barman-cli
Do przykładów z Patroni, skalowania, monitoringu:
sudo dnf --enablerepo=pgdg-rhel9-extras install -y postgresql15-server postgresql15-contrib patroni patroni-etcd etcd pgbackrest
Serwer 4 - serwer wykorzystywany jako pojedynczy punkt dostępu dla Postgresa zainstalowanego na serwerach 1-3. Instalujemy na nim pgbouncer oraz haproxy:
sudo dnf install -y pgbouncer haproxy postgresql15
Serwer 5 - serwer, z którego będziemy wykonywać oraz przechowywać kopie zapasowe postgresa.
Do przykładów z Barmana i replikacji klastra korzystającego z barmana:
sudo dnf --enablerepo=pgdg-rhel9-extras install -y barman barman-cli
Do przykładów z pgbackresta, replikacji klastra korzystającego z pgbackresta oraz Patroni:
sudo dnf --enablerepo=pgdg-rhel9-extras install -y pgbackrest
Konfiguracja PostgreSQL
Serwery 1-3
Po instalacji pakietów Postgresa, na serwerach 1-3, 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. Planując w przyszłości konfigurację Patroni, nie potrzebujemy również autostartu, ponieważ zajmuje się tym proces Patroni. 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
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...