Sharding Pada PostgreSQL: Arsitektur, Strategi, & Implementasi

Sharding pada PostgreSQL adalah teknik arsitektur database untuk mendistribusikan data secara horizontal ke dalam beberapa mesin atau node terpisah guna mengatasi batasan kapasitas penyimpanan, memori, dan daya proses dari satu server fisik. PostgreSQL secara bawaan (native) belum mendukung sharding otomatis lintas jaringan seperti database NoSQL, namun arsitektur ini dapat dicapai melalui partisi tabel (table partitioning) pada satu instance atau menggunakan ekstensi pihak ketiga seperti Citus dan pembungkus data asing postgres_fdw.

Ketika volume data mencapai ratusan gigabyte atau terabyte dengan transaksi per detik (TPS) yang tinggi, performa indeks dan I/O disk pada server tunggal akan mengalami penurunan drastis. Sharding memecah beban tersebut dengan memetakan baris data ke node shard tertentu berdasarkan aturan kunci sharding (shard key) yang spesifik.

Strategi Pendekatan Sharding di PostgreSQL

Sebelum mengimplementasikan sharding, pengembang harus memahami tiga metode utama yang tersedia di ekosistem PostgreSQL beserta karakteristik operasionalnya.

Metode Sharding Mekanisme Kerja Kelebihan Kekurangan
Citus (Ekstensi) Mengubah Postgres menjadi database terdistribusi dengan node kordinator dan worker. Transparan untuk aplikasi, mendukung distributed JOIN dan transaksi terdistribusi. Memerlukan pengelolaan klaster tambahan, lisensi enterprise untuk fitur lanjut tertentu.
Postgres FDW (Native) Menggunakan postgres_fdw untuk menghubungkan tabel antar server mandiri dengan tabel partisi. Dibangun dari fitur bawaan Postgres, kontrol penuh atas topologi jaringan. Kompleksitas tinggi pada manajemen kueri, performa JOIN lintas server lambat.
Table Partitioning Membagi tabel besar ke dalam partisi-partisi kecil di satu instance yang sama (Single Node). Meningkatkan performa kueri lokal, mudah dikelola, tanpa overhead jaringan. Tidak menambah kapasitas penyimpanan fisik server (tetap dibatasi sumber daya satu mesin).

Implementasi Praktis Menggunakan Citus

Citus adalah ekstensi open-source paling populer untuk mengubah PostgreSQL menjadi database terdistribusi. Berikut adalah langkah-langkah teknis instalasi dan distribusi tabel menggunakan Citus.

1. Instalasi Ekstensi Citus

Pastikan ekstensi Citus telah terpasang pada instance PostgreSQL Anda. Jalankan perintah SQL berikut pada database target:

CREATE EXTENSION citus;

2. Menambahkan Node Worker

Daftarkan node worker ke dalam klaster melalui node kordinator:

SELECT master_add_node('worker-1-ip', 5432);
SELECT master_add_node('worker-2-ip', 5432);

3. Mendistribusikan Tabel

Pilih tabel yang ingin di-shard dan tentukan kolom kunci sharding (shard key). Contoh pada tabel orders dengan shard key customer_id:

-- Buat tabel standar
CREATE TABLE orders (
    order_id bigint NOT NULL,
    customer_id bigint NOT NULL,
    order_date date,
    total_amount numeric
);

-- Distribusikan tabel berdasarkan customer_id
SELECT create_distributed_table('orders', 'customer_id');

Troubleshooting & Tips Lapangan

Pengelolaan klaster terdistribusi memiliki tantangan operasional yang berbeda dibanding database monolitik. Perhatikan beberapa poin krusial berikut:

  • Pemilihan Shard Key: Pilih kolom yang memiliki kardinalitas tinggi dan sering digunakan dalam klausul WHERE pada kueri aplikasi untuk menghindari shard scatter-gather.
  • Distributed Deadlocks: Transaksi yang mencakup banyak node secara bersamaan rentan terhadap deadlock. Pastikan urutan penguncian baris konsisten di aplikasi.
  • Foreign Key Constraints: Batasan asing (foreign key) antar tabel yang berada di shard berbeda tidak didukung secara native oleh Citus kecuali tabel tersebut dikonfigurasi sebagai tabel referensi (reference table).