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.

  1. 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
    
  2. 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
    

     



  3. 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
    
  4. 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:

    PostgreSQL server replication settings on the master server
    Ana sunucudaki PostgreSQL sunucusu çoğaltma ayarları

    Değişikliklerinizi bu dosyaya kaydedin ve çıkın.

  5. 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:

  6. Artık gerekli tüm ayarları yapılandırdığımıza göre, birincil sunucuyu başlatalım:
    $ sudo systemctl start postgresql
    

     



  7. 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.

  8. İ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:

  1. 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.

  2. 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.

  3. 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
    

     



  4. Ş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.

  5. 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.

  6. 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.