All Products
Search
Document Center

PolarDB:Isolasi penyewa

Last Updated:Mar 03, 2026

Dalam skenario bisnis multi-tenant, beberapa "penyewa hot spot" dengan volume data atau laju akses tinggi dapat memonopoli sumber daya komputasi dan penyimpanan pada node mereka, sehingga memengaruhi performa kueri penyewa lain yang berada di node yang sama. PolarDB for PostgreSQL Distributed Edition menyediakan fitur isolasi penyewa yang memungkinkan Anda melakukan migrasi online data penyewa tertentu ke node terpisah dengan sumber daya khusus, guna mengatasi persaingan sumber daya serta menjamin performa dan stabilitas bagi semua penyewa.

Ikhtisar fitur

Dalam arsitektur multi-tenant standar, untuk memaksimalkan pemanfaatan sumber daya, PolarDB for PostgreSQL Distributed Edition mendistribusikan data dari berbagai penyewa secara merata di seluruh node data (DNs) dalam kluster. Artinya, beberapa penyewa berbagi sumber daya penyimpanan dan komputasi pada node yang sama.

Namun, ketika muncul "penyewa hot spot" dalam kluster—yaitu penyewa yang volumen datanya atau muatan aksesnya jauh melebihi penyewa lain—mode bersama ini menimbulkan sejumlah masalah:

  • Resource contention: Kueri yang sering dilakukan oleh penyewa hot spot mengonsumsi CPU, memori, dan sumber daya I/O secara berlebihan pada node mereka, sehingga menyebabkan penurunan signifikan pada performa kueri penyewa lain di node yang sama.

  • Fluktuasi performa: Trafik lonjakan dari penyewa hot spot dapat meningkatkan latensi kueri penyewa lain secara signifikan, sehingga memengaruhi pengalaman pengguna.

  • Ketidakseimbangan penyimpanan: Volume data besar dari penyewa hot spot dapat menyebabkan penggunaan storage beberapa node jauh lebih tinggi dibandingkan node lain, sehingga mengakibatkan pemborosan sumber daya dan meningkatkan kompleksitas manajemen.

Fitur isolasi penyewa menyediakan cara efektif untuk mengatasi masalah tersebut melalui migrasi data secara fisik. Anda dapat memigrasikan data penyewa hot spot (shard atau skema) ke node independen dengan sumber daya yang mencukupi guna mencapai isolasi sumber daya.

Manfaat

  • Jaminan sumber daya khusus: Isolasi penyewa hot spot ke node khusus mencegah persaingan sumber daya dengan penyewa lain, sehingga menjamin performa dan stabilitas bisnis inti Anda.

  • Performa keseluruhan yang lebih baik: Menyeimbangkan beban pada node dan menghilangkan bottleneck sumber daya, sehingga meningkatkan performa layanan dan stabilitas seluruh kluster.

  • Smooth migration online: Proses migrasi data untuk isolasi penyewa dilakukan secara online tanpa memblokir operasi baca-tulis (DML/DQL) maupun memengaruhi kelangsungan bisnis.

  • Strategi migrasi fleksibel: Anda dapat memigrasikan penyewa hot spot ke node baru atau memindahkan penyewa lain dari suatu node untuk membebaskan seluruh node tersebut bagi penyewa hot spot.

Catatan

  • Selama migrasi data, beban sumber daya (seperti CPU, I/O, dan jaringan) pada node sumber dan tujuan akan meningkat. Lakukan operasi ini pada jam sepi.

  • Sebelum memigrasikan data, pastikan node tujuan memiliki ruang penyimpanan yang cukup untuk menampung data tersebut.

Pemisahan horizontal (berdasarkan shard)

Untuk tabel yang dipisah secara horizontal berdasarkan ID penyewa (tenant_id), Anda dapat terlebih dahulu membuat shard khusus untuk penyewa hot spot, lalu memigrasikan shard tersebut ke node tujuan.

Langkah 1: Buat shard khusus untuk penyewa

Jalankan fungsi isolate_tenant_to_new_shard untuk membuat shard baru yang terpisah bagi data penyewa tertentu.

Sintaks

SELECT isolate_tenant_to_new_shard('<distributed_table_name>', '<tenant_ID>', 'CASCADE');

Contoh

  1. Siapkan data:

    CREATE TABLE orders (
        order_id     BIGSERIAL,          -- ID pesanan, auto-incrementing
        store_id     INT NOT NULL,       -- ID toko, digunakan sebagai distribution key (tenant ID)
        product_name VARCHAR(255),       -- Nama produk
        amount       DECIMAL(10, 2),     -- Jumlah pesanan
        order_time   TIMESTAMPTZ DEFAULT NOW(), -- Waktu pesanan
        PRIMARY KEY (order_id, store_id) -- Catatan: Distribution key harus menjadi bagian dari primary key.
    );
    
    -- Definisikan tabel 'orders' sebagai distributed table dan lakukan horizontal splitting berdasarkan kolom 'store_id'.
    SELECT create_distributed_table('orders', 'store_id');
    
    -- Masukkan 5 pesanan untuk toko 101.
    INSERT INTO orders (store_id, product_name, amount)
    SELECT 101, 'Laptop - ' || i, 4999.00 + i FROM generate_series(1, 5) i;
    
    -- Masukkan 5 pesanan untuk toko 102.
    INSERT INTO orders (store_id, product_name, amount)
    SELECT 102, 'Mechanical Keyboard - ' || i, 899.00 + i FROM generate_series(1, 5) i;
  2. Jalankan perintah:

    -- Contoh: Buat shard terisolasi untuk penyewa '102' pada distributed table 'orders'.
    SELECT isolate_tenant_to_new_shard('orders', '102', 'CASCADE');
  3. Lihat hasilnya:
    Fungsi ini mengembalikan ID shard baru.

     isolate_tenant_to_new_shard
    -----------------------------
                          102108

    Pada tahap ini, shard dengan ID 102108 telah dibuat, tetapi masih berada di node asal. Lanjutkan ke langkah berikutnya untuk menyelesaikan isolasi.

Langkah 2: Migrasikan shard ke node tujuan

Jalankan fungsi polar_cluster_move_shard_placement untuk memigrasikan shard khusus yang dibuat pada langkah sebelumnya ke node tujuan dengan sumber daya yang mencukupi. Pilih salah satu strategi berikut sesuai kebutuhan.

Sintaks

SELECT polar_cluster_move_shard_placement(
    <shard_ID>, 
    '<source_node_IP>',
    <source_node_port>, 
    '<destination_node_IP>', 
    <destination_node_port>
 );

Strategi migrasi

Migrasikan shard penyewa hot spot

Ini adalah metode paling langsung: pindahkan shard khusus penyewa hot spot dari node saat ini ke node tujuan.

  1. Cari lokasi saat ini dari shard hot spot:

    -- Ganti 102108 dengan ID shard yang Anda peroleh pada langkah sebelumnya.
    SELECT nodename, nodeport FROM pg_dist_shard_placement WHERE shardid = 102108;

    Lihat hasilnya:

    nodename  | nodeport
    ----------+----------
    10.0.0.1  |     5432
  2. Jalankan perintah migrasi:

    -- Contoh: Migrasikan shard 102108 dari 10.0.0.1:5432 ke 10.0.0.2:5432.
    SELECT polar_cluster_move_shard_placement(102108, '10.0.0.1', 5432, '10.0.0.2', 5432);

Migrasikan shard penyewa non-hot spot

Jika ingin membebaskan seluruh node saat ini khusus untuk penyewa hot spot, migrasikan semua shard non-hot spot dari node tersebut.

  1. Cari semua shard non-hot spot pada node hot spot:

    -- Ganti 102108 dengan ID shard hot spot, dan ganti '10.0.0.1' serta 5432 dengan informasi node hot spot.
    SELECT shardid, shard_size
     FROM polar_cluster_shards
     WHERE table_name::text = 't' AND
           shardid <> 102108 AND
           nodename = '10.0.0.1' AND nodeport = 5432
     ORDER BY shard_size ASC, shardid ASC;

    Lihat hasilnya:

     shardid | shard_size
    ---------+------------
      102104 |       8192
      102105 |      16384
      102106 |   83820544
      102107 |  256344064
  2. Migrasikan shard non-hot spot satu per satu:
    Berdasarkan hasil kueri, migrasikan shard-shard tersebut ke node tujuan.

    SELECT polar_cluster_move_shard_placement(102104, '10.0.0.1', 5432, '10.0.0.2', 5432);
    SELECT polar_cluster_move_shard_placement(102105, '10.0.0.1', 5432, '10.0.0.2', 5432);
    ...

Vertical partitioning (berdasarkan skema)

Dalam skenario vertical partitioning dengan skema independen, isolasi lebih sederhana: Anda dapat memigrasikan seluruh skema penyewa hot spot ke node tujuan.

Sintaks

SELECT polar_cluster_schema_move(
    '<schema_name>', 
    '<destination_node_IP>', 
    <destination_node_port>
);

Contoh

  1. Siapkan data:

    -- Skema baru company1
    CREATE SCHEMA company1;
    
    -- Definisikan skema terdistribusi
    SELECT polar_cluster_schema_distribute('company1');
    
    -- Buat tabel uji
    CREATE TABLE company1.users (id SERIAL, name TEXT);
  2. Rencana kueri untuk pernyataan SELECT berikut menunjukkan bahwa kueri untuk penyewa tertentu hanya mengakses satu node spesifik. Rencana tersebut menunjukkan bahwa satu-satunya DN yang diakses adalah 10.0.0.1:5432.

    EXPLAIN SELECT * FROM company1.users WHERE id = 1;
                                       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=postgres
             ->  Seq Scan on users_102010 users  (cost=0.00..25.88 rows=6 width=36)
                   Filter: (id = 1)
  3. Jalankan fungsi polar_cluster_schema_move untuk melakukan migrasi.

    -- Contoh: Migrasikan skema 'company1' ke node 10.0.0.2:5432.
    SELECT polar_cluster_schema_move('company1', '10.0.0.2', 5432);