
Bazı arıza ve felaket senaryoları için elimizin altında veritabanımızın bir replicasının bulunmasını isteriz, Bunu ne amaçla isteriz;
- Backup olarak
- Atomotik Fail-Over ve Switc Over (BFM, Patroni vb.)
- Read Only olan işler için replikanın kullanımı vb.
Bunlar için Replikalar oluşturuyoruz, peki bizim replikalarımızdaki ASYNC ve SYNC nedir? Defaultta ASYNC olarak kurulum olur. ASYNC durumda Master database gelen istekler işlenir, DML olayları gerçekleşir sonrasında Wall transferi ile bu işlemler replica (Slave) tarafa aktarılır, ve burada bu dosyalar işlenir, Master taraf Slave tarafı bu işlemler için beklemez herhangi bir DML in slave tarafta tamamlanması veya tamamlanmaması Master için önemli değildir, Slave in bu logları işleyip işlememesi herhangi bir işlemi geciktirmez. SYNC modda durum farklıdır, Herhangi bir DML işlemi gerçekleştiğinde bunun Slave de tamamlanmasını beklenir ve bu işlem ondan sonra Commit edilir ve master yoluna devam eder. Dolayısıyla bir veritabanının Replikasını SYNC olarak ayarlanacaksa burada Master Slave arasında bir gecikme olmamalıdır aksi takdirde ciddi performans problemleri yaşayabilirsiniz.


Biz replicamızı sync duruma almak istiyoruz bunun için ne yapmalıyız; Öncelikle durum nedir kontrol edelim;
postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 32973
usesysid | 16384
usename | bfmuser
application_name | bfmnd2.frkcvk.com
client_addr | 192.168.5.133
client_hostname |
client_port | 55768
backend_start | 2022-08-29 12:08:19.207327+03
backend_xmin |
state | streaming
sent_lsn | 0/27021E60
write_lsn | 0/27021E60
flush_lsn | 0/27021E60
replay_lsn | 0/27021E60
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async
reply_time | 2022-08-29 12:20:48.725358+03
Buradaki application_name kısmını alarak;
postgres=# alter system set synchronous_standby_names ='bfmnd2.frkcvk.com';
ERROR: invalid value for parameter "synchronous_standby_names": "bfmnd2.frkcvk.com"
DETAIL: syntax error at or near "."
application name deki noktalara PostgreSQL kızdı syntaxı çift tırnak içerisinde deneyelim; işe yaradığını göreceğiz.
postgres=# alter system set synchronous_standby_names ='"bfmnd2.frkcvk.com"';
ALTER SYSTEM
# select pg_reload_conf();
-[ RECORD 1 ]--+--
pg_reload_conf | t
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 32973
usesysid | 16384
usename | bfmuser
application_name | bfmnd2.frkcvk.com
client_addr | 192.168.5.133
client_hostname |
client_port | 55768
backend_start | 2022-08-29 12:08:19.207327+03
backend_xmin |
state | streaming
sent_lsn | 0/27021E60
write_lsn | 0/27021E60
flush_lsn | 0/27021E60
replay_lsn | 0/27021E60
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | sync
reply_time | 2022-08-29 13:07:03.914826+03
sync durumda çalıştığını gördük. Tekrar async yapmak için;
# alter system set synchronous_standby_names ='';
# select pg_reload_conf();
Bir yanıt yazın