PostgreSQL 11 Logical Replication Kurulumu

Bu makalemizde PostgreSQL 11 modeli ile hayatımıza yeni özellikleri ile devam eden Logical Replication ‘ı nasıl kurarız ve konfigürasyonlarını nasıl yaparız adım adım onu göreceğiz.

Elimizde Olanlar ,

İki adet Centos 7 sunucusu ve üzerlerinde PostgreSQL 11 kurulu.

PostgreSQL 11 kurulumu için tıklayınız…

İlk etapta Master yapacağımız tablo da ki işlemleri daha sonra replica olacak makinede ki işlemleri aktaracağım. İşlemlerin başındada master ve replica olarak ek not ekleyeceğim.

Master NODE da psql e giriş yapalım.

[[email protected] /]# su - postgres
Last login: Fri Jan 12 08:48:26 +03 2019 on pts/0
-bash-4.2$ psql
psql (11.1)
Type "help" for help.
postgres=#

WAL Seviyesini değiştiriyoruz. (Bunu postgresql.conf dosyasında da değiştirebiliriz)

postgres=# ALTER SYSTEM SET wal_level = 'logical';
ALTER SYSTEM
postgres=# exit

Daha sonra da Create tablomuzun içerisine dummy data basacağız.

-bash-4.2$ \psql
psql (11.1)
Type "help" for help.

postgres=# CREATE DATABASE sqlturkiye;
CREATE DATABASE
postgres=# \c sqlturkiye
You are now connected to database "sqlturkiye" as user "postgres".
sqlturkiye=# CREATE TABLE demo_sqtr(id serial, value char(33), primary key(value) ) ;
CREATE TABLE

Daha sonra da Create tablomuzun içerisine dummy data basacağız.

sqlturkiye=# insert into demo_sqtr (select generate_series(1,1000),md5(random()::text)) ;
INSERT 0 1000

Replikasyon için user oluşturuyoruz.

CREATE ROLE sqlreplusr WITH LOGIN PASSWORD '12345' REPLICATION ;

Demo olarak oluşturduğumuz tabloyu replikasyona  almak için publication olusturuyoruz.

sqlturkiye=# CREATE PUBLICATION pubsqltr FOR TABLE demo_sqtr ;
CREATE PUBLICATION

Kullanıcıya gerekli hakları veriyoruz.

sqlturkiye=# GRANT SELECT ON demo_sqtr TO sqlreplusr ;
GRANT

Master makinayı hazırladık şimdi ise Replica makinesi olacak makineye gidip işlemlerimizi yapalım.

Psql ‘e giriş yapıyoruz.

[[email protected] ~]# su - postgres
Last login: Fri Jan 12 08:45:53 +03 2019 on pts/0
-bash-4.2$ psql 
psql (11.1)
Type "help" for help.

Veritabanı oluşturup giriş yapıyoruz.

postgres=# create database sqlturkiye_repl ;
CREATE DATABASE
postgres=# \c sqlturkiye_repl
You are now connected to database "sqlturkiye_repl" as user "postgres".
sqlturkiye_repl=#

Master ‘ın ve Replica nın pg_hba.conf dosyasına aşağıda ki izini giriyoruz.

Adres : vi /var/lib/pgsql/11/data/pg_hba.conf

host    all             sqlreplusr      0.0.0.0/0               md5

Tablomuzu olusturyoruz:

CREATE TABLE demo_sqtr(id serial, value char(33), primary key(value) ) ;

SUBSCRIPTION oluşturuyoruz

CREATE SUBSCRIPTION subsqltr CONNECTION 'host=dba2 dbname=sqlturkiye user=sqlreplusr password=12345' PUBLICATION pubsqltr ;

Tablomuzu create edip SUBSCRIPTION ımızı olusturduktan sonra tablomuzda ki kayıt sayısına bakalım.

sqlturkiye_repl=# SELECT count(*) from demo_sqtr;
 count
-------
  1000
(1 row)

Baktığımızda kayıtların replica node ‘a geldiğini görmekteyiz. Bu şekilde Tablo bazlı replikasyonu sağlamış olduk.

Diğer senaryoları deneyerek süreçlerimizi inceleyelim,

alter table  demo_sqtr add column gold boolean default false ; 
delete from  demo_sqtr; 

Master da tabloya yukarıdaki kolon silme ve data silme komutlarını yolladığımızda Replica da yani subscription da aşağıdaki hata mesajını görmekteyiz.

Adres : tail /var/lib/pgsql/11/data/log/postgresql-Fri.log

2019-01-12 09:03:18.530 +03 [61776] ERROR:  logical replication target relation "public.demo_sqtr" is missing some replicated columns
2019-01-12 09:03:18.534 +03 [60832] LOG:  background worker "logical replication worker" (PID 61776) exited with exit code 1

Master ‘ın loglarına baktığımızda ;

2019-01-12 09:06:19.622 +03 [91288] LOG:  starting logical decoding for slot "subsqltr"
2019-01-12 09:06:19.622 +03 [91288] DETAIL:  Streaming transactions committing after 0/18C3718, reading WAL from 0/18C36E0.
2019-01-12 09:06:19.622 +03 [91288] LOG:  logical decoding found consistent point at 0/18C36E0
2019-01-12 09:06:19.622 +03 [91288] DETAIL:  There are no running transactions.
2019-01-12 09:06:19.626 +03 [91288] LOG:  could not send data to client: Connection reset by peer
2019-01-12 09:06:19.626 +03 [91288] CONTEXT:  slot "subsqltr", output plugin "pgoutput", in the change callback, associated LSN 0/18CFB08

Onunda halinden memnun olmadığını görmekteyiz.

Şimdi aynı kolonu Replica üzerinde oluşturalım.

sqlturkiye_repl=# alter table  demo_sqtr add column gold boolean default false ;
ALTER TABLE

Kolon sağlıklı bir şekilde oluştuğunu görmekteyiz.

Replica Node unda loglara tekrar baktığımızda , subscription işleminin yeniden başlatıldığını görmekteyiz.

2019-01-12 09:08:20.345 +03 [78734] LOG:  logical replication apply worker for subscription "subsqltr" has started

Şimdi yeni bir tablo ekleyip işlemleri gerçekleştirelim…

sqlturkiye=# create table sqlturkiye_2 (id serial, value char(33), primary key(value) ) ;
CREATE TABLE

Sonra user ımıza tablo yetkisini verelim

sqlturkiye=# grant select on sqlturkiye_2 to sqlreplusr ;
GRANT

Dummy dataları tablomuza basalım.

sqlturkiye=# insert into sqlturkiye_2 (select generate_series(1,1000),md5(md5(random()::text))) ;
INSERT 0 1000

Publication ımıza tablomuzu ekliyoruz.

sqlturkiye=# alter publication pubsqltr add table  sqlturkiye_2;
ALTER PUBLICATION

Replica Node a geçiyoruz ve tablomuzu db mizin içerisine Create ediyoruz.

sqlturkiye_repl=# create table sqlturkiye_2 (id serial, value char(33), primary key(value) ) ;
CREATE TABLE

Subscription ‘a refreshliyoruz..

sqlturkiye_repl=# alter subscription subsqltr refresh publication ;
ALTER SUBSCRIPTION

Replica Node ‘un loguna baktığımız da tablonun replica da aktif olduğunu görmekteyiz .

2019-01-12 09:18:25.723 +03 [79969] LOG:  logical replication table synchronization worker for subscription "subsqltr", table "sqlturkiye_2" has started
2019-01-12 09:18:25.766 +03 [79969] LOG:  logical replication table synchronization worker for subscription "subsqltr", table "sqlturkiye_2" has finished

Şimdi replica da ki tabloya select cekerek logical replikasyonu kontorl edelim.

sqlturkiye_repl=# select count(*) from sqlturkiye_2;
 count
-------
  1000
(1 row)

Kolay Gelsin.

Leave a Reply

Your email address will not be published. Required fields are marked *