Postgresql veritabanımızı uzak bir noktaya anlık olarak
yedeklemek istersek repmgr kullanarak bunu yapabiliriz. Uzaktaki veritabanı
hot_standby olacak ve read-only olarak çalışacaktır. Aşağıda bununla ilgili bir
kurulum dökümanı karalamaya çalıştım.
Denemeleri Centos 6.3 ve Postgresql 9.2 kullanarak yaptık.
Master olacak sunucunun adı node1, slave olacak sunucunun adına node2 diyoruz.
IP bilgileri:
Node1: 172.25.6.28
Node2: 172.25.6.30
Node1: 172.25.6.28
Node2: 172.25.6.30
DB adı: deneme
İki sunucuda da postgresql
postgresql-contrib postgresql-server postgresql-devel libxslt-devel pam-devel
libopenssl-devel krb5-devel make gcc readline-devel paketleri kurulu
olmalı. Bu paketlerin kurulumu yum
install ile yapıldı ve Centos default olarak nereye kuruyorsa oraya kuruldu.
İki sunucu postgres kullanıcısı ile birbirlerine ssh üzerinden parolasız bağlanabilmeli. (Paket kurulumu ve parolasız ssh için farklı dökümanları inceleyebilirsiniz)
İki sunucu postgres kullanıcısı ile birbirlerine ssh üzerinden parolasız bağlanabilmeli. (Paket kurulumu ve parolasız ssh için farklı dökümanları inceleyebilirsiniz)
-----------------------------
Paketler kurulduktan sonra sadece node1’de postgres
kullanıcısı ile;
Postgresql.conf dosyasında ilgili satırları aşağıdaki
şekilde değiştiriyoruz.
listen_addresses = "*"
wal_level = hot_standby
checkpoint_segments=30
archive_mode=onarchive_command='cd .'
max_wal_senders=2
wal_keep_segments=5000
hot_standby=on
wal_level = hot_standby
checkpoint_segments=30
archive_mode=onarchive_command='cd .'
max_wal_senders=2
wal_keep_segments=5000
hot_standby=on
ph_hba.conf dosyası da aşağıdaki şekilde olmalı.
host all all 172.25.6.0/24 trust
host replication all 172.25.6.0/24 trust
host replication all 172.25.6.0/24 trust
root kullanıcısına geçip node1’de postgresql servisini
restart ediyoruz.
/etc/init.d/postgresql-9.2
restart
---------------------------------------
Slave sunucu olacak node2’ye geçip, eğer çalışıyorsa önce
root kullanıcısı ile postgresql servisini kapatıyoruz.
/etc/init.d/postgresql-9.2 stop
Sonrasında data altındaki tüm dosyaları siliyoruz.
rm -rf /var/lib/pgsql/9.2/data/*
rm -rf /var/lib/pgsql/9.2/data/*
-----------------------------------------------
Geldik repmgr kurulumuna;
http://www.repmgr.org/ sayfasından repmgr’nin son sürümünü
indiriyoruz. Doküman yazıldığında son sürüm 1.2.0 idi.
Root kullanıcısı ile her iki sunucuda da aşağıdaki komutları kullanarak repmgr’yi kuruyoruz.
tar -zxvf repmgr-1.2.0.tar.gz
cd repmgr-1.2.0
PATH=$PATH:/usr/pgsql-9.2/bin/
export PATH
make USE_PGXS=1
make USE_PGXS=1 install
Root kullanıcısı ile her iki sunucuda da aşağıdaki komutları kullanarak repmgr’yi kuruyoruz.
tar -zxvf repmgr-1.2.0.tar.gz
cd repmgr-1.2.0
PATH=$PATH:/usr/pgsql-9.2/bin/
export PATH
make USE_PGXS=1
make USE_PGXS=1 install
Eğer bu kurulumlarda hata alırsanız google’dan çözümleri
bulunabiliyor. Özellikle path ayarlarına dikkat etmenizi tavsiye ederim.
Postgres kullanıcısının da yapılmamışsa path ayarlarını
yapmanız gerekiyor.
Postgres kullanıcısı ile .bash_profile dosyasına aşağıdaki satırları ekliyoruz.
Postgres kullanıcısı ile .bash_profile dosyasına aşağıdaki satırları ekliyoruz.
PATH=$PATH:/usr/pgsql-9.2/bin
export PATH
export PATH
-------------------------------
Şimdi dataların master’dan slave sunucuya kopyalanması
zamanı geldi. Eğer master tarafta çok datanız varsa kopyalanma uzun sürecektir.
Slave sunucu olan node2’ye bağlanıp postgres kullanıcısı
ile;
mkdir
/var/lib/pgsql/9.2/data/pg_xlog
klasörünü açıyoruz.
klasörünü açıyoruz.
/var/lib/pgsql/9.2/data/recovery.conf
dosyasını oluşturup içine
standby_mode = 'on'
primary_conninfo = 'port=5432 host=172.25.6.28'
dosyasını oluşturup içine
standby_mode = 'on'
primary_conninfo = 'port=5432 host=172.25.6.28'
yazıyoruz. Sonrasında kopyalamayı başlatıyoruz.
repmgr -f /var/lib/pgsql/9.2/repmgr/repmgr.conf -D /var/lib/pgsql/9.2/data/ -d deneme -R postgres --verbose standby clone 172.25.6.28 &
Can't start backup: ERROR: a backup is already in progress
HINT: If you're sure there is no backup in progress, remove file "backup_label" and try again.
Hatasını alırsak node1’de
su -postgres
dd /var/lib/pgsql/9.2/data
rm backup_label*
su -postgres
dd /var/lib/pgsql/9.2/data
rm backup_label*
Kopyalama başarı ile tamamlanırsa node2’de root kullanıcısı
ile postgresql servisini başlatıyoruz.
/etc/init.d/postgresql-9.2 start
/etc/init.d/postgresql-9.2 start
------------------------
Her iki sunucuda da root kullanıcısı ile
mkdir /var/lib/pgsql/9.2/repmgr
ile repmgr klasörünü oluşturup bu klasörün içinde repmgr.conf dosyası oluşturuyoruz.
ile repmgr klasörünü oluşturup bu klasörün içinde repmgr.conf dosyası oluşturuyoruz.
Bu dosyanın içine Node1 için;
cluster=test
node=1
conninfo='host=172.25.6.28 user=postgres dbname=deneme'
cluster=test
node=1
conninfo='host=172.25.6.28 user=postgres dbname=deneme'
Node2 için;
cluster=test
node=2
conninfo='host=172.25.6.30 user=postgres dbname=deneme'
cluster=test
node=2
conninfo='host=172.25.6.30 user=postgres dbname=deneme'
Burada cluster=test satırında cluster için verdiğimiz adı
yazıyoruz. Ben test verdim, siz istediğinizi verebilirsiniz. Yeter ki iki
sunucuda da aynı isimli clusterlar olsun.
---------------------------------
Şimdi sunucuları register edelim.
Node1’de postgres kullanıcısı ile;
repmgr -f /var/lib/pgsql/9.2/repmgr/repmgr.conf --verbose master register
repmgr -f /var/lib/pgsql/9.2/repmgr/repmgr.conf --verbose master register
Node2’de postgres kullanıcısı ile;
repmgr -f /var/lib/pgsql/9.2/repmgr/repmgr.conf --verbose standby register
repmgr -f /var/lib/pgsql/9.2/repmgr/repmgr.conf --verbose standby register
------------------------------
Normal şartlarda işlemler sona erdi. Şu andan itibaren node1
üzerine yazdığınız veriler aradaki hattın hızına bağlı olarak hızlı bir şekilde
node2’ye de yazılmalıdır. Node2 read-only konumda olup sadece select sorguları
verilebilmektedir.
Senkronizasyon kontrolü için node2’de postgres kullanıcısı
ile;
repmgrd -f /var/lib/pgsql/9.2/repmgr/repmgr.conf &
komutunu çalıştırıyoruz.
repmgrd -f /var/lib/pgsql/9.2/repmgr/repmgr.conf &
komutunu çalıştırıyoruz.
Her iki sunucuda;
psql -x -d deneme -c "SELECT * FROM repmgr_test.repl_status” (test= cluster adı)
repmgr -f /var/lib/pgsql/9.2/repmgr/repmgr.conf cluster show
psql -x -d deneme -c "SELECT * FROM repmgr_test.repl_status” (test= cluster adı)
repmgr -f /var/lib/pgsql/9.2/repmgr/repmgr.conf cluster show
komutları ile durum izlemesi yapabiliriz.
Node1’den node2’ye olan kopyalama işlemi her commit işlemi
sırasında fdatasync çalıştırılarak yapılmaktadır. Eğer node2 aktif değilse
veriler archive dosyalarında saklanmakta, node2 aktif olduğunda bu dosyalardan
gerekli kopyalamalar yapılmaktadır. Yukarıdaki ayarlara göre bir archive
dosyası 16MB boyutunda olup max. 5000 archive dosyası saklanmaktadır. Yani
node2 aktif değilse ve node1 ile aralarındaki senkronize edilecek archive
dosyaları sayısı 5000’in üzerinde (80GB üzerinde) ise tekrar clone ile
node1’den node2’ye dosyaları kopyalama adımından aşağıda doğru işlemleri yapmak
gerekir.
Diyelim ki master taraf yani node1 gitti. Node2’yi read-only
konumdan çıkartıp normal şekilde açmamız gerekiyor.
Node2 tarafında
postgres kullanıcısı ile;
repmgr -f
/var/lib/pgsql/9.2/repmgr/repmgr.conf --verbose standby promote
komutunu yazıyoruz. Bu komut servisin tekrar kapanıp
açılmasını ve node2’nin master olmasını sağlıyor.
Node1 açıldığında her ikisi de master konumda olacaktır. Bu
nedenle node1’deki postgresql servisini durduruyoruz.
postgres kullanıcısı ile;
Öncelikle recovery.conf dosyası oluşturuyoruz.
/var/lib/pgsql/9.2/data/recovery.conf
dosyasını oluşturup içine
standby_mode = 'on'
primary_conninfo = 'port=5432 host=172.25.6.30'
Sonrasında;
repmgr -D $PGDATA -d pgbench -p 5432 -U postgres -R postgres --verbose --force standby clone 172.25.6.30
/var/lib/pgsql/9.2/data/recovery.conf
dosyasını oluşturup içine
standby_mode = 'on'
primary_conninfo = 'port=5432 host=172.25.6.30'
Sonrasında;
repmgr -D $PGDATA -d pgbench -p 5432 -U postgres -R postgres --verbose --force standby clone 172.25.6.30
komutunu çalıştırıp node2’nin clone’unu alıyoruz. Node2’deki
postgresql servisini yeniden başlatıyoruz.
/etc/init.d/postgresql-9.2
start
Bundan sonra node2 master, node1 slave olarak çalışmaktadır.
KAYNAKLAR:
https://github.com/greg2ndQuadrant/repmgr
https://github.com/greg2ndQuadrant/repmgr