PostgreSQL: Hot-Standby nasıl oluşturulur?
PostgreSQL gibi veritabanlarında ölçeklendirme ve yüksek kullanılabilirlik sağlama ihtiyacı doğabilir. Veritabanının arıza durumunda yerini alabilecek bir yedeği yoksa tek bir arıza noktasından veritabanına bağlı tüm operasyonlarınız etkilenebilir. Sanal sistemlerde bile, sürekli artan yükün üstesinden gelmek için tek bir makineye daha fazla kaynak ekleyemediğiniz bir zaman olabilir.
Ayrıca, uzun süreli analizler için sorgulanabilen, yüksek işlem yoğunluğuna sahip üretim veritabanında çalıştırılmaya uygun olmayan veritabanı içeriklerinin ek bir kopyasına da ihtiyaç duyulabilir. Bu kopya, başka bir makinedeki en son yedeklemeden basit bir geri yükleme olabilir, ancak veriler geri yüklenir yüklenmez güncelliğini yitirir. Birincil veritabanının bir kopyasını oluşturarak bir sıcak yedek oluşturabilir ve içeriğini sürekli olarak yedekte kopyalayacak şekilde yapılandırabiliriz.
Bu nedenlerden dolayı PostgreSQL veritabanınız için sıcak bir yedeğe sahip olmak faydalıdır. Ana veritabanında bir arıza olması durumunda, yedek (veya yardımcı) veritabanı birincilin rolünü üstlenebilir, senkronizasyonu durdurabilir ve okuma ve yazma isteklerini kabul edebilir, böylece işlemler devam edebilir ve arızalı ana veritabanı hayata döndürülebilir. (belki de senkronizasyon yolunu değiştirerek bekleme modunda). Hem birincil hem de yedek çalışırken, veritabanı içeriğini değiştirmeye çalışmayan sorgular yedek beklemeye aktarılabilir, böylece genel sistem daha büyük bir yükü kaldırabilir. Bununla birlikte, bir miktar gecikme olacağını unutmayın; yedek, değişiklikleri senkronize etmek için gereken süre kadar ana makinenin arkasında olacaktır. Bu gecikme kuruluma bağlı olarak değişebilir.
PostgreSQL ile ana-bağımlı (veya hatta ana-ana) senkronizasyonu oluşturmanın birçok yolu vardır, ancak bu kılavuzda akış çoğaltmasına odaklanacağız. Bu eğitimde, sıcak yedek bir PostgreSQL veritabanı kurmanın adım adım talimatlarını inceleyeceğiz. Veritabanları iki farklı sunucuda yapılandırılacak, böylece arıza durumunda etkin yedek sunucunun birincil sunucuyla kolayca değiştirilebilmesi sağlanacak.
Ana Sunucu için PostgreSQL Yapılandırması
Ana sunucuda PostgreSQL’i yapılandırmakla başlayacağız. Uygulamalarınıza ve kullanıcılarınıza veritabanı hizmetleri sağlayan sistem bu olmalıdır. İçeriğini daha sonra yapılandıracağımız ikincil bir veritabanına kopyalamak için belirli ayarların uygulanması gerekecektir.
UYARI!
Bir üretim veritabanıyla çalışıyorsanız, değişiklik yapmadan önce tüm yapılandırma dosyalarını yedeklemek genellikle iyi bir fikirdir. Bahsetmeye değer yer kaplamazlar ve bir şeyler ters giderse, çalışan bir yapılandırma dosyasının yedeği bir cankurtaran olabilir.
Aşağıdaki adımlar Debian tabanlı (Ubuntu gibi) ve Red Hat tabanlı (Fedora, Almalinux vb.) dağıtımları kapsayacaktır.
- PostgreSQL sunucusunu Linux sistemimize kurarak başlayacağız. Henüz PosteSQL kurulu değilse bu işlem her iki sistemde de gerçekleşecektir. Debian tabanlı kullanıcılar apt komutunu kullanabilir:
$ sudo apt install postgresql
Ve Red Hat tabanlı kullanıcılar dnf komutunu kullanabilir:
$ sudo dnf install postgresql-server
Kurulumdan sonra Red Hat tabanlı dağıtımlarda aşağıdaki komutu çalıştırmanız gerekeceğini unutmayın:
$ sudo postgresql-setup initdb
- Daha sonra, PostgreSQL veritabanlarının otomatik olarak başlatıldığından emin olmak için her iki sunucuda da aşağıdaki komutu çalıştırın:
$ sudo systemctl enable postgresql
- Birincil (ana) sunucuda, çoğaltma ayarlarını uygulamak için pg_hba.conf dosyasını düzenlememiz gerekiyor. Bu dosyayı tercih ettiğiniz metin düzenleyicide ve kök ayrıcalıklarıyla açın:
Debian tabanlı sistemler: $ sudo nano /etc/postgresql/16/main/pg_hba.conf Red Hat tabanlı sistemler: $ sudo nano /var/lib/pgsql/data/pg_hba.conf
- Bu dosyanın içine, yedekteki veritabanı kullanıcısının birincil veritabanına erişmesine izin verecek bir kural eklememiz gerekiyor. Bu sunucu tarafı ayarıdır, kullanıcı henüz veritabanında mevcut değildir. Çoğaltma veritabanıyla ilgili açıklamalı dosyanın sonunda örnekler bulabilirsiniz:
# Allow replication connections from localhost, by a user with the # replication privilege. local replication all peer host replication all 127.0.0.1/32 scram-sha-256 host replication all ::1/128 scram-sha-256
Dosyanın sonuna bir satır daha ekleyelim ve onu bir yorumla işaretleyelim, böylece varsayılanlardan nelerin değiştiği kolayca görülebilsin:
# My custom replication settings host replication repuser 192.168.68.65/32 md5
192.168.68.65’in ikincil sunucumuzun IP adresi olduğunu unutmayın. /32 alt ağ maskesi, bu ayardan yalnızca belirli ana makinemizin birincil veritabanına erişebilmesini sağlar. Dosyanız aşağıdaki ekran görüntüsüne benzemelidir:
Ana sunucudaki PostgreSQL sunucusu çoğaltma ayarları Değişikliklerinizi bu dosyaya kaydedin ve çıkın.
- Ayrıca pg_hba.conf dosyasını bulduğumuz dizinde bulunan veritabanı sunucusunun ana yapılandırma dosyası postgresql.conf’ta da değişiklik yapmamız gerekiyor. Aşağıdaki ayarları uygulamamız gerekecek:
listen_addresses = '*' wal_level = 'replica' archive_mode = on archive_command = 'cp %p /etc/postgresql/16/main/%f' max_wal_senders = 3 wal_keep_size = 64
Bu ayarların tümü dosyanın içinde zaten mevcuttur, ancak yorumlanmıştır. Her birini bulup ayarları tek tek uygulamak yerine, tüm satırları dosyanın altına yapıştırmak daha kolay ve aynı derecede etkilidir:
- Artık gerekli tüm ayarları yapılandırdığımıza göre, birincil sunucuyu başlatalım:
$ sudo systemctl start postgresql
- Son olarak replikasyonu gerçekleştirecek veritabanı kullanıcısını oluşturmamız gerekiyor:
$ sudo -u postgres psql postgres=# CREATE ROLE repuser WITH REPLICATION PASSWORD 'secretPassword' LOGIN; CREATE ROLE
Repuser kullanıcısına vereceğiniz şifreyi bir kenara not edin çünkü bekleme tarafında ona ihtiyacımız olacak. CREATE ROLE çıktısı kullanıcıyı başarıyla oluşturduğumuzu doğrular.
- İkincil sunucuya geçmeden önce değişikliklerimizin etkili olması için PostgreSQL’i yeniden başlatmamız gerekecek:
$ sudo systemctl restart postgresql
Yedek Sunucu için PostgreSQL Yapılandırması
Bu noktada ikincil (slave) sunucuya geçebiliriz. Bu sunucunun, yukarıda zaten yapılandırdığımız ana sunucu için sıcak yedek olarak ayarlanmasını sağlamak için aşağıdaki adımları izleyin:
- Yukarıdaki bölümü takip ederek zaten PostgreSQL ile köle sunucu kurulumunu yapmış olmalısınız. Daha sonra veritabanı bağlamında süper kullanıcı olan postgres kullanıcısı olarak çalışacağız. Birincil veritabanının ilk kopyasına ihtiyacımız olacak ve bunu pg_basebackup komutuyla alacağız. İlk olarak, çoğu dosyanın bekleme durumundaki veri dizinini sileriz (dilerseniz önceden bir kopyasını alın, ancak bu yalnızca boş bir veritabanıdır). İki dosyayı olduğu gibi bırakacağız:
Debian tabanlı sistemler: $ sudo find /etc/postgresql/16/main ! -name 'pg_hba.conf' ! -name 'pg_ident.conf' -exec rm -f {} + Red Hat tabanlı sistemler: $ sudo find /var/lib/pgsql/data ! -name 'pg_hba.conf' ! -name 'pg_ident.conf' -exec rm -f {} +
Bu, sistemde tutmamız gereken pg_hba.conf ve pg_ident.conf dışındaki tüm dosyaları silecektir.
- Artık birincil veritabanının tutarlı bir kopyasını yedek veritabanına oluşturmaya hazırız:
Debian tabanlı sistemler: $ sudo pg_basebackup -h 192.168.68.64 -U repuser -D /etc/postgresql/16/main/ Red Hat tabanlı sistemler: $ sudo pg_basebackup -h 192.168.68.64 -U repuser -D /var/lib/pgsql/data/
Bu örnekte 192.168.68.64’ün ana sunucumuzun IP adresi olduğunu unutmayın. repuser daha önce yapılandırdığımız kullanıcının adıdır. Komutu çalıştırırken şifreniz istenmelidir.
NOT
Oluşturduğumuz bu kullanıcının yanında birincil boş olduğundan, pg_basebackup’ın saniyeler içinde tamamlanması gerekir (ağ bant genişliğine bağlı olarak). Bir şeyler ters giderse, birincil sunucudaki hba kurallarını, pg_basebackup komutuna verilen IP adresinin doğruluğunu ve birincil sunucudaki 5432 numaralı bağlantı noktasına bekleme modundan erişilebilir olup olmadığını (örneğin telnet ile) kontrol edin. - Yedekleme tamamlandığında, veri dizininin, yapılandırma dosyaları da dahil olmak üzere ikincil sunucuda doldurulduğunu fark edeceksiniz (unutmayın, daha önce bu dizinden her şeyi silmiştik):
Debian tabanlı sistemler: $ sudo ls /etc/postgresql/16/main Red Hat tabanlı sistemler: $ sudo ls /var/lib/pgsql/data
Çıkış:
backup_label.old pg_commit_ts pg_logical pg_serial pg_subtrans pg_wal postmaster.opts backup_manifest pg_dynshmem pg_multixact pg_snapshots pg_tblspc pg_xact postmaster.pid base pg_hba.conf pg_notify pg_stat pg_twophase postgresql.auto.conf standby.signal global pg_ident.conf pg_replslot pg_stat_tmp PG_VERSION postgresql.conf
- Şimdi bekleme konfigürasyonunda bazı ayarlamalar yapmamız gerekiyor. Repuser’ın bağlanabileceği IP adresinin, ana sunucunun pg_hba.conf dosyasındaki adresi olması gerekir. Aşağıda yapılandırdığımız adresin yerine kendi yönetici IP adresinizi koyacağınız dosyanın altına aşağıdaki satırı ekleyin:
Dosya konumu: Debian tabanlı: $ sudo nano /etc/postgresql/16/main/pg_hba.conf Red Hat tabanlı: $ sudo nano /var/lib/pgsql/data/pg_hba.conf
Aşağıdaki satırı kopyalayıp en alta yapıştırın:
# My custom replication settings host replication repuser 192.168.68.64/32 md5
Not: Yukarıdaki 192.168.68.64 kısmını ana sunucunuzun IP adresiyle değiştirin.
- Her şey yerli yerinde olduğundan, beklemeyi başlatabilir ve her şeyin olması gerektiği gibi çalışıp çalışmadığını görebiliriz:
$ sudo systemctl start postgresql
İstemi geri almak normalden biraz daha fazla zaman alabilir. Bunun nedeni, veritabanının kurtarma işlemini arka planda tutarlı bir duruma gerçekleştirmesidir.
- Veritabanınızın bekleme moduna girip girmediğini ve birincil veritabanının bir kopyasını oluşturmaya başlayıp başlamadığını kontrol etmek için günlük dosyasını kontrol edin:
Debian tabanlı sistemler: $ tail -f /var/log/postgresql/postgresql-16-main.log Red Hat tabanlı sistemler: $ tail -f /var/lib/pgsql/data/log/postgresql-Sun.log (bu günlük dosyasının adı haftanın gününe göre değişecektir)
Beklenen çıktı şöyle görünmelidir:
2024-09-01 22:59:50.068 GMT [4350] LOG: entering standby mode 2024-09-01 22:59:50.069 GMT [4350] LOG: starting backup recovery with redo LSN 0/6000028, checkpoint LSN 0/6000060, on timeline ID 1 2024-09-01 22:59:50.087 GMT [4350] LOG: redo starts at 0/6000028 2024-09-01 22:59:50.088 GMT [4350] LOG: completed backup recovery with redo LSN 0/6000028 and end LSN 0/6000100 2024-09-01 22:59:50.088 GMT [4350] LOG: consistent recovery state reached at 0/6000100 2024-09-01 22:59:50.088 GMT [4347] LOG: database system is ready to accept read-only connections 2024-09-01 22:59:50.127 GMT [4351] LOG: started streaming WAL from primary at 0/7000000 on timeline 1
Yazının orijinalini buradan okuyabilirsiniz.

Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım.
Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum.
Son 6 yıldır sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum.
Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.