REPLICATON

Replication Nedir?


Bu videomda replication kavramını, türlerini ve replication işlemi yaparken kullandığımız wal kavramını ve pg_basebackup araçlarından kısaca bahsedip kurulum için ön bilgiler verdim.

Replication Nedir?

Bir veritabanında gerçekleşen değişikliklerin (yeni veri ekleme, güncelleme, silme gibi) başka bir sunucuya aktarılması işlemidir. Böylece birden fazla kopya tutularak, verinin kaybolması engellenir ve okuma performansı artırılır.
Türleri;
1- Streaming Replication
2- Logical Replication

pg_basebackup Nedir?

pg_basebackup, PostgreSQL'in yerleşik (built-in) bir aracıdır ve şunlar için kullanılır:
1- Ana sunucunun tam bir fiziksel yedeğini almak.
2- Bir streaming replication yapılandırması için standby sunucuya başlangıç verisi sağlamak.
3- WAL (Write Ahead Log) ile tutarlı yedekler oluşturmak.

Temel Kullanım Şekli:

Kopyala
pg_basebackup -h <primary_ip> -D <hedef_klasör> -U <replication_kullanıcısı> -P -v --wal-method=stream

Write Ahead Log


WAL Nedir?

WAL, bir veritabanında yapılan tüm değişikliklerin sıralı bir kaydıdır . Bir işlem PostgreSQL'deki verileri değiştirdiğinde, değişiklikler gerçek tabloya uygulanmadan önce ilk olarak WAL dosyasına yazılır. Bu işlem "write-ahead logging" olarak bilinir.
Beklenmedik bir kapanma durumunda sistemi kurtarmak için kullanılır.
- Transaction kayıtları kontrol edilir.
- Tablonun başındaki LSN number kontrol edilir.
- Eğer transaction kayıtlarındaki LSN number daha büyükse otomatik olarak recovery işlemi başlatılır.
Recovery = wal dosyalarından transaction bilgisinin okunup tekrar tabloların üzerinde ilgili transactionların işletilmesi olayıdır.

Nerelerde Kullanılır?

Replication


Transaction logging:Veritabanı sistemlerinde işlemlerin (transactions) kaydını tutmak için kullanılan bir tekniktir. Temel amacı veri bütünlüğünü ve sistemin hata durumlarında geri yüklenebilirliğini sağlamaktır.

PITR:Veritabanını geçmişte belirli bir ana geri döndürür.

Wal dosyalarının içeriği

Kopyala
#Wal dosyalarını gösterme
cd /var/lib/postgresql/17/main/pg_wal/

#Mevcut wal dosyasını bulma
SELECT * FROM pg_walfile_name(pg_current_wal_lsn());

#Wal dosyalarınıniçine bakma
pg_waldump -f /var/lib/postgresql/17/main/pg_wal/000000010000000000000030

Streaming Replication


Streaming Replication Nedir?

PostgreSQL veritabanının fiziksel kopyasının (data files, WAL dosyaları) başka bir sunucuya anlık olarak aktarılmasıdır.
Çalışma şekli:Primary sunucudaki WAL (Write Ahead Log) dosyaları replica (standby) sunucuya gönderilir ve replica bu logları uygulayarak primary’nin tam bir kopyası haline gelir.
Replica tipi: Salt okunur (read-only). Primary sunucuda yazma işlemi yapılır, replica sadece okuma için kullanılır.
Veri seviyesi: Fiziksel düzeyde, tüm veritabanı kopyalanır.
Senkronizasyon:
Senkron: Primary, replica onaylayana kadar işlem tamamlanmaz, veri kaybı olmaz.
Asenkron: Primary işlem yapar, replica biraz gecikmeli güncellenir, küçük veri kayıpları olabilir.

Genel Mimarisi

Kurulumu

Master Sunucu Ayarları

Kopyala
#postgresql.conf dosyasında aşağıdaki değişiklikler yapılır.
sudo nano /etc/postgresql/17/main/postgresql.conf

listen_address= '*'
archive_mode = on
archive_command = 'cp %p /pgdata/17/backups/archive/%f' 
wal_level = replica
max_wal_senders= 3
max_replication_slots = 4

#Arşiv deposu oluşturulur gerekli izinler verilir.
mkdir -p /pgdata/17/backups/archive
chmod 750 /pgdata/17/backups/archive
chown postgres:postgres /pgdata/17/backups/archive

#postgresql.conf dosyasında yaptığımız değişikliklerin geçerli olması için PostgreSQL servisi restart edilir.
sudo systemctl restart postgresql

#Standby sunucunun master sunucu üzerinde bağlanacağı replikasyon kullanıcısı oluşturulur.
CREATE ROLE replication11 WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'pass';

#Replication kullanıcısının standby sunucuya erişimi için ve sunucunun dışarıdan gelen tüm bağlantıları dinlemesi için pg_hba.conf dosyasında aşağıdaki düzenlemeler yapılır.
sudo nano /etc/postgresql/17/main/pg_hba.conf
host replication replication111 192.168.52.180/32 md5

#pg_hba.conf dosyasındaki değişikliklerin geçerli olması için PostgreSQL servisi reload edilir.
sudo systemctl restart postgresql

Standb Sunucu Ayarları

Kopyala
#PostgreSQL’i durdur:
sudo systemctl stop postgresql

#Veri dizinini sil:
sudo rm -rf /var/lib/postgresql/17/main

#Primary’dan base backup al
sudo -u postgres pg_basebackup -h 192.168.52.179 -D /var/lib/postgresql/17/main -U replication11 -P -R

#postgresql.auto.conf veya standby.signal dosyasını ekle
primary_conninfo = 'host=192.168.52.180 user=replication11 password=pass'

#postgresql.conf dosyasında yaptığımız değişikliklerin geçerli olması için PostgreSQL servisi restart et
sudo systemctl restart postgresql

Kurulum başarıyla tamamlandı şimdi çalıştığını kontrol edelim.

Kopyala
#Mastere sunucuda aşağıdaki komutu çalıştır
SELECT client_addr, state, sync_state,reply_time FROM pg_stat_replication;

#Standby sunucuda ağaşıdaki sorguyla recovery modun açık olup olmadığı kontrol edilebilir.
SHOW in_hot_standby;

Primary sunucudan veri girişi yapın standby sunucuya eş zamanlı yazıldığını test edin. Standby dan eklemeye yapmaya çalışın readonly olduğunu gözlemleyin.

Logical Replication


Logical Replication Nedir?

Veritabanındaki değişikliklerin tablo ve satır düzeyinde çoğaltılmasıdır.
Çalışma şekli: Primary sunucu publisher olarak çalışır, belirlenen tabloların DML değişikliklerini (INSERT, UPDATE, DELETE) mantıksal değişiklikler olarak subscriber (abone) sunucuya yollar.
Replica tipi: Veri kopyası seçilen tablolar bazında ve replica üzerinde yazma da yapılabilir.
Veri Seviyesi: İstenilen tablolar seçilerek replikasyon yapılabilir tüm veritabanı değil.
Kullanım:
1- Belirli tabloların kopyalanması
2- Veri entegrasyonu (örneğin farklı uygulamalar arası veri paylaşımı)
3- Farklı PostgreSQL sürümleri arasında veri çoğaltma
4- Karmaşık veri dönüşümleri veya filtrelemeler

Aşağıdaki kavramları kurulumda kullanacağız.

Publisher: Belirli tabloları çoğaltmak için bir publication tanımlar.
Subscriber: Bu publication’a abone olan başka bir PostgreSQL sunucusudur.

Genel Mimarisi

Kurulumu

PUBLICATION Sunucu Ayarları

Kopyala
#postgresql.conf ayarları
sudo nano /etc/postgresql/17/main/postgresql.conf

wal_level = logical
max_replication_slots = 4
max_wal_senders = 10

#Sonra PostgreSQL’i yeniden başlat
sudo systemctl restart postgresql

#pg_hba.conf ayarları

sudo nano /etc/postgresql/17/main/pg_hba.conf

host    replication     replicator      192.168.52.166/32      md5
host    all             replicator      192.168.52.166/32      md5

#Sonra PostgreSQL’i yeniden başlat
sudo systemctl restart postgresql

#Replikasyon kullanıcısı oluştur
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'replica123';
GRANT SELECT ON TABLE employees_logical TO replicator;

#Test tablosu oluştur
CREATE TABLE employees_logical (
    id SERIAL PRIMARY KEY,
    name TEXT,
    department TEXT
);

#Publication oluştur
CREATE PUBLICATION pub_employees FOR TABLE employees_logical;

SUBSCRIBER Sunucu Ayarları

Kopyala
#Aynı tabloyu oluştur

CREATE TABLE employees_logical (
    id SERIAL PRIMARY KEY,
    name TEXT,
    department TEXT
);

#Subscription oluştur
CREATE SUBSCRIPTION sub_employees
CONNECTION 'host=192.168.52.163 port=5432 user=replicator password=replica123 dbname=postgres'
PUBLICATION pub_employees;	

Kurulum başarıyla tamamlandı Publisher sunucudan ve Subscriber sunucudan okuma yazma işlemi yaparak test edebilirsiniz. Publisher sunucuda yapılan değişiklikler Subscriber sunucuya eş zamanlı aktarılır. Subscriber sunucuda yapılan değişiklikler aktarım yapmaz.