Menggabungkan Beberapa Database dengan Menggunakan PSQL Logical Replication
By: Muhammad Naufal Abiyyu
Tags: Postgres, Microservices, Data Warehouse, Data Engineering, Database

Langkah pertama yaitu copy paste file config dari url dibawah ini. Lalu uncomment dan ubah nilai wal_level menjadi logical. Simpan dengan filename postgres_db_master.conf. Nantinya config tersebut akan di implementasikan di database membership dan merchant.

...

wal_level = logical # minimal, replica, or logical

...

2. Langkah selanjutnya yaitu jalankan file docker-compose berikut:

version: "3.1" services:

db_member:

image: postgres:13.2-alpine

environment:

- POSTGRES_DB=membership

- POSTGRES_USER=admin

- POSTGRES_PASSWORD=admin123

- POSTGRES_PORT=5432

volumes:

- ./postgres_db_master.conf:/etc/postgresql/postgresql.conf

command: postgres -c config_file=/etc/postgresql/postgresql.conf

ports:

- 5400:5432

networks:

- testing db_merchant:

image: postgres:13.2-alpine

environment:

- POSTGRES_DB=merchant

- POSTGRES_USER=admin

- POSTGRES_PASSWORD=admin123

- POSTGRES_PORT=5432

volumes:

- ./postgres_db_master.conf:/etc/postgresql/postgresql.conf

command: postgres -c config_file=/etc/postgresql/postgresql.conf

ports:

- 5400:5432

networks:

- testing db_replica:

image: postgres:13.2-alpine

environment:

- POSTGRES_DB=my_dw

- POSTGRES_USER=admin

- POSTGRES_PASSWORD=admin123

- POSTGRES_PORT=5432

ports:

- 5500:5432

networks:

- testing networks:

testing:

3. Setelah db berhasil hidup, buat table di db_member dan db_merchant lalu masukkan beberapa data sample, misalkan kita buat table users (db_member) dan table merchant (db_merchant) dengan schema seperti berikut:

// run this in db_member

CREATE TABLE users

(

id SERIAL,

username TEXT,

email TEXT,

merchant_id INT,

CONSTRAINT users_pkey PRIMARY KEY (id)

); // run this in db_merchant

CREATE TABLE merchants

(

id SERIAL,

name TEXT,

address TEXT,

CONSTRAINT merchants_pkey PRIMARY KEY (id)

);

4. Langkah berikutnya yaitu membuat publication di db_member dan db_merchant. Publication adalah mekanisme postgres agar dapat mereplikasi table. Untuk membuat publication, jalankan query dibawah ini:

// create publication in db_member

CREATE PUBLICATION membership_publication; // publish table in db_member

ALTER PUBLICATION membership_publication ADD TABLE users; // create publication in db_merchant

CREATE PUBLICATION merchant_publication; // publish table in db_merchant

ALTER PUBLICATION merchant_publication ADD TABLE merchants;

5. Terakhir yaitu kita buat table users dan merchants di db_replica. Setelah table berhasil dibuat lalu buat subscriptions untuk menghubungkan publication yang telah kita buat ke db_replica. Berikut query yang dijalankan:

// buat table di db_replica

CREATE TABLE users

(

id SERIAL,

username TEXT,

email TEXT,

CONSTRAINT users_pkey PRIMARY KEY (id)

); // buat table di db_replica

CREATE TABLE merchants

(

id SERIAL,

name TEXT,

address TEXT,

CONSTRAINT merchants_pkey PRIMARY KEY (id)

); // jalankan di db_relica

CREATE SUBSCRIPTION membership_subscription CONNECTION 'host=db_member port=5432 password=admin123 user=admin dbname=membership' PUBLICATION membership_publication; CREATE SUBSCRIPTION merchant_subscription CONNECTION 'host=db_merchant port=5432 password=admin123 user=admin dbname=merchant' PUBLICATION merchant_publication;

Jika berhasil maka akan mendapatkan output sebagai berikut:

NOTICE: created replication slot "membership_publication" on publisher NOTICE: created replication slot "merchant_subscription" on publisher

6. Lakukan testing dengan memasukkan data dari db_member dan db_merchant. Nantinya secara otomatis data yang kita masukkan akan muncul juga di db_replica.