Ezgi Karahan
5 min readNov 21, 2023

Postgresql Sihirbazlığı

Merhaba , varolan postgresql veritabanında yaşanan performans problemlerinden dolayı , veritabanını daha performanslı hale getirmek için gerçekleştirdiğimiz sihirin adımlardan bahsedeceğim 🧚‍♀️

Postgresql, güçlü özellikleri ve esnekliği ile bilinen açık kaynaklı bir ilişkisel veritabanı yönetim sistemidir. Önceden planlanan veya sonradan şekillenen bazı database clusterlarında istenen karşılanmaz , bu sebeple ihtiyaçlara ve isterlere göre clusterlar şekillendirilebilir.

Peki bizim yaşadığımız case neydi ?

Varolan clusterımızda data boyutu 2.3 tb , idle connection sayısı çok fazla ve cpu kullanımı oldukça yüksek (16 core cpuda %90) kaynak tüketimi sağlarken uygulama bazında iyileştirmeler yapılamayacağına developer ekibi ile karar verip , database boyutunda neler yapabilirizi konuştuk.

Postgresqli advance seviyede kullanabilmek için clusterda version upgrade ile postgresqlin partitioning özelliğini kullanarak ve pgbouncer pooling yöntemi ile birleştirerek yüksek performanslı bir veritabanı yapısı oluşturmayı ele aldık.

Uygulama ekibi ile birlikte önce tabloları ve tablo boyutlarını revize ettik. Atıl tablolar silinecek , güncel olmayan datalar arşivlenicek ve varolan dataları partititon alt yapısı ile parçalıyacaktık.

Partitioning, büyük veri kümelerini küçük parçalara bölmek ve performansı artırmak için kullanılan bir tekniktir.

Data küçültme işlemi üzerinde çalışırken çok fazla idle connection , locklanmalar tarzı işlemler gördük. Bununda önüne geçebilmek için pgbouncer alt yapısını kurmaya karar verdik.

Pgbouncer ise Postgresql veritabanı sunucusuna gelen poolingleri yönetmek için kullanılan bir proxydır.

PostgreSQL 12.12 version olan clusterıda aynı zamanda 14 için upgrade ettik.

PostgreSQL version upgrade ise performans iyileştirmeleri, güvenlik açıklarının kapatılması , yeni özelliklere erişim, destek süresi ve uyumluluk açısından önemlidir.

Yapıcağımız değişikliklerin bize kazandırdıkları ile ilgili detaylar 👇

Peki biz partitioning ile neler yaptık ?

Partitioning, verileri mantıksal olarak bölerek tabloları küçük parçalara ayırmak anlamına gelir bu işlemde veritabanı tablolarını yönetirken daha etkili veri erişimi, daha hızlı sorgu performansı ve veri yönetiminde kolaylık sağlar . Toplu işlemlerdeki vacuum yükünüde tamamen ortadan kaldırır.

Range partition işlemi, özellikle tarih alanı üzerinden yapılan partitionlarda çok kullanışlıdır. Tarih alanına göre koşulumuz olduğu için range partition tercih ettik.

Yukarıdaki tabloda örnek verdiğim gibi eski bulunan clusterdaki data boyutu çok büyük ve sadece 2 tablodan oluşuyordu. Data modeline göre haftalık olarak datayı parçalayabilirdik ve parçalayarak 31 aktif tablo ile devam ettik. Burada dikkat edilmesi gereken konu ise partition yaptığınız alana göre where koşulu olması.

Range partitioning entegrasyonu bi önceki yazımda mevcut , inceleyebilirsiniz 👀

Pgbouncer nedir ve niçin kullanılır ?

PgBouncer, Postgresql sunucusu ile istemci arasında yer alan bir connection pooling yöntemidir . Veritabanı sunucusuna gelen bağlantıları yöneterek performansı artırır.

Pgbouncer, multiclient arasında connectionları paylaşır ve veritabanı sunucusuna olan connection sayısını optimize eder.

Yüksek trafikli uygulamalarda pgbouncer kullanmak, veritabanı sunucusu üzerindeki yükü azaltır ve daha iyi bir performans elde etmenizi sağlar.

Data boyut azaltmanın sağladığı avantajlar nelerdir ?

Veritabanı boyutunun önemli ölçüde azalması, depolama alanında büyük bir tasarruf sağlar.

Arşiv clusterı kurarak aktif olarak kullanılmayacak dataların arşivlenmesi sağlandı ve aktif data boyutu azaltıldı. 2.3 TB yerine 65 GB boyuta sahip bir veritabanı, depolama maliyetlerini önemli ölçüde azaltır. Daha küçük bir veritabanı, daha az disk alanı gerektirir ve depolama maliyetlerini minimize eder.

Yedekleme ve geri yükleme süreleri de kısalır. Daha küçük bir veritabanı, daha hızlı backuplama işlemleri gerçekleştirebilir ve verilerin restore süreleri daha hızlı olur. Bu da iş sürekliliği açısından önemlidir ve veritabanının onarım sürelerini azaltır.

Sorgu performansını iyileştirme potansiyeli taşır. Sorguların daha hızlı çalışması ve responsetimeların azalması beklenir.

Verilerin indekslenmesi, güncellenmesi ve sorgulanması daha hızlı ve daha verimli olabilir. Veri bütünlüğü ve veritabanı performansını yönetmek daha kolay hale gelir.

Verilerin işlenmesi, analiz edilmesi ve raporlanması daha verimli bir şekilde gerçekleştirilebilir. Bu da raporlama için avantaj sağlar.

Pgbouncerın sağladığı avantajlar nelerdir ?

Yüksek bağlantı sayısı, veritabanı sunucusunun kaynaklarını yoğun bir şekilde kullanır. Pgbouncer kullanarak connection poolingi etkinleştirerek, connectionları daha verimli bir şekilde paylaşabilir ve kaynak kullanımını optimize edebilirsiniz. Bu, veritabanı sunucusunun daha fazla sorguya yanıt verebilmesini ve daha iyi performans göstermesini sağlar.

Daha düşük connection sayısı, daha fazla ölçeklenebilirlik sağlar. Pgbouncer, bağlantıları paylaşarak daha fazla istemciye hizmet edebilir ve daha fazla talebi karşılayabilir. Bu, uygulamanızın büyümesi durumunda daha kolay bir şekilde ölçeklendirilebilmesini sağlar.

Connection pooling , veritabanı sunucusunda planlı veya beklenmedik bir durum olduğunda iş sürekliliğini sağlar.

Daha düşük bağlantı sayısı, bellek ve diğer kaynakların tasarruflu kullanılmasını sağlar. Her bağlantı, bellek ve işlemci kaynakları gerektirir. Bu nedenle, bağlantı sayısını azaltarak daha az kaynak tüketimi elde edebilir ve maliyetleri düşürebilirsiniz.

Çalıştığımız eski cluster yapısındaki veritabanında aktif connection sayısını 247 iken pgbouncer altyapısı ile yeni clusterda aktif connection sayımızı 17'ye düşürebildik. Tanımladığımız avantajları etkisinide görmüş olduk.

Pgbouncer bulunmayan eski clusterda aktif connection sayısı :

Pgbouncer create edilen yeni clusterda aktif connection sayısı :

Haftalık partitionun sağladığı avantajlar nelerdir ?

Haftalık tablo partitioning seçmemizin sebebi tamamen businessa özel bir durum . Bir tabloyu haftalık olarak bölmek, sorguların daha küçük parçalara ve daha küçük veri setlerine uygulanmasını sağlar. Bu da sorgu responsetimeını azaltır. Özellikle haftalık geçmiş verilere yönelik sorgulamalar yapıldığı için, yalnızca ilgili partitionı tarayarak sorgu performansının iyileşmesini gözlemledik.

Her partition, belirli bir haftaya ait verileri içerir ve bu şekilde veri yönetimi daha organize olur. Verileri partitionlar arasında taşımak, silebilmek veya arşivlemek daha kolaydır. Ayrıca, eski verileri daha kolay bir şekilde temizleyebilirsiniz.

Haftalık partitionlar, iş sürekliliği ve veritabanı bakımı açısından avantaj sağlar. Bir partition üzerinde yapılan işlemler, diğer partitionları etkilemez. Bu da bakım ve güncelleme süreçlerini daha esnek hale getirir ve kesintisiz bir hizmet sunar.

Partitioning ve pgbouncerın beraber kullanımının avantajları nelerdir ?

Yüksek performanslı bir veritabanı yapısı oluşturmak için postgresql partitioning ve pgbouncerı beraber kullanabilirsiniz.

Partitioning, verileri küçük parçalara böler ve sorgu performansını artırırken veri yönetimini kolaylaştırır. PgBouncer ise veritabanı sunucusuna gelen bağlantıları yöneterek performansı optimize eder.

Bu iki teknolojiyi birleştirerek, veritabanı uygulamanızın performansını artırabilir ve ölçeklenebilir bir yapı oluşturabilirsiniz.

Eski clusterdaki kaynak kullanımları :

Yeni clusterdaki kaynak kullanımları :

Bu çalışmada data büyüklüğünden kaynaklı query performans sorunlarından dolayı cpu %100e çıkmalarıyla ve çok fazla idle connection sorgularla karşılaştığımız için pgbouncer ve partition altyapısını kurmaya karar verdik. Data boyutundan dolayı database yönetimi ve query performanslarında zorluk yaşadığımız için kullanılmayan dataların arşivlemesine karar verip tüm işlemleri yaptıktan sonra , clusterlar arasındaki kaynak kullanımı ve query responsetimelarında ciddi bi oranda iyileşme gördük. 🪄

Yukardaki grafiklerden kaynak kullanımlarına göz atabilirsiniz.

Hoşçakalın 🥀

Referans