Skip to main content

PostgreSQL 12'den 13'e Logical Replication İle Versiyon Upgrade

PostgreSQL versiyon upgrade'leri için en sık kullanılan yöntemlerden biri olan Logical Replication ile upgrade işlemleri oldukça basit bir kaç adımla tamamlanabilir. 

Bu işlemi yapmak için wal_level=logical olması gerekmektedir. Eğer bu parametre değeri replica veya minimal ise postgresql.conf içinde wal_level değiştirilmeli ve postgresql servisi restart edilmelidir. Eğer zaten wal_level=logical olarak kullanıyorsanız yapılacak upgrade işlemi için servis restart etmek zorunda kalmazsınız. 

Online olarak upgrade işlemini gerçekleştirebilmek için primary node'dan trafiği secondary ortama yönlendirebileceğiniz HAProxy vb. bir ara katman olmalıdır. 

Ubuntu 16.04.7 LTS ortamına PostgreSQL 12 ve 13 kurulumu gerçekleştirilecek. Gerekli kurulum adımlarına buradan ulaşabilirsiniz. 

Primary ve secondary sunucularımız olacak. Primary sunucuda PostgreSQL 12, secondary sunucuda 13 kurulumunu gerçekleştireceğiz. 

Primary Node'a PostgreSQL 12 Kurulumu

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt-get -y install postgresql-12

Config Düzenlemeleri

PostgreSQL 12 ortamına ait postgresql.conf dosyasında aşağıdaki değişiklikler yapılmalıdır.

listen_addresses='*' wal_level=logical max_replication_slots=10 max_wal_senders=4 archive_mode = on

Replication kurulumunda authentication erişimi için pg_hba.conf dosyasına uygun satırın eklenmesi gerekmektedir. 

host all repuser replica_ip/32 md5 

pg_hba.conf içinde düzenlemeler için servisi sadece reload edilmesi yeterli olsa da postgresql.conf içinde yapılan wal_level ve archive_mode değişiklikleri restart gerektiren düzenlemelerdir. Servisi restart edelim. 

systemctl stop postgresql@12.service systemctl start postgresql@12.service

Secondary Node'a PostgreSQL 13 Kurulumu

Secondary ortama PostgreSQL 13'ü kuralım.

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt-get -y install postgresql-13

Logical Replication Kurulumu

PostgreSQL 12 üzerinde replikasyon için kullanacağımız kullanıcıyı oluşturalım.

postgres=# create user repuser replication password 'rep123';CREATE ROLE
Logical replikasyon ile replike edeceğimiz upgrd adında test veritabanı oluşturup içine bir tablo ekledim. Siz kendi mevcut veritabanınızı replike etmek için kullanabilirsiniz. postgres=# create database upgrd; CREATE DATABASE postgres=# \c upgrd  upgrd=# create table test_tbl (a INT); CREATE TABLE upgrd=# insert into test_tbl select generate_series(1,100); INSERT 0 100 Primary sunucu yayın yapan sunucu olduğundan PUBLICATION adı veritabanı objesi oluşturulması gerekir. upgrd=# CREATE PUBLICATION upgrd_pub FOR ALL TABLES; CREATE PUBLICATION

Oluşturduğumuz repuser kullanıcısının replikasyonu yapabilmesi için veritabanı objelerine yetkisinin olması gerekir. Gerekli yetkiyi verelim.

 
upgrd=# GRANT SELECT ON ALL TABLES IN SCHEMA public to repuser ; GRANT

Oluşturulan PUBLICATION'a ait bilgilere ulaşmak için aşağıdaki SQL'i çalıştırabilirsiniz.

 
upgrd=# select * from pg_publication; -[ RECORD 1 ]+---------- oid | 16390 pubname | upgrd_pub pubowner | 10 puballtables | t pubinsert | t pubupdate | t pubdelete | t pubtruncate | t

100 kayıtlık bir tablo için gerekmese de, daha büyük verilerin bulunduğu veritabanlarının Logical Replication'unun kurulumu için dump-restore işlemi gerekir. Bunun yerine sunucu snapshot'ını secondary sunucu üzerinde açmak da bir yöntem olabilir. Secondary node üzerinde, primary node'daki instance'a ait global ve local dump alalım.

 
postgres@test-gunce:~$ /usr/lib/postgresql/13/bin/pg_dumpall -p 5432 -h primary_ip > backup_1407.dump postgres@test-gunce:~$ /usr/lib/postgresql/13/bin/pg_dumpall -p 5432 -h primary_ip -g > global_1407.dump

Alınan dunp'ları yeni ortama restore edelim.

 
postgres@test-gunce:~$ psql -p5433 < global_1407.dump postgres@test-gunce:~$ psql -p5433 < backup_1407.dump

Artık primary ve secondary node'lar anlık olarak eşitlenmiş oldu.

 
upgrd=# CREATE SUBSCRIPTION upgrd_sub CONNECTION 'host=127.0.0.1 dbname=upgrd user=repuser password=rep123' PUBLICATION upgrd_pub; NOTICE: created replication slot "upgrd_sub" on publisher CREATE SUBSCRIPTION

SUBSCRIPTION status'une aşağıdaki SQL ifadesiyle kontrol edebilirsiniz.

 
upgrd=# select * from pg_subscription; -[ RECORD 1 ]---+---------------------------------------------------------- oid | 16393 subdbid | 16385 subname | upgrd_sub subowner | 10 subenabled | t subconninfo | host=127.0.0.1 dbname=upgrd user=repuser password=rep123 subslotname | upgrd_sub subsynccommit | off subpublications | {upgrd_pub}

Secondary node üzerinde SUBSCRIPTION oluşturalım.  Artık trafiği yönlendirmek için kullandığınız ara katman uygulaması ile primary'deki mevcut trafiği secondary node'a yönlendirebilirisiniz. Yönlendirme işlemi sonrası primary Postgres servisini kapatıp, SUBSCRIPTION'u drop edin.

 
DROP SUBSCRIPTION upgrd_sub;

Hepsi bu :)

Comments

Popular posts from this blog

PGConf Europe 2018 Güncesi 1

Merhaba, Diğer tüm veritabanları arasında en popüler açık kaynak kodlu veritabanı olan PostgreSQL, tüm yıl boyunca farklı ülkelerde bir çok konferansa sahiplik yapmaktadır. En bilinenleri PGDay ve PGConf'dur. Ayrıca her yıl 2 Şubatta Brüksel’de yapılan FOSDEM etkinliğinde de PostgreSQL konuşmalarının yapıldığı bir oturum mutlaka olmaktadır. PostgreSQL etkinlik detaylarına bu linkten ulaşabilirsiniz. Bu yıl ki PGConf Europe konferansı Lizbon'da yapıldı. Konferansla ilgili izlenimlerimi, yaptığım neredeyse 6 günlük yolculuğun en başından tüm detaylarıyla birlikte paylaşmak istiyorum. Yolculuğumuz sevgili Seda ile birlikte Atatürk Havalimanı’ndan sabah 07:30’da Lizbon’a direk uçuşla başladı.  Hava şahaneydi ve uçuşumuz konforlu geçti. Koltuğumuz cam kenarı ve uçağın kanadının hemen yanındaydı (benim favori koltuklarım 24, 25, 26, 27 ve 28. sıradakiler) ve biz 27. sıradaydık. Bol bol resim çektik bulutların üstündeyken ve uçak kanatlı olanlardan.  Lizbon’a vardığımı...

PostgreSQL High Availability - Patroni 2

Patroni kurulumuyla ilgili oldukça fazla kaynak bulunmakta fakat kurulum ve yönetimini beraber barındıran kaynağa denk gelmedim. Bu yazıda hem Patroni kurulumu hem de kurulum sonrası yönetimiyle alakalı detaylara ulaşabilirsiniz. PostgreSQL cluster'larının yönetimi için kullanılan Patroni ile ilgili temel bilgilerin yer aldığı Autofailover üzerine hazırladığım yazı serisine aşağıdaki linklerden erişebilirsiniz. PostgreSQL ve Autofailover PostgreSQL'de Autofailover ve Patroni 1 (Giriş) PostgreSQL'de Autofailover ve Patroni 2 (Kurulum, Konfigürasyon ve Yönetim) PostgreSQL'de Autofailover ve Patroni 3 (Mevcut PostgreSQL Cluster'inin Patroni'ye Geçirilmesi) Patroni, PostgreSQL veritabanlarının kurulumundan ve konfigürasyonundan sorumludur. Yani Patroni'yi kurduğumuz sunucular aynı zamanda Patroni ile kurulmuş PostgreSQL'leri barındıracak. Üç node'lu PostgreSQL ve üç node'lu ETCD cluster'larını oluşturacağım. Kuruluma önce üç no...

PostgreSQL ve Autofailover

Bir veritabanının düzenli olarak yedeğinin alınması ve sağlıklı replikasyonun mevcut olması kadar olabilecek herhangi felaket senaryosunda veritabanının devamlılığı da oldukça önemlidir. Gelen taleplerin primary veritabanına ulaşılamama durumunda (sunucunun kapanması veya Postgres servisinin kapanması gibi) okuma ve daha da önemlisi yazma işlemlerinin standby node'lar üzerindeki veritabanından devam etmesi yani read-only olan bir node'un writable olması bir veritabanı yöneticisinin yapması gereken öncelikli işlerden biridir. Bahsettiğim bu yapı Autofailover yapısının mevcut olmasıyla mümkündür. PostgreSQL veritabanıyla bir Autofailover yapısının kurulmasının birden fazla yolu vardır. Temel olarak Autofailover için aşağıdaki araçlar kullanılabilir. Patroni (By Zalando)  Repmgr (Replication Manager)  PAF (PostgreSQL Automatic Failover)  Pg_auto_failover (By Citus)  Yukarıda belirtilen araçların her birini Autofailover yapısını PostgreSQL üzerine entegre etm...