PostgreSQL Logical Replication ile Online Database Upgrade Yaklaşımı
Merhabalar, bu yazımızda birçok veritabanı ve sistem yöneticisinin belirli aralıklarla gerçekleştirdiği ve gerçekleştirmek durumunda olduğu bir işlemden bahsetmek istiyorum. Database upgrade işlemi hem çok zorlu hem de çok fazla araştırma ve okuma gerektiren bir işlemdir. Bu nedenle sürüm yükseltme işlemlerinden önce hazırlık önemlidir.
Bu çalışmada kullanacağımız veritabanı PostgreSQL olsada bunu imkan verdiğince kullandığımız tüm veritabanı teknolojilerinde açıklamaya çalışacağım. Bu çalışmada, hiçbir kesintiye maruz kalmadan(mümkün olduğunca) PostgreSQL veritabanı sürümünü yükseltmek için çabalayacağız.
Normal şartlar altında, bir PostgreSQL veritabanın sürümünü yükseltmek için pg_upgrade aracı kullanılmaktadır. Bu araçta mevcut veritabanı sisteminin kapatılmasını ve kapatıltıktan sonra pg_upgrade çalıştırılmasını önermektedir. Bu nedenle upgrade işlemlerindeki risk her zaman yüksektir. PostgreSQL üzerinde de bu riski azaltmanın ve işlemleri daha kolay gerçekleştirmenin yolları mevcuttur. PostgreSQL upgrade işlemi için, logical replication kullanacağız. Bu sayede, kesintisiz ve riski minimize edilmiş bir şekilde upgrade yapabileceğiz. Çalışma ortamına ait bilgiler aşağıdaki gibidir.
Çalışma Ortamı
- PostgreSQL 11 (Kaynak sistem)
- PostgreSQL 13 (Hedef sistem)
Upgrade senaryosunda, mevcut olarak çalışmaya devam eden PostgreSQL 11 sürümüne sahip bir veritabanından PostgreSQL 13 versiyonuna sahip bir veritabanına logical replication başlatacağız. Sonrasında kontrollerini yapıp upgrade işlemini tamamlamış olacağız.
PostgreSQL Logical Replication Yapılandırması
PostgreSQL’in özellikle son sürümlerde geliştirilmekte olan ve çok fazla esneklik sağlayan bir replikasyon yöntemidir logical replication. Bu sayede, upgrade bile yapabiliyoruz :) Sistemdeki logical slot üzerinden WAL dosyalarını kullanarak veri karşı tarafa stream olarak replike edilmektedir.
Tabi bunun yapılabilmesi için bazı ön koşullar mevcuttur. Sistemde bu işlemi yapmadan önce aşağıdaki maddelerin uygun olduğundan emin olmamız gerekmektedir.
Kaynak Sistem PostgreSQL Konfigürasyon Gereksinimleri
- wal_level : logical
- max_wal_senders: 1(minimum)
- max_replication_slots: 1(minimum)
Bu konfigürasyonlar, PostgreSQL seviyesinde veritabanına uygulanmalıdır. Eğer bu ayarlar daha önceden yapılmadıysa veritabanı seviyesinde restart işlemi gerekecektir. Bunu da servisi restart ederek yapabilirsiniz.
Konfigürasyonları değiştirmek için PostgreSQL üzerinde aşağıdaki komutlar çalıştırıldıktan sonra restart işlemini gerçekleştirebiliriz.
ALTER SYSTEM SET listen_addresses TO ‘*’;ALTER SYSTEM SET wal_level TO logical;ALTER SYSTEM SET max_wal_senders TO 5;ALTER SYSTEM SET max_replication_slots TO 5;
ctl ile restart etmek için :
/usr/pgsql-11/bin/pg_ctl -D /postgresql-data-dizini restart
servis ile restart etmek için :
sudo systemctl restart postgresql-11
Bu işlemler bittikten sonra kaynak sistemimiz artık upgrade için hazır demektir. Bu ayarlamalar ile birlikte sistemde artık logical replication kullanılabilir hale getirilmiştir.
Hedef Sistemde PostgreSQL Ortamının Hazırlanması
Hedef sistemde ise, yeni bir PostgreSQL veritabanı kurulacaktır. Bu kapsamda aşağıdaki bash scriptleri ile birlikte PostgreSQL 13 veritabanı kurulumu yapabilir.
sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpmsudo yum install postgresql13-server postgresql13 -ysudo /usr/pgsql-13/bin/postgresql-13-setup initdbsudo systemctl enable postgresql-13.servicesudo systemctl start postgresql-13.service
Bu işlemlerden sonra kaynak sistemde yapılan konfigürasyon adımlarının burada da yapılması gerekmektedir. Kaynak Sistem PostgreSQL Konfigürasyon Gereksinimleri başlığı altındaki işlemleri tekrar edebilirsiniz.
PostgreSQL Logical Replication Yapılandırılması
Veritabanı üzerindeki upgrade işlemini gerçekleştirmek için, temelde veriyi logical replication ile karşı tarafa transfer edeceğiz ve sürekli hedef sistemi güncel tutacağız. Ancak veritabanında sadece tablolara ait veriler transfer edileceği için diğer tüm nesneler kontrol edilmelidir. Bu kısım biraz önem kazanıyor. Yani veritabanı üzerinde bulunan;
- Extension
- View/Materialized View
- Schema Yapıları
- Rol ve Kullanıcılar
- Erişim Yönetimi(pg_hba.conf)
konuların kesinlikle kontrol edilmesi ve bu nesnelerin hedef sistemde gerekli ise oluşturulması ayarlanması gerekmektedir. Tekrar belirtmekte fayda var; biz sadece tablolar arasındaki veri transferini sağlıyoruz. Upgrade için online, güvenilir ve riski en az yöntem budur.
Logical Replication’ı gerçekleştirebilmek için önce kaynak sistemde publication oluşturulması gerekmektedir. Aşağıdaki komut ile kaynak sistemde bulunan ilgili veritabanı üzerinde publication oluşturulmaktadır.
CREATE PUBLICATION db_upgrade FOR ALL TABLES;
Not: Upgrade yapacağımız için burada tüm tablolar migrate edilecek olarak hesap edilmiştir. Eğer başka bir senaryo var ise, ilgili tablolar için ayrı publication’lar oluşturulabilir.
Daha sonrasında, hedef sistemde kaynak sistemdeki şema yapısı kopyalanır. Bunun için pg_dump aracı kullanılabilir. pg_dump aracı ile birlikte kaynak sistemin sahip olduğu iskeleti hedef sisteminde oluşturmamız gerekmektedir.
Not: Bu adım öncesi veritabanındaki gerekli tüm extensionlar ve kullanıcılar gibi tablo dışındaki nesnelerin doğru bir şekilde ayarlandığından emin olmamız gerekiyor.Bu adımda bu işlemlerin tamamlandığını varsayarak çalışmamıza devam ediyoruz.
pg_dump -h ip_1 -p 5432 -d adventureworks -Fc -s -U postgres | pg_restore -d adventureworks -h ip_2 -p 5432 -U db_upgradeuser
Bu işlemden sonra, hedef sistemde aşağıdaki veritabanı sorgusu ile tablolarımızın ve şema iskeletimizin durumunu kontrol etmemiz gerekiyor. Kaynak sistem ile burasını karşılaştırmamız gerekiyor.
SELECT table_schema,table_nameFROM information_schema.tablesWHERE table_schema not in (‘pg_catalog’,’information_schema’)ORDER BY table_schema;
Görüleceği üzere, kaynak sistemdeki verilerimiz henüz hedef sistemde mevcut değil ancak şema iskeletleri tamamlandı.
Logical replication’ı başlatmak için bir önceki adımlarda publication oluşturmuştuk kaynak sistem üzerinde. Bunun tamamlanması için hedef sistemde SUBSCRIPTION oluşturulmalıdır. Bu işlem için hedef sistemde ve veritabanında aşağıdaki şekilde komut çalıştırılmalıdır.
CREATE SUBSCRIPTION db_upgrade_subscribe CONNECTION ‘host=kaynak_sistem_ip dbname=adventureworks user=yetkili_kullanıcı password=pass_some port=pg_servis_port’ PUBLICATION db_upgrade;
Bu işlemden sonra, veriler hedef sunucuya replike edilmeye başlayacaktır ve online olarak devam edecektir. Yeni gelen kayıtlar da veritabanına anlık olarak yazılacaktır. Yeni PostgreSQL ortamımız versiyon 13 ile çalışmaktadır. Böylece upgrade işlemi veritabanı seviyesinde artık tamamlanmıştır. Logical replication’ın çalışıp çalışmadığını ise pg_replication_slots ve pg_stat_replication viewları üzerinden kontrol edebiliriz.
select * from pg_replication_slots;
select * from pg_stat_replication;
Bu işlemler sonucunda;
- Herhangi bir kesinti yapmadan PostgreSQL sürümü versiyon 11'den versiyon 13'e yükseltilmiştir.
- pg_upgrade tarzı araçlarla çalışmadığımız için bu ve benzeri yaklaşımlardaki risklerden kurtulmuş olduk.
- İşlemler online ve arka planda yapıldığı için operasyon zamanı ve operasyon süresi nedeniyle oluşabilecek zorluklardan ve etkilerden kurtulmuş olduk
Ancak bu işlem her senaryoya uygun olmayabilir. Önemli olan nokta veritabanı içerisindeki nesnelerin ve ihtiyaçların analiz edilmesidir. Doğru analiz sonucu upgrade senaryosunu bu yöntem üzerine kurgulamak gerekmektedir. Bununla birlikte logical replication’ın desteklediği ve desteklemediği durumlar resmi PostgreSQL belgelerinden kesinlikle kontrol edilmelidir.
PostgreSQL 11 Logical Replication Kısıtlamaları ve Limitleri
- Large object diye adlandırılan nesneler replike edilemez.(https://www.postgresql.org/docs/11/largeobjects.html)
- Sequence olan objeler replike edilemez. Sadece tablo içerisindeki değerler replike edilir. Hedef sistemdeki sequence değeri asla güncellenmez. Bu nedenle logical replication ile beslenecek veritabanı yazma isteği alacaksa sequence’ların değerleri ayarlanmalıdır.
- Partition tablolar replike edilemez. Partition halde bulunan tabloların logical replication ile hedef veritabanına replike edilmesi imkansızdır. Bu nedenle sadece base table nesneleri replike olabilmektedir. Bununla birlikte view ve materialized view nesneleri de karşı tarafa aktarılamaz.
Bu kısıtlamalar versiyon özelinde değişebilir ancak her versiyonda farklı bir durum olabilir. O nedenle bu işlemlerden önce PostgreSQL belgelerini incelemenizde fayda var.
Bu konudaki önerilerinizi ve soru işaretiniz varsa bana aşağıdaki linklerden ulaşabilirsiniz;
Twitter: https://twitter.com/d3rh5n
Linkedin: Hüseyin Demir
E-posta: demirhuseyinn.94@gmail.com
Sevgiler,
Demir.