PostgreSQL’de Wal, Replikasyon ve Yedekleme Semineri – (Devrim Gündüz) Notlarım
Bilge Adam Yazılım Semineri kapsamında düzenlenen PostgreSQL’de Wal Replikasyon ve Yedekleme Semineri’ne katıldım.
Seminer konuşmacısı Türkiye’de PostgreSQL dediğimizde aklımıza ilk gelen kişi PostgreSQL Major Contributor ve #RHCE unvanlarına sahip Gündüz Bilişim Kurucusu Devrim Gündüzdü.
Daha önce konferanslarda da izleme fırsatı bulduğum Devrim Gündüz‘den eğitim alma imkanım olmamıştı.
Başlıktan da anlaşıldığı gibi PostgreSQL’de Wal, Replikasyon ve Yedekleme konu başlıklarında dolu dolu bir 4 saat geçirdim. Zamanın nasıl geçtiğini anlamadım.
PostgreSQL bilgim başlangıç seviyesinde ve bu bilgimi bir yazılımcı olarak ilerletmek istiyorum. Bu eğitim sayesinde PostgreSQL hakkında bilgiler edindim ve çok verimli oldu.
Ayrıca Bilge Adam’ın misafirperveliği içinde teşekkür ederim.
Eğitim kapsamında aldığım/alabildiğim notları paylaşmak ve kendime saklamak istiyorum.
Not: Aldığım notlarda yanlışlık/eksiklik olabilir bilginize.
WAL (Write Ahead Logging)
Wal : Transaction Loglarının yazıldığı kaydedilmesidir.
- Kesinlikle el ile silmeyeceğiz.
- Wal veri kaybını önlemek için tasarlanmıştır.
- 16 mb’lık dosyalarda tutulur.
- Veri dosyaları her transaction’da değiştirilmez. O nedenle performans artışı olmasına katkı sağlar.
- PostgreSQL’de yapılan her işlem bir transactiondur. O nedenle transaction iptal olsa bile Wal’a kaydedilir.
- Varsayılan olarak Wal boyutu 1 GB’tır.
- Tüm sorgular Shared Buffer’da gerçekleşir.
- Ramdeki bir veri disktekindeyken farklı ise buna Dirt Buffer diyoruz.
- Dirty Buffer’leri bgwriter ya da checkpointler sayesinde diske yazıyoruz.
WAL: LSN Log Sequence Number
- Wal kaydının içerisindeki yerini bildirir sayıdır.
- 64-bit tamsayı.
- Bu sayı sayesinde veritabanı sunucularının çökme durumunda kayıp veri varsa kurtarma esnasında page LSN ve Wal’deki LSN’ler karşılaştılır. Büyük olan hangisi ise tam veri oradadır.
- Bir wal kaydını bgwriter ya da checkpointler diske yazarken zarar görebilir. Tam yazma anında sistem çöktüğü anda diskin üzerinde bulunan page’de bozulur. Her checkpoint sonrasında her sayfa değiştiğinde sayfanın kopsayı Wal’a yazılır. Ve bu sayede veri kurtarılmış olur.
- Yarım kalırsa Full-page image yapar ve backup block olur.
Replikasyon ve PG 12 Yenilikleri
- Önceki sürümlerde bulunan Recovery.conf PostgreSQL’de kaldırıldı. Çoğu parametre artık Pgconfig’de yazılıyor.
- Bazı recovery ile ilgili parametreler artık restart etmeden değiştirilebiliyor.
- Auto.conf’ta yazılan ayarlamalar postgresql.conf’da yazılan ayarlamaları ezmektedir.
- Primary yazılabilen ve okunabilen yapıdadır.
- Standby sadece okunabilen yapıdadır.
- Teorik olarak 2^32 adet stanby oluşturabiliriz.
- Replikasyon yaparken kapatmaya gerek yok.
Replikasyon Hazırlıkları
- PostgreSQL kurulumu
- Primary sunucu yapılandırılması
- Replikasyon yetkisine sahip kullanıcı oluşturmak
- Replikasyon slot kavramı
- pg_basebackup
- Postgresql.conf Değişiklikleri
listen_adresses = 'localhost'
Code language: JavaScript (javascript)
satırında;
listen_adresses = *
olarak değiştiriyoruz ve sunucuyu yeniden başlatıyoruz.
Kontrol etmek için aşağıdaki komutu yazalım ve sonucuna bakalım.
postgres=# show listen_addresses;
listen_addresses
----------------
*
(1 row)
Code language: PHP (php)
Konfigürasyonumuz düzgün çalışıyor.
- Kullanıcı Oluşturma
Kullanıcı ya sadece replikasyon yetkisi vereceğiz.
postgres=# CREATE ROLE replicationuser encrypted password 'sifre' LOGIN REPLICATION;
Code language: PHP (php)
Varsayılan olarak gelen postgres kullanıcı SUPER ADMIN yetkisine sahip olduğu için replikasyon rölünü bu kullanıcıdan alıyoruz.
postgres=# ALTER ROLE postgres NOREPLICATION ;
Code language: PHP (php)
Bu kullancıya bağlanma yetkisi vereceğiz. Nasıl olduğunu daha önce yazmıştım. (Buradan) Bu işlemi yaptıktan sonra yeniden başlıyoruz.
Yazdığımız rolün geçerli olması için reload yapmamız gerekiyor. Bu kod;
postgres=# select pg_reload_conf();
Code language: PHP (php)
Yapılandırma dosyasının geçerli olup olmadığını görmek için ise;
postgres=# select * from pg_hba_file_rules;
Code language: PHP (php)
- Root kullanıcısıyla kesinlikle işlem yapılmayacak.
Replikasyon yapılacak makinede yedekleme işlemini başlatıcağız.
/usr/pgsql-12/bin/pg_basebackup -D /var/lib/pgsql/12/repdata -Fp -X stream -C -S neswlot1 -c fast -h ip_adress -p 5432 -R -U replicationuser -P
Code language: JavaScript (javascript)
Parametrelere bakalım.
- -D: Datanın bulunduğu dizini verir.
- -Fp: 2 farklı yedekleme şekli bulunmaktadır. Sıkıştırılmış ve Full. Burada full alıyoruz.
- -h: Bağlanacağımız primary sunucusunun host adı.
- -p: Port numarası.
- -U: Kullanıcı adı.
- -P: İşlem yüzdesini gösterir.
- Standby sunucusunda veritabanı oluşturmuyoruz.
- İşlem Senkron ya da Asenkron yapılabilir.
No Comment! Be the first one.