Postgresql Streaming Replication

Postgresql streaming replikasyon kurulumu ne kadar zorun görülse de 12 versiyonu ile  kurulum işlerimiz kolaylaşmıştır.

Streaming replikasyon , secodanry sunucuya log gönderme yöntemi ile replice edilebilen sistemdir. Default olarak async olarak kurulmaktadır kurulum yaparken bunu sync olarak değiştirebiliriz.

 

Bu kurulumda iki sunucu üzerinde de postgresql12 kurulu olduğunu varsayarak devam edeceğiz. Postgresql12 kurulumu ile ilgili Postgresq12 kurulumu isimli yazımdan faydalanabilirsiniz.

 

Aşağıdaki isim ve ip li sunuculara gerekli konfigürasyonu yapacağız.

Sunucu-Adı

İp

Port

Primary

Postgresql01

52.249.216.88

5432

Secondary

Postgresql02

40.76.114.239

5432

İlk olarak arşivlemeyi açıyoruz. (Bu kurulum için gerekli değildir fakat ilerde farklı sorunlara neden olmaması ve point-in time recovery için gerekli olduğundan yapmamız gerekiyor. Gerek yok diyorsanız bu adamı geçebilirsiniz .)

 

Primary sunucuda aşağıdaki postgresql.conf dosyasında aşağıdaki  gibi değişiklik yapıyoruz.

 

archive_mode = on            
archive_command = 'cp %p /var/lib/pgsql/12/backups/%f' 

 

 

archive_command için farklı bir lokasyon belirtmek istiyorsanız  belirteceğiniz dizine postgres kullanıcısının yetkisi olması gerekiyor.

Primary sunucu da pg_hba.conf dosyasını aşağıdaki gibi değiştiriyoruz.

DİKKAT!!!
Yukarıdaki konfigurasyonlar sadece test ortamı olduğu için yukarıdaki gibi yapılmıştır. Production sistemlerde sadece belirli kullanıcılara ,belirli iplere izin verilmeli ve şifreli (MD5) bağlantı sağlanması gerekmektedir.

Slot üzerinden haberleşme için aşağıdaki komut yardımı ile slotumuzu PRİMARY sunucuda oluşturuyoruz.

SELECT pg_create_physical_replication_slot('farukerdem');

PRIMARY sunucumuzda çalışan postgresql servisini aşağıdaki gibi  restart ediyoruz.

systemctl restart postgresql-12

Servisimiz ayağa kalktıktan sonra SECONDARY sunucuya gelerek aşağıdaki basebackup komutunu çalıştırıyoruz.


pg_basebackup --host=52.249.216.88 --port=5432 --username=postgres --pgdata=/var/lib/pgsql/12/data/ --write-recovery-conf --wal-method=stream --checkpoint=fast --progress --slot=farukerdem --verbose

Yukarıdaki basebackup komutunu açıklayalım.

–host= PRİMARY SUNUCU İP

–port= PRİMARY POSTGRESQL PORT

–username=replication için oluşturulan user (test için kurulduğu için postgres kullanıcısını kullandm)

–slot = PRİMARY sunucu üzerinde oluşturduğumuz slotun adı.

Basebackup ile ilgili daha detaylı bilgi için BASEBACKUP isimli yazıma göz atabilirsiniz.

 

pg_basebackup: error: directory “” exists but is not empty

SECONDARY sunucu da aşağıdaki parametreleri değiştiriyoruz.

 

synchronous_standby_names = '*'

primary_conninfo = 'user=postgres password=* host=52.2149.216.88 port=5432 sslmode=disable sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
                
primary_slot_name = 'farukerdem'

 

 

Yukarıdaki komutları açıklayalım.

 

synchronous_standby_names :  Bu parametre ile primary sunucuda transaction commit yapıldığında  secondary sunucuya yazılması içindir .

Örnek kullanımları aşağıdaki gibidir:

 

synchronous_standby_names = ‘*’   –bütün sunucular için

 

synchronous_standby_names = ‘(sunucu1,sunucu2,suncu3)’ –3 sunucu için belirtilme şekli

 

synchronous_standby_names = ‘3 (*)’  –bütün sunucular içerisinde üçünün de sekron olması için.

 

synchronous_standby_names = ‘any 2 (sunucu1,sunucu2,sunucu3)’ — üç sunucudan herhangi ikisinin sekron olması için

 

synchronous_standby_names = ‘first 2 (sunucu1,sunucu2,sunucu3,sunucu4)’  — Bu kullanım ise dört sunucu üzerinde ilk ikisinin sekron olması içindir.

 

primary_conninfo =

 

user =replikasyon kullanıcısı

password = replikasyon kullanıcısı şifresi (şifrenin gözükmesini istemezseniz pgpass kullanabilirsiniz.)

Host= PRİMARY İP

Port= PRİMARY POSTGRESQL PORT

 

 

primary_slot_name=  PRİMARY sunucuda oluşturduğumuz port

Yukarıdaki işlemleri hatasız şekilde yaptıktan sonra aşağıdaki gibi servisimizi başlatarak replikasyonumuzu başlatabiliriz.

 

systemctl start postgresql-12

 

PRIMARY sunucuya giderek  replikasyon oluşmuş mu aşağıdaki komut ile kontrol edelim.

 

select*from pg_stat_replication;

 

Yukarıda görüldüğü gibi streaming replikasyonumuz oluşmuştur.

 

Loading