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

PostgreSQL High Availability - Patroni 2

PostgreSQL Foreign Data Wrappers

PostgreSQL High Availability - Patroni 1