Kurulum Öncesi
Hostname | Ip Adres | Görevi |
---|---|---|
master_pg | 10.10.10.31 | postgresql |
replica_pg | 10.10.10.32 | postgresql |
Tüm sunucuların kendi aralarında parolasız erişimi için ssh-key tanımlaması yapılmalıdır.
sudo su
ile yetki alınır.
passwd
ile root kullanıcısına parola tanımlanır.
nano /etc/ssh/sshd_config
bu dosyada açık değilse aşağıdaki satırlar açılır;
Port 22
PermitRootLogin yes
PasswordAuthentication yes
Daha sonra ssh servisi yeniden başlatılır;
systemctl restart ssh
Ardından key tanımlaması yapılır;
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/edppVq4WCKrwiLURGr+yugRvuR8/VL1bWlnqkgSx70 root@petcd
The key's randomart image is:
+---[RSA 3072]----+
| |
| . |
| o |
| o . .o. |
|o.o .Soo.. . |
|.o.. .o o.* o.|
|.+... .....E* *o |
|B +ooo oo.+ *o. |
|oOo. .+o....+oo |
+----[SHA256]-----+
tanımlama sonrası oluşan ssh-key replica_pg sunucusuna kopyalanır;
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.10.32
root@10.10.10.31's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@10.10.10.31'"
and check to make sure that only the key(s) you wanted were added.
Not: Arzu edilirse daha sonra sshd_config dosyasında parola ile erişim(PasswordAuthentication no) kapatılır.
Yukarıdaki işlemler replica_pg de tekrarlan oluşturulan ssh-key master_pg sunucusuna kopyalanır.
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.10.31
PostgreSQL Kurulumu
Bu adımlar her iki sunucuda ayrı ayrı uygulanır;
apt install postgresql-12 postgresql-client-12 postgresql-contrib -y
Kurulum sonrası varsayılan olarak oluşan küme bilgileri aşağıdaki komut ile görüntülenir;
pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file
12 main 5432 online postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log
Ardından aktif tüm PostgreSQL servisleri durdurulur;
systemctl stop postgresql.service && systemctl stop postgresql@12-main.service
Varsayılan küme silinir;
pg_dropcluster 12 main
yeni bir dizine küme oluşturulur;
pg_createcluster 12 main -D /data/patroni
Bu ana kadar ki işlemler her iki sunucuda yapıldıktan sonra replica sunucusunda;
rm -rf /data/patroni/*
dizininin altı silinir.
Master sunucuda;
systemctl start postgresql@12-main
Ardından postgres kullanıcısına geçilir;
su - postgres
postgres@master_pg:~$ psql
postgres=# alter system set listen_addresses TO '*';
ALTER SYSTEM
postgres=# create role replicauser with password '1234' REPLICATION LOGIN;
CREATE ROLE
postgres=# alter user postgres with password '1234';
ALTER ROLE
postgres=# \q
postgres@master_pg:~$ exit
Postgre kullanıcıs ile ilgili işler tamamlandıktan sonra;
nano /etc/postgresql/12/main/pg_hba.conf
dosyası açılarak aşağıdaki bilgiler tanımlanır.
host replication replicauser 10.10.10.32/32 trust
Not: host satırına postgres kullanıcısı ile tanımlanan replicauser kullanıcısı ve replica_pg ip adresi girilmelidir.
Daha sonra servis yeniden başlatılır;
systemctl restart postgresql@12-main
Replika sunucuda postgre kullanıcısına geçilir;
su - postgres
Aşağıdaki komutta “–host” kısmına master_pg ip adresi girilir
pg_basebackup --host=10.10.10.31 --pgdata=/data/patroni/ --username=replicauser --verbose --progress --wal-method=stream --write-recovery-conf --checkpoint=fast --create-slot --slot=replica
Komutun çıktısı aşağıdaki şekilde olmalıdır;
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/2000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created replication slot "replica"
24554/24554 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/2000138
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: base backup completed
postgre kullanıcısından çıkış yapılır;
postgres@replica_pg: exit
PostgreSQL servisi başlatılır;
systemctl start postgresql@12-main
master_pg sunucuda replikasyonun düzgün çalıştığını kontrolü için;
su - postgres
psql
select * from pg_stat_replication;
komutu çalıştırılır;
pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state | reply_time
------+----------+-------------+------------------+--------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-----------+-----------+------------+---------------+------------+-------------------------------
5285 | 16384 | replicauser | 12/main | 10.10.10.32 | | 38876 | 2021-11-11 14:01:22.818062+00 | | streaming | 0/3000060 | 0/3000060 | 0/3000060 | 0/3000060 | | | | 0 | async | 2021-11-11 14:02:03.118212+00
(1 row)
Yukarıdaki bilgiler bize replikasyonun yapıldığını gösterir.