21 Mayıs 2013 Salı

Coğrafi yedeklilik amacı ile Postgresql 'de repmgr ile hot_standby yedek alma


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

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

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

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/*

-----------------------------------------------

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
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.
PATH=$PATH:/usr/pgsql-9.2/bin
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.

/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'
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*

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

Bu dosyanın içine Node1 için;
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'

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
Node2’de postgres kullanıcısı ile;
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.

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


Hiç yorum yok:

Yorum Gönder