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
Post a Comment