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

pg_ctl: command not found

Hi, If you can not reach pg_ctl command in bash also you are sure this command exists in your server, check $PATH. -bash-4.2$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin So, the directory of pg_ctl is not seem in PATH. Input directory of pg_ctl and check it then run it.

PostgreSQL Foreign Data Wrappers

Hi all, I would like to mention about generating Foreign Data Wrappers(FDW) on PostgreSQL 9.6. FDW is used for remote access to tables from external data storage. If needed to use remote table in a query, you can use FDW tables. For instance you can get a table from remote database, but there is a condition. The condition is that user should have proper privileges on FDW table. There is two extension for FDW on PostgreSQL. First one is used for accessing PostgreSQL database to PostgreSQL database, called postgres_fdw . Second one is used for accessing PostgreSQL database to different databases (SQL Server, Sysbase) called tds_fdw .  Foreign Data Wrappers feature lets you to cross-query between remote database tables. Postgres_fdw and tds_fdw has different structure. Tds_fdw usign Tabular Data Stream application layer protocol to transfer data between database server and client. Generating Tds_fdw and Postgres_fdw is similar. I share an example for generating FDW between tw...

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...