Veri tabanı Felaket Senaryolarına Hazırlık : PostgreSQL Stream Replication ile DB Replikasyonu

Merhaba arkadaşlar, bugün sizlerle olası veri tabanı çökme senaryolarına hazırlık için canlıda çalışan veri tabanımızın nasıl replikasyonunu (canlı yedeğini) oluşturacağımızı göreceğiz.

Öncelikle bu konuyu uygulamalı göstermek için bir Youtube videosu da çektim, dileyen arkadaşlar oradan da takip edebilir.

Makalede kalan arkadaşlar için devam edelim!

Bu replikasyonu, raporlama gibi uzun sorguların çalıştığı senaryolar için de kullanabilirsiniz. Böylelikle canlıda çalışan sistemi yavaşlatmadan raporları hazırlayabilirsiniz.

Bu makalede sunucuları simüle etmek için Multipass kullanacağız ve ardından PostgreSQL stream replikasyonu nasıl uygulayacağımızı ve bu kurulumu nasıl test edebileceğinizi adım adım göreceğiz.

PostgreSQL Stream Replication Nedir?

PostgreSQL stream replication, bir PostgreSQL veri tabanının birden fazla sunucu arasında senkronize edilmesine olanak tanır. Bu, veri tabanı yedekliliği sağlamak ve yüksek erişilebilirlik elde etmek için kullanılır. Master sunucu üzerinde yapılan değişiklikler, anında veya çok kısa bir gecikme ile slave sunucuya kopyalanır. Bu şekilde, slave sunucu her zaman master sunucunun bir kopyasını tutar ve gerektiğinde master sunucunun yerini alabilir.

Multipass Nedir?

Multipass, Ubuntu sanal makinelerini hızlı ve kolay bir şekilde başlatmanıza olanak tanıyan bir araçtır. Kendi bilgisayarınızda hızlıca birden fazla Ubuntu ortamı oluşturabilir ve bu ortamları istediğiniz gibi yönetebilirsiniz. Bu, özellikle geliştirme ve test süreçlerinde son derece kullanışlıdır. Sanal makineleri başlatmak, durdurmak ve yönetmek için basit komutlar kullanılır. Bu tarz sanallaştırma işlemlerinde dockerdan daha kullanışlı olduğunu söyleyebilirim.

Senaryomuz

Bu senaryoda, Multipass kullanarak iki Ubuntu VM (sanal makine) oluşturacağız: biri master sunucu, diğeri ise slave sunucu olacak. Ardından, bu iki sunucu arasında PostgreSQL stream replication kurulumunu gerçekleştireceğiz. Son olarak master sunucuda yapılan değişikliklerin slave sunucuda nasıl otomatik olarak yansıtıldığını test edeceğiz.

Adım 1: Multipass ile Ubuntu VM’leri Kurma

Öncelikle, Multipass’i kurup çalıştırmamız gerekiyor. Ardından, master ve slave sunucularımızı oluşturacağız.

1. Multipass Kurulumu

Multipass’i kurmak oldukça basit. Eğer MacOS veya Windows kullanıyorsanız, resmi Multipass indirme sayfasından gerekli talimatları bulabilirsiniz:

https://multipass.run/install

Biz şimdilik Linux kullanıcıları için ilerleyelim:

sudo snap install multipass

2. Ubuntu VM’lerini Başlatma

Master ve slave sunucularımızı oluşturmak için aşağıdaki komutları kullanabilirsiniz. Ek parametreler ile çekirdek sayısını (-c 2), RAM’ini (-m 2G) ve diskini (-d 10G) belirtebilirsiniz. Ben şimdilik parametre kullanmayacağım. Tavsiyem bunları yan yana ayrı ayrı terminalde açmanız. Sonrasında karışıklık olmaması adına daha iyi olacaktır:

multipass launch --name master
multipass launch --name slave

Şimdi kendi bilgisayarımda 2 adet sunucuya sahibim. Bunların IP adresleri, aşağıdaki konfigürasyonlar için lazım olacak. Onun için aşağıdaki komutu çalıştırıyorum:

multipass list

Şöyle bir çıktı görmemiz lazım:

| Name   | State   | IPv4           | Image             |
|--------|---------|----------------|-------------------|
| master | Running | 192.168.64.6   | Ubuntu 24.04 LTS  |
| slave  | Running | 192.168.64.7   | Ubuntu 24.04 LTS  |

Burada gördüğünüz gibi master ve slave sunucularımız başarıyla kurulmuş. Master’ın IP adresi: 192.168.64.6, slave’in IP adresi: 192.168.64.7. Bu bilgileri bize lazım olacak ve aşağıda bunlarla işlem yapacağız. Sizin bu IP adreslerini kendinize göre değiştirmeniz lazım. Bunları bi master ve slave olarak bi yere not almanızda fayda var.

Ayrıca master sunucusuna bağlanmak için masterın bulunduğu terminalde şu komutu çalıştırmamız lazım:

multipass shell master

Slave için açtığımız terminalde ise aşağıdaki komutla sunucu terminaline bağlanabiliriz.

multipass shell slave

Yani hangi sunucuda işlem yapacaksak önce multipass shell <image-name> ile ona bağlanmamız lazım.

Adım 3: PostgreSQL Kurulumu ve Ayarları

Şimdi sunuculara PostgreSQL’i kuracağız. Ben, şu an en güncel hali olan versiyon 16’yı kurmasını istiyorum. Siz isterseniz başka bir sürüm kurabilirsiniz. PostgreSQL’i aşağıdaki komutlarla her iki sunucu için de kuracağız.. Unutmayın, artık bu komutları çalıştırmak için öncesinde sunuculara bağlanıp multipass shell <image-name> komutunu kullanmanız gerekiyor. Biz şimdilik master’dan ilerleyelim.

sudo apt update
sudo apt install -y postgresql-16

Şimdi PostgreSQL’in konfigürasyon dosyasını düzenlememiz gerekiyor. Bu dosya, genellikle /etc/postgresql/16/main/postgresql.conf dizininde bulunur. 16 yerine sizin kurduğunuz sürüm hangisiyse onu yazmanız gerekmekte:

sudo nano /etc/postgresql/16/main/postgresql.conf

Dosyanın başına şu komutları ekleyelim:

listen_addresses = '*'
wal_level = replica
max_wal_senders = 3
wal_keep_size = 16

Diğer adıma geçmeden ne yaptığımızı bilmek amaçlı komutların ne işe yaradığını anlatmak istiyorum.

listen_addresses = ‘*’ : bu komut ile PostgreSQL sunucusunun tüm iplerden gelen istekleri kabul edeceğini belirtiyoruz.

wal_level = replica : Bu ayar ise PostgreSQL’in Write-Ahead Logging (WAL) seviyesini belirler. WAL, veri bütünlüğünü korumak ve replikasyon için gereklidir.

max_wal_senders = 2 : PostgreSQL sunucusunun aynı anda kaç tane WAL sender (gönderici) işlemi yürütebileceğini belirtir. WAL sender işlemleri, replikasyon için gereklidir ve WAL dosyalarını standby (slave) sunuculara gönderir. Yani en fazla kaç replikasyon işlemcimiz olacağını burada belirtiyoruz. Biz 1 replika sunucusu kullanacağız ama eğer sonrasında bir tane daha replikasyon serverı yaratmak istersek diye 2 girelim.

wal_keep_size = 16 : Bu ayar, PostgreSQL’in saklayacağı WAL dosyalarının toplam boyutunu belirtir. WAL dosyaları, replikasyon gecikmelerine karşı güvenlik sağlar ve standby sunucuların senkronize kalmasına yardımcı olur. MB cinsinden belirtilir. Yani şu an WAL dosyaların toplam boyutu 16 MB olacaktır.

Şimdi master sunucunun replikasyonu kabul etmesi için pg_hba.conf dosyasına da birkaç ekleme yapmamız gerekiyor. Öncelikle bu dosyayı açalım:

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

Dosyanın ilk satırına şunu ekleyelim. Buradaki ip adresi slave makinemizin IP adresidir. :

host    replication     all             192.168.64.7/32        md5

Bu ayarla birlikte 192.168.64.7 IP adresine sahip slave sunucusundan gelen replikasyon bağlantılarına izin verir ve bu bağlantılar için MD5 şifreleme ile kimlik doğrulaması yapar.

Şimdi replikasyon kullanıcısı oluşturmamız lazım. PostgreSQL’e giriş yapıp, aşağıdaki komut aracılığıyla bir replikasyon kullanıcısı oluşturalım:

sudo -u postgres psql
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD '123456';

Bu işlemleri yaptıktan sonra PostgreSQL’den çıkmamız lazım bunun için şu komutu kullanacağız.

\q

Bunu yaptığınızda ubuntu kullanıcına geçtik. Bu değişiklikleri yaptıktan sonra PostgreSQL’i yeniden başlatmamız lazım. Bunun için aşağıdaki komutu kullanıyoruz:

sudo systemctl restart postgresql

Şimdi buraya kadar geldiysek ilk aşamayı başarıyla tamamladık. Bundan sonra master sunucumuz replikasyon sunucularının ona bağlanması için hazır. Şimdi de slave sunucumuzdaki ayarları halledip, replikasyon işlemini tamamlayalım.

Adım 4: Slave Sunucusunu Ayarlamak

Öncelikle aşağıdaki komut ile slave sunucumuza bağlanacağız. Tavsiyem yukarıda da belirtiğim üzere yan yana 2 terminal açarak master için ayrı, slave için ayrı terminal kullanmanız. Logları incelemek isteyince de faydası oluyor:

multipass shell slave

burada da yine öncelikle PostgreSQL’i kurmamız lazım:

sudo apt update
sudo apt install -y postgresql-16

Şimdi PostgreSQL’de ayar yapmamız için servisi durdurmamız lazım:

sudo systemctl stop postgresql

Şimdi var olan veri tabanını yedekleyeceğiz. Bu kısım önemli. İstersek bu klasörü direkt silebiliriz ama canlıda bu işlem tehlikeli olduğundan önce yedeklemenizi tavsiye ederim. Biz replikasyonun yapılacağı sunucuda herhangi bir veri tabanı bulunmadığı kabulüyle devam ediyoruz :

sudo mv /var/lib/postgresql/16/main /var/lib/postgresql/16/main_backup

Şimdi de master’dan slave’e veri tabanını klonlayacağız. Bunu veri tabanı için ilk kurulum gibi düşünebilirsiniz. Aşağıdaki komut masterdan veri tabanını kendi veri tabanına klonluyor. Dolayısıyla aşağıda yazacağımız ip adresi master sunucuya ait olduğunu unutmayalım. :

sudo -u postgres pg_basebackup -h 192.168.64.6 -D /var/lib/postgresql/16/main -U replicator -P -R

Eğer parametreleri değiştirmediyseniz password istediğinde direkt yukarıdaki replikasyon kullanıcısı için default şifre olan 123456 yı girmeniz lazım. yani password : 123456

Şimdi slave sunucunun standby replikasyon modunda çalıştığını belirtmek için standby.signal dosyası oluşturmamız lazım. Bu dosya sayesinde PostgreSQL’in standby modunda çalışmasını ve master sunucudan veri almasını sağlıyoruz. PostgreSQL, standby.signal dosyasını bulduğunda recovery (kurtarma) modunda çalışır ve bu modda sürekli olarak master sunucudan gelen WAL (Write-Ahead Log) kayıtlarını uygulayarak verileri güncelleyerek senkronizasyonu sağlar:

sudo touch /var/lib/postgresql/16/main/standby.signal

Artık ayarlamaları tamamladık. Şimdi durdurduğumuz PostgreSQL servisini tekrar başlatalım:

sudo systemctl start postgresql

Ve tebrikler. Artık tüm ayarlamaları bitirdiniz. Şimdi master ve slave sunucularını kontrol edelim. Master için şu komutu çalıştıralım:

sudo -u postgres psql -c "SELECT * FROM pg_stat_replication;"

Eğer çıktı olarak aşağıdaki gibi bir sonuç alırsanız burası sağlıklı bir şekilde çalışıyor demektir:

| pid  | usesysid | usename  | application_name | client_addr  | client_hostname | client_port | backend_start          | backend_xmin | state     | sent_lsn   | write_lsn  | flush_lsn  | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state | reply_time               |
|------|----------|----------|------------------|--------------|-----------------|-------------|------------------------|--------------|-----------|------------|------------|------------|------------|-----------|-----------|-------------|----------------|------------|--------------------------|
| 6111 | 16388    | replicator | 16/main         | 192.168.64.7 |                 | 51488       | 2024-07-26 21:56:49+03 |              | streaming | 0/34553C0  | 0/34553C0  | 0/34553C0  | 0/34553C0  |           |           |             | 0              | async      | 2024-07-27 01:21:12+03  |

Şimdi de slave sunucumuzun recovery modunda olup olmadığını anlamak için slave sunucusunda aşağıdaki komutu çalıştıralım:

sudo -u postgres psql -c "SELECT * FROM pg_is_in_recovery();"

Burada da aşağıdaki gibi bir çıktı aldıysak her şey yolunda demektir:

| pg_is_in_recovery |
|-------------------|
| t                 |

Artık test verisi ekleyerek replikasyonu doğrulayabiliriz. Öncelikle master sunucuda PostgreSQL’e giriş yapıp, bir test veri tabanı ve tablosu oluşturalım:

sudo -u postgres psql
CREATE DATABASE test_db;

CREATE TABLE test_table (
 id SERIAL PRIMARY KEY,
 data TEXT
);

INSERT INTO test_table (data) VALUES ('Replication test 1');
INSERT INTO test_table (data) VALUES ('Replication test 2');

Şimdi de slave sunucumuzda PostgreSQL’e bağlanıp select atalım ve verilerin gelip gelmediğini kontrol edelim:

sudo -u postgres psql
SELECT * FROM test_table;

Eğer aşağıdaki gibi sonuçları görürseniz her şey başarılı şekilde çalışıyor demektir. Artık master’da eklediğimiz tüm veriler slave sunucumuza kopyalanacak.

| id | data              |
|----|-------------------|
| 1  | Replication test 1|
| 2  | Replication test 2|

Eğer bir sorun yaşarsanız veya sorularınız olursa, lütfen yorumlarda belirtin.

Bir yanıt yazın

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