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 High Availability - Patroni 1

Patroni, PostgreSQL HA (High Availability) Cluster yapısının kurulması ve yönetimi için kullanılan open source bir araçtır. Patroni, PostgreSQL Cluster’inin kurulumu (bootstrap), replikasyonunun kurulumu, PostgreSQL otomatik failover yapılması amacıyla kullanılır. Python ile yazılmıştır. Bir önceki yazıda PostgreSQL'de Autofailover araçlarının ne olduğu ve neden Autofailover'a gereksinim duyulduğu konusunda yazı paylaşmıştım. Yazıya buradan ulaşabilirsiniz. Patroni Kurulumu İçin Gereksinimler nedir? Patroni’nin tek başına kurulumu autofailover yapısını yapılandırmak için yeterli değildir. Patroni ile Autofailover yapısının kurulması için DCS (Distributed Configuration Store) araçlarından birine ihtiyaç vardır. Bunlardan bazıları; ETCD, Consul, ZooKeeper, Kubernetes. PostgreSQL üzerinde Autofailover araçlarından Patroni entegre edecekseniz DCS araçlarından birini kullanmanız gerekecek. DCS dediğimiz şey aslında Service Discovery araçlarından biri olduğundan bu iki tan...