Postgres’te Replikasyon

22 Eylül 2018’de İstanbul’daki 5.PostgreSQL Türkiye Konferansı’na (https://2018.pgday.istanbul/) katıldım. Konferansta en çok ilgimi çeken konulardan birisi Postgres’te fiziksel replikasyon yaratma başlığıydı. Konferansta “PostgreSQL’de Fiziksel Replikasyon” sunumu yapan Fırat Güleç (https://www.linkedin.com/in/firat-gulec-95b82322/) konuya oldukça hakimdi. Kendisinden sunumunu istedim. Çünkü bizim de mevcut uygulamalarımızda artık replikasyon mimarisine geçmemiz gerekiyordu, çok geç bile kalmıştık. Bu yüzden hızlı bir şekilde replikasyonu gerçekleştirmem gerekiyordu. Bunun üzerine iş başa düştü, ben de kendim araştırmaya başladım. Etkinlikteki sunumlar ben bu içeriği hazırladıktan sonra yayınlandı. (https://2018.pgday.istanbul/#sunumlar)

Postgres replikasyonu konusunda “nedir? ne değildir?” gibi temel sorulara yanıt arayanlar internette araştırma yapmaya devam etsinler. Zira bu yazı onların ihtiyacını karşılamayacaktır. Ben bu yazı ile replikasyon oluşturma ve bu sırada karşılaştığım sorunlara çözümleri aktarmaya çalışacağım.

Öncelikle şunu söylemem lazım: Postgres replikasyonu oluşturmak için master ve slave’deki Postgres sürümlerinizin aynı olmasına dikkat edin, hatta sağlayın. Çünkü ilk iki denememde neden başarısız olduğumu araştırırken Postgres logları karşıma çok acı bir ders verdi: DETAIL: The data directory was initialized by PostgreSQL version 9.3, which is not compatible with this version 9.5.14.

Master node’daki Postgres sürümüm 9.3 iken slave sürümüm 9.5 idi. “Major versiyonlar farklı olmasın, minor’lerde sorun yok” iddiasına inanmayın. O yüzden de her iki node’daki Postgres sürümlerinin aynı olmasını sağlamanızı şiddetle tavsiye ederim.

Hadi başlayalım 🙂

Konfigürasyon yaparken şu videoyu referans aldım. Size de tavsiye ederim: https://www.youtube.com/watch?v=XFp8wHNtP3s

Master Node konfigürasyonu

1- Öncelikle yapılması gereken hiç kuşkusuz Postgres kurulumu (ben her iki node’da da 9.3 sürümünü kullanacağım):

#sudo vim /etc/apt/sources.list.d/pgdg.list
#sudo wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
#sudo apt-get update
#sudo apt-get install postgresql-9.3 postgresql-contrib-9.3 postgresql-doc-9.3

2- Postgres kurulumunda bir hata almadıysanız kurulumun tamamlanmış olmasını bekliyoruz. Bunu kontrol etmek için de şunu çalıştırabilirsiniz:

#sudo systemctl status postgresql

3- İki adımda Postgres’in konfigürasyon dosyalarını düzenleyeceğiz.

#sudo vim /etc/postgresql/9.3/main/postgresql.conf

Bu dosyadaki listen_address parametresini bulalım ve şu şekilde düzenleyelim:

listen_addresses = '*' # what IP address(es) to listen on;

Kaydedip kapatalım.

4- Şimdi sıra Postgres’in diğer konfigürasyon dosyasını düzenlemede:

#sudo vim /etc/postgresql/9.3/main/pg_hba.conf

Bu dosyada öncelikle IPv4 ve IPv6 konfigürasyonu yapacağız.

# IPv4 local connections:
host all all 0.0.0.0/0 md5
# IPv6 local connections:
host all all ::/0 md5

Ardından Postgres’i yeniden başlatalım ve yatığımız konfigürasyonu kontrol edelim. Bunun için:

#sudo systemctl restart postgresql
#netstat -nltp | grep postgres

5- Veritabanında replikasyon işlemi için kullanıcı yaratalım.

#sudo su postgres
#psql
#CREATE ROLE replication WITH REPLICATION PASSWORD 'password' LOGIN;
#exit
#exit

6- Şimdi Postgres’teki replikasyon parametrelerini düzenleyeceğiz. Bunun için öncelikle Postgres servisini durdurup postgresql.conf dosyasını düzenleyeceğiz.

#sudo systemctl stop postgresql

(Servisin durduğundan emin olun. Gerekirse ‘sudo systemctl status postgresql’ ile kontrol edin her seferinde)

#sudo vim /etc/postgresql/9.3/main/postgresql.conf

Bu dosyada aşağıdaki 5 parametreyi şu şekilde düzenleyelim (Bu parametrelerle ilgili detay anlatmayacağım. Merak ederseniz Postgres’in resmi sitesindeki dokümantasyondan bakabilirsiniz):

wal_level = hot_standby
max_wal_senders = 5
wal_keep_segments = 32
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/9.3/main/archive/%f

7- Bir önceki adımda tanımladığımız archive_command parametresine verdiğimiz dizini yaratmamız ve izinlerini düzenlememiz gerekiyor:

#sudo mkdir /var/lib/postgresql/9.3/main/archive
#sudo chown postgres.postgres /var/lib/postgresql/9.3/main/archive

8- Son olarak veritabanında tanımladığımız kullanıcıyı Postgres’te de belirtmemiz gerekiyor. Böylelikle slave node ile kurulacak iletişimin kurulumunu tamamlayacağız:

#sudo vim /etc/postgresql/9.3/main/pg_hba.conf

host replication replication 192.168.2.66/32 md5

Buradaki 192.168.2.66 benim slave IP’m. Dolayısıyla siz kendi konfigürasyonunuza göre burayı düzenleyebilirsiniz.

Dosyayı düzenleyip kaydettikten sonra Postgres’i başlatalım ve /var/lib/postgresql/9.3/main/archive dizinini kontrol edelim. Bu dizin altında aşağıdaki fotoğraftaki gibi dosyalardan görürseniz master node konfigürasyonunuz başarıyla tamamlanmış demektir. Benim replikasyonum bir süredir çalıştığı için aşağıdaki görselde bu kadar fazla dosya var. Siz replikasyonu henüz tamamladığınız için sizde sadece 1 tane dosya görünecektir, endişe etmeyin 🙂

Artık master node konfigürasyonu artık hazır.

#sudo systemctl restart postgresql

Slave Node konfigürasyonu

1- Tıpkı master node’dunda olduğu gibi bu node’da da Postgres kurulumu yapmamız gerekiyor. Kurulumu detaylı bir şekilde yukarıda anlattığım için burada tekrar etmeyeceğim.
2- Kurulum sonrasında Postgres otomatik olarak başlar. O yüzden Postgres’i kapatalım.

#sudo systemctl stop postgresql

Ve artık alışkanlık olduğu üzere servisin durumunu kontrol ediyoruz ve durduğundan emin oluyoruz.

#sudo systemctl status postgresql

3- Postgres’in kurulu olduğu dizindeki tüm dosyaları silelim.

#sudo rm -rf /var/lib/postgresql/9.3/main/*

Linux dosya izinleri konusunda sıkıntı yaşarsanız superuser olarak yapmanız gerekir.

4- Ve artık yedeklemeyi çalıştırabiliriz. Burada 192.168.2.44 IP’sinin benim master node’um olduğuna dikkat edin. Siz de kendi master node’unuzun IP’sini yazabilirsiniz.

#pg_basebackup -h 192.168.2.44 -D /var/lib/postgresql/9.3/main/ -P -U replication --xlog-method=stream

Bu işlemin süresi, yedeklediğiniz veritabanının boyutuna göre değişecektir. Aktarım bitmeden sakın konsola müdahalede bulunmayın.

5- Aktarım biter bitmez Postgres konfigürasyonuna başlayabiliriz.

#sudo vim /etc/postgresql/9.3/main/postgresql.conf

Bu dosyada hot_standby parametresini uncomment’e alıp on’a çevirelim:

hot_standby = on

6- Bu adımda öncelikle recovery.conf’u yaratıyoruz.

#sudo vim /var/lib/postgresql/9.3/main/recovery.conf

Ardından da dosyasının içine aşağıdakileri ekliyoruz.

standby_mode = 'on'
primary_conninfo = 'host=192.168.2.44 port=5432 user=replication password=1111'
trigger_file = '/var/lib/postgresql/9.3/trigger'
restore_command = 'cp /var/lib/postgresql/9.3/archive/%f "%p"'

Bu işlemin ardından Postgres’i başlatabiliriz.

#sudo systemctl start postgresql

Master ve slave node’larımızın konfigürasyonu tamamlandı. Yaptığınız konfigürasyonun başarılı olup olmadığını kontrol etmek için master node’undaki postgres’te bir veritabanı yaratın. Eğer aynı veritabanını slave node’unda da görüyorsunuz, congratulations! 🙂

Postgres’te Replikasyon” üzerine 2 düşünce

  • 2021-04-14 tarihinde, saat 14:07
    Kalıcı bağlantı

    Ömür Hanım merhabalar, yukarıda yaptığınız şekilde replikasyon işlemini yapmayı deniyordum. Adımları sıra ile uygularken wal_keep_segment parametresinin dosyada yer almadığını farkettim. Bu konu hakkında yardımcı olabilir misiniz veya sorunu halledebileceğim yol hakkında yönlendirme yapabilir misiniz?

    İyi çalışmalar.

    Yanıtla
    • 2021-04-14 tarihinde, saat 15:27
      Kalıcı bağlantı

      Merhaba,

      Kadın olduğuma nasıl kanaat getirdiğinizi anlayamadım. Yazılarımın tamamında cinsiyetimi belirten bir ifade yok aslında ama yine de erkek olduğumu öncelikle belirteyim 🙂

      Referans verdiğim videoda bu parametre 32 olarak kullanılmış. Siz de 32’yi kullanabilirsiniz.

      İyi çalışmalar.

      Yanıtla

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.