PostgreSQL Veri Tabanı Yedeklemesi

Merhabalar,

İş hayatıma sadece Solaris Unix değil aynı zamanda Veritas çözümleriyle de başladığımdan, yedekleme çözümlerinin yeni teknolojileri ne kadar hızlı ve ne kadar etkin bir şekilde destekleyebildiğini takip etmekten ve araştırmaktan geri duramıyorum. 😊

Zarar gören Oracle veri tabanlarını yedeklerden geri döndürmeye çalıştığımız veri merkezinde sabahladığımız o günleri de açıkcası anımsamaktan kendimi alamıyorum. Bir şekilde veri kaybı yaşamadan veri tabanlarını açmayı başarırdık ama o stresli anlarda ömrümüzden ne kadar gün gittiğini tahmin edemezsiniz. Elbette günümüzde geri dönüş stratejileri ve yöntemleri çok daha kolay hale geldi. Teknolojiyi geliştirenlere teşekkür etmek lazım.

Bugün size PostgreSQL yedeklerimizi nasıl en etkin ve ihtiyaç halinde veri kaybı olmadan geri dönülebilir şekilde alabilirizle ilgili bir aktarım yapmak istiyorum.  Hepimizin bildiği gibi, PostgreSQL, 35 yılı aşkın aktif geliştirme süreciyle güçlü bir güvenilirlik, özellik sağlamlığı ve performans ünü kazanan etkin açık kaynak nesne-ilişkisel veri tabanı sistemidir.

Yedekleme stratejisini en uygun şekilde yapılandırabilmek için önce yedeğini alacağımız sistemi iyi tanımamız gerekir.  PostgreSQL yedekleme sürecimizin amacına ulaşması için bilmemiz gereken en önemli konulardan birisi WAL (Write Ahead Log) kayıtlarıdır.

PostgreSQL, veri tabanında yapılan her değişikliği kaydeden bir kayıt sistemi kullanır; bu sistem “WAL” (Write Ahead Log) olarak adlandırılır. WAL dosyaları, olası bir sistem çökmesi durumunda veri tabanını son tutarlı durumuna geri getirmek için kullanılır. Bu dosyalar, veri tabanının güvenliğini sağlamak için çok önemlidir.

Bilmemiz gereken diğer önemli bir terim ise, “checkpoint”tir diyebilirim. PostgreSQL’de “checkpoint” terimi, veri tabanı sisteminde önemli bir rol oynar ve veri tabanının sağlıklı çalışmasını destekler. Bir checkpoint, PostgreSQL’in belli aralıklarla gerçekleştirdiği bir işlem sürecidir ve şu işlevlere sahiptir:

Veri Yazma: Checkpoint sırasında, bellekte (RAM) tutulan değişiklikler diske yazılır. Bu, bellekte bekleyen tüm değişikliklerin ve güncellemelerin veri tabanı dosyalarına sabitlenmesini sağlar.

WAL Dosyaları Temizliği: WAL dosyaları sürekli büyüyen bir yapıdadır ve bu dosyaları belirli bir boyuta ulaştıklarında kesmek gerekir. Checkpoint’ler, bu WAL dosyalarını kesmek için bir referans noktası sağlar, böylece eski dosyalar silinebilir veya arşivlenebilir. Bu, disk alanının verimli kullanımını sağlar.

Sistem Çökmesi Durumunda Kurtarma: Sistem çöktüğünde ve yeniden başlatıldığında, PostgreSQL en son checkpoint’ten itibaren WAL kayıtlarını kullanarak veri tabanını kurtarır. Bu, çökme anında henüz diske yazılmamış olan tüm veri değişikliklerinin uygulanmasını garanti eder.

Yaptığım detaylı araştırmalar sonucunda, PostgreSQL yedeklerimizi almak için en uygun aracın, pgBackRest olduğu görülüyor. Öyle bir yazılıma ihtiyacımız var ki bu yazılım/araç, “full”, “incremental” ve “differential” yedek alabilmelidir. Bu yedekleme türlerinin ne olduğunu hatırlayalım.

Tam Yedekleme (Full Backup): Veri setinizin tamamının eksiksiz bir kopyasıdır.

Diferansiyel Yedekleme (Differential Backup): Son tam yedeklemeden bu yana değişen tüm verileri içerir. Bu, yedekleme süresinin biraz daha uzun olmasına neden olur, ancak daha hızlı bir geri yükleme sağlar.

Artımlı Yedekleme (Incremental Backup): Yalnızca son tam veya diferansiyel yedeklemeden bu yana değişen dosyaları yedekler, bu da hızlı bir yedekleme süresi sağlar. Ancak, belirli bir zaman noktasına geri yüklemek için, alınan sıraya göre her artımlı yedeklemeyi geri yüklemeniz gerekir.

pgBackRest, bu yedekleme türlerini destekler.

pgBackRest, PostgreSQL veri tabanlarını geri yüklemek için iki yöntem sunar: tam geri yükleme ve delta geri yükleme.

Tam Geri Yükleme (Full Restore): Bu işlem, hedef PostgreSQL dizininin boş olmasını gerektirir. Yani, tam bir geri yükleme yapılacaksa, hedef klasörde başka veri olmamalıdır.

Delta Geri Yükleme: Bu yöntem daha akıllıdır. PostgreSQL veri dizininde zaten var olan dosyaları tanır ve yalnızca gerekli dosyaları günceller. Bu, gereksiz tekrarları önleyerek zaman kazandırır.

pgBackRest, yedek dosyalarını saklamak için uzak depolama alanlarını ve hatta bulut hizmetlerini destekler. AWS S3, Google Cloud Services Cloud Storage ve Azure Blob Storage gibi bulut tabanlı hizmetler kullanılabilir. Yani, yedeklerinizi güvenli ve erişilebilir tutmak için bu tür modern çözümleri kullanabilirsiniz.

Ayrıca, pgBackRest çok çekirdekli işlemci desteği ile paralel yedekleme yapabilir ve verileri sıkıştırabilir. Bu, yedekleme sürecini hızlandırır ve depolama alanından tasarruf sağlar. Varsayılan olarak, yedeklerin bütünlüğü, kontrol toplamları (checksums) ile doğrulanır ve ek güvenlik için kaydedilen dosyalar şifrelenebilir.

pgBackRest, veri tabanını geçmişteki belirli bir noktaya geri yükleyebilir. Bu, veri tabanına erişilemediği veya verilerin bozulduğu durumlarda çok yararlıdır. Noktadan noktaya geri yükleme (point-in-time recovery) kullanarak, bir veri tabanı yöneticisi, veri tabanını son bilinen iyi duruma geri getirebilir.

Son olarak, pgBackRest, PostgreSQL veri tabanlarını farklı bir PostgreSQL örneğine veya ayrı bir veri dizinine geri yükleyebilir. Bu özellik, veri tabanınızı esnek bir şekilde yönetmenize olanak tanır ve örneğin, farklı bir sunucuya taşınma gibi durumlar için idealdir.

Yani, pgBackRest, PostgreSQL için oldukça güçlü ve esnek bir yedekleme ve geri yükleme çözümüdür. Özellikle büyük ve kritik veri tabanları için, bu tür bir aracın kullanılması, olası veri kayıplarına karşı sizi koruyabilir ve iş sürekliliğini sağlamada büyük bir yardımcı olabilir.

Yedekleme mimarisini oluştururken, kesinlikle, pgBackRest’i ayrı bir sistemde tutmayı öneriyoruz. Yani veri tabanı cluster içinde olmaması önemli. Ek olarak, PostgreSQL Cluster içinde, gereksiz yere “primary node”u yormanızı da önermiyoruz. pgBackRest’in “Hot standby” üzerinden yedekleri alacak şekilde  konfigürasyonunu öneriyoruz.

Hatta aşağıda olan görseli de eklemeden edemedim.

Bu kullanışlı senaryo, birden fazla bulut üzerinde ve yerelde özel bir yedekleme sunucusunda bir depo oluşturmaktır. Eğer bir bulut sağlayıcısı erişilemez durumda ise, yedek diğer bulutlardan veya yerel depodan alınabilir.

Evet, düşündüğünüz gibi, pgBackRest, PostgreSQL veri tabanlarının yedeklenmesi ve kurtarılmasında WAL kayıtlarını kullanır.

pgBackRest ve WAL kayıtları arasındaki ilişkinin kritik noktaları nelerdir?

WAL Kayıtlarının Yedeklenmesi:

pgBackRest, veri tabanı değişikliklerini kaydetmek için WAL kayıtlarını kullanır. Yedekleme işlemi sırasında, pgBackRest hem veri tabanı dosyalarını hem de o anki WAL segmentlerini yedekler. Bu, veri tabanının tam ve tutarlı bir kopyasını oluşturmak için gereklidir.

Noktadan Noktaya Kurtarma (Point-in-Time Recovery):

pgBackRest, belirli bir zamana kadar olan veri tabanı durumunu geri yüklemek için WAL kayıtlarını kullanabilir. Bu özellik, veri tabanında meydana gelen istenmeyen değişikliklerin veya hataların düzeltilmesi gerektiğinde çok değerlidir.

Örneğin, bir kullanıcı yanlışlıkla veri tabanındaki önemli bir tabloyu sildiğinde, pgBackRest ile yedekten önceki son iyi duruma kadar veri tabanını geri yükleyebilirsiniz.

WAL Arşivleme:

pgBackRest, sürekli WAL arşivleme yeteneğine sahiptir. Bu, PostgreSQL sunucusunun WAL dosyalarını belirtilen bir depolama konumuna sürekli olarak kaydetmesi anlamına gelir. Bu özellik, veri tabanının sürekli olarak güncel bir yedeğinin bulunmasını sağlar ve daha kapsamlı felaket kurtarma senaryoları için önemlidir.

Yüksek Erişilebilirlik ve Felaket Kurtarma:

pgBackRest’in WAL kayıtlarını kullanma yeteneği, yüksek erişilebilirlik ve kapsamlı felaket kurtarma çözümleri oluşturulmasına olanak tanır. Örneğin, pgBackRest, birincil veri tabanı sunucusu arızalanırsa, bir yedek (standby) sunucuyu hızlı bir şekilde devreye alabilir.

Görüldüğü gibi, pgBackRest, PostgreSQL veri tabanı yedekleme ve kurtarma çözümü olarak WAL kayıtlarının arşivlenmesi ve yönetimi konusunda geniş destek sunar.

pgBackRest, WAL arşivleme işlemlerini yönetmek için çeşitli ayarlar sunar. Bu ayarlar arasında, arşivleme komutlarını belirleme, arşivlenmiş WAL dosyalarının depolanacağı yeri seçme ve arşivleme sıklığını ayarlama bulunur.

pgBackRest, WAL dosyalarını yerel disklerde, NFS montajlarında veya bulut hizmetlerinde (AWS S3 gibi) saklama yeteneğine sahiptir. Bu esneklik, veri tabanı yöneticilerine ihtiyaçlarına göre en uygun depolama çözümünü seçme olanağı tanır.

Bu özellikler sayesinde, pgBackRest kullanıcıları, PostgreSQL veri tabanlarının yedeklenmesi ve kurtarılması süreçlerinde gelişmiş kontrol ve esneklik elde edebilir. WAL kayıtlarının etkin bir şekilde yönetilmesi, veri tabanının hızlı ve güvenilir bir şekilde kurtarılmasını sağlar.

Internet üzerinde pgBackRest ile PostgreSQL’in yedeklerinin alınmasına dair detaylı konfigürasyon bilgileri içeren faydalı kaynaklar mevcut. İncelediklerimin linklerini kaynakça bölümüne ekledim. Bu konuda geniş bir dökümantasyon mevcut. Benim önerim konfigürasyon detaylarını iyi anladıktan sonra, test ortamınızda yedekleme, geri dönüş senaryolarını test ederek, üretim ortamında yedekleme, geri dönüş, felaket kurtarma senaryolarını otomotize etmeniz olur. Yedekleme stratejilerinize göre belirleyeceğiniz sıklıkta geri dönüş, felaket kurtarma senaryolarını test etmeniz, sıkıntı anında elinizi rahatlatacak size zaman kazandıracaktır.

Sarav Asiye Yiğit – 5 Mayıs 2024

Kaynakça:

https://www.postgresql.org

https://www.postgresql.org/docs/current/tutorial-arch.html

https://www.postgresql.org/docs/8.1/backup-online.html

https://www.prisma.io/dataguide/postgresql/getting-to-know-postgresql#postgresqls-client–server-architecture

https://docs.percona.com/postgresql/14/solutions/backup-recovery.html#pgbackrest

https://www.percona.com/blog/what-if-the-backup-server-is-down-and-a-backup-is-needed-multi-repo-functionality-of-pgbackrest

https://samilekesiz.medium.com/pgbackrest-kurulum-ve-konfig%C3%BCrasyonu-ayn%C4%B1-sunucu-%C3%BCzerinde-d84bb1e5986f

https://public.dalibo.com/exports/conferences/20180712_pgdayAmsterdam_pgBackRest/20180712_pgdayAmsterdam_pgBackRest.pdf

https://medium.com/machine-learning-t%C3%BCrkiye/pgbackrest-kurulumu-ve-kullan%C4%B1m%C4%B1-3974af991ee6

https://commandprompt.com/blog/getting-started-with-pgbackrest-perform-your-first-backup

https://pgbackrest.org/configuration.html