Pada aplikasi multi-penyewa, degradasi performa akibat kueri broadcast dan pemborosan sumber daya karena distribusi data yang tidak merata merupakan masalah umum. PolarDB for PostgreSQL (Distributed Edition) menyediakan manajemen multi-penyewa native dan mendukung dua mode: row-based sharding dan schema-based sharding. Fitur ini mengarahkan kueri untuk penyewa tertentu ke satu node data (DN) saja, sehingga menghindari kueri broadcast serta memungkinkan operasi baca dan tulis yang efisien. Fitur ini juga menyeimbangkan distribusi data antar penyewa untuk mencegah data skew dan meningkatkan pemanfaatan sumber daya.
Perbandingan dan pemilihan
Pilih strategi sharding yang sesuai berdasarkan skenario bisnis dan karakteristik data Anda. Tujuan utama kedua strategi ini adalah membatasi permintaan dan data satu penyewa pada satu DN guna mencapai performa optimal.
Mode | Deskripsi | Skenario yang Direkomendasikan |
Row-based sharding | Menggunakan bidang ID penyewa (kolom distribusi) dalam tabel yang sama untuk membedakan data. Data baris dari penyewa yang berbeda didistribusikan ke DN yang berbeda. |
|
Schema-based sharding | Membuat skema terpisah untuk setiap penyewa. Seluruh data dalam skema tersebut diarahkan ke DN tertentu. |
|
Row-based sharding
Gunakan kolom ID penyewa sebagai kolom distribusi untuk mengisolasi data penyewa berdasarkan baris.
Langkah 1: Buat tabel terdistribusi
Buat tabel yang mencakup kolom ID penyewa, seperti tenant_id. Kemudian, panggil fungsi create_distributed_table untuk mengonversinya menjadi tabel terdistribusi dengan kolom tersebut sebagai kunci distribusi.
-- 1. Buat tabel. Kolom tenant_id digunakan untuk membedakan penyewa.
CREATE TABLE test_table (tenant_id text primary key, data text);
-- 2. Tetapkan tabel test_table sebagai tabel terdistribusi dan tentukan tenant_id sebagai kolom distribusi.
SELECT create_distributed_table('test_table', 'tenant_id');Langkah 2: Verifikasi perutean kueri
Jalankan kueri untuk penyewa tertentu dan periksa rencana kuerinya untuk memastikan permintaan diarahkan hanya ke satu DN. Pada rencana kueri yang dikembalikan, jika Task Count bernilai 1, kueri berhasil dipush down ke satu DN. Dalam contoh ini, nodenya adalah 10.0.0.1:5432, sehingga kueri broadcast dapat dihindari.
-- Lihat rencana kueri untuk penyewa 'company1'.
EXPLAIN SELECT * FROM test_table WHERE tenant_id = 'company1';
-- Contoh hasil:
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
Custom Scan (PolarCluster Adaptive) (cost=0.00..0.00 rows=0 width=0)
Task Count: 1
Tasks Shown: All
-> Task
Node: host=10.0.0.1 port=5432 dbname=testdb
-> Index Scan using test_table_pkey_102185 on test_table_102185 test_table (cost=0.15..2.37 rows=1 width=64)
Index Cond: (tenant_id = 'company1'::text)
(7 rows)Schema-based sharding
Metode ini mengisolasi data penyewa dengan membuat skema terdistribusi terpisah untuk setiap penyewa.
Langkah 1: Buat dan distribusikan skema
Buat skema khusus untuk satu penyewa, misalnya company_test_1, lalu tetapkan sebagai distributed schema. Tindakan ini mengarahkan seluruh data dan operasi dalam skema tersebut ke satu DN.
-- 1. Buat skema untuk penyewa company_test_1.
CREATE SCHEMA company_test_1;
-- 2. Tetapkan skema sebagai distributed schema.
SELECT polar_cluster_schema_distribute('company_test_1');Langkah 2: Buat tabel dalam skema penyewa
Alihkan search_path ke skema penyewa target, lalu buat tabel bisnis di dalam skema tersebut.
-- 1. Alihkan ke skema penyewa company_test_1.
SET search_path TO company_test_1;
-- 2. Buat tabel bisnis dalam skema ini.
CREATE TABLE users (id SERIAL, name TEXT);
CREATE TABLE orders (id SERIAL, user_id INT);Langkah 3: Verifikasi perutean kueri
Tetapkan search_path ke skema penyewa, lalu jalankan kueri dan periksa rencana kuerinya untuk memastikan permintaan diarahkan hanya ke satu DN. Jika rencana kueri yang dikembalikan menunjukkan Task Count bernilai 1, semua operasi untuk penyewa tersebut diisolasi pada satu node. Dalam contoh ini, nodenya adalah 10.0.0.1:5432.
-- 1. Pastikan search_path diatur ke penyewa target.
SET search_path TO company_test_1;
-- 2. Lihat rencana kueri.
EXPLAIN SELECT * FROM users WHERE id = 1;
-- Contoh hasil:
QUERY PLAN
--------------------------------------------------------------------------------
Custom Scan (PolarCluster Adaptive) (cost=0.00..0.00 rows=0 width=0)
Task Count: 1
Tasks Shown: All
-> Task
Node: host=10.0.0.1 port=5432 dbname=testdb
-> Seq Scan on users_102191 users (cost=0.00..25.88 rows=6 width=36)
Filter: (id = 1)
(7 rows)