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.