(0275) 2974 127
Database merupakan salah satu komponen penting dalam aplikasi modern. Seiring bertambahnya jumlah pengguna, transaksi, dan volume data, satu server database pada akhirnya dapat mencapai batas kapasitas CPU, memory, storage, maupun kemampuan menangani query secara bersamaan. Salah satu pendekatan yang dapat digunakan untuk mengatasi masalah tersebut adalah database sharding.
Database sharding merupakan teknik membagi data secara horizontal ke beberapa database atau server yang disebut shard. Dengan membagi data dan workload ke beberapa server, sistem dapat melakukan horizontal scaling tanpa harus terus bergantung pada peningkatan kapasitas satu server.
Namun, sharding bukan sekadar memindahkan data ke beberapa server. Pemilihan shard key, mekanisme routing query, distribusi data, rebalancing, dan pengelolaan transaksi harus dirancang dengan baik agar sharding benar-benar memberikan manfaat.
Database sharding adalah teknik membagi data secara horizontal ke beberapa database atau server yang berbeda sehingga setiap server hanya menyimpan sebagian data dari keseluruhan dataset. Setiap bagian data tersebut disebut shard. Jika sebuah database memiliki 100 juta data, misalnya, data tersebut dapat dibagi ke beberapa shard berdasarkan aturan tertentu. Contoh sederhana:
Database
│
├── Shard 1 → Data pengguna 1 - 1.000.000
├── Shard 2 → Data pengguna 1.000.001 - 2.000.000
├── Shard 3 → Data pengguna 2.000.001 - 3.000.000
└── Shard 4 → Data pengguna 3.000.001 - 4.000.000
Meskipun data secara fisik tersebar pada beberapa server, seluruh shard dapat dipandang sebagai satu sistem database secara logis. Konsep ini merupakan bentuk horizontal partitioning, yaitu membagi baris data ke beberapa lokasi, sementara struktur atau kolom data pada setiap bagian tetap mengikuti skema yang sama. Oracle, misalnya, mendefinisikan sharding sebagai horizontal partitioning data ke beberapa database independen.
Salah satu alasan utama menggunakan database sharding adalah keterbatasan vertical scaling. Vertical scaling berarti meningkatkan kemampuan satu server dengan menambah:
Pendekatan tersebut dapat efektif sampai batas tertentu. Namun, satu server tetap memiliki batas kapasitas fisik dan konfigurasi hardware. Ketika kebutuhan aplikasi terus meningkat, menambah kapasitas server bisa menjadi semakin mahal dan pada akhirnya tidak lagi mencukupi. Sharding menggunakan pendekatan berbeda, yaitu horizontal scaling. Daripada menggunakan satu server yang semakin besar:
Server Besar
CPU: 64 Core
RAM: 512 GB
Storage: 10 TB
sistem dapat menggunakan beberapa server:
Shard 1
Shard 2
Shard 3
Shard 4
Masing-masing server menangani sebagian data dan workload.
Secara umum, database sharding bekerja dengan menentukan bagaimana data akan dibagi dan ke mana query harus diarahkan. Prosesnya dapat digambarkan sebagai berikut:
Application
│
↓
Query Router
│
┌───┼────┬────┐
↓ ↓ ↓ ↓
S1 S2 S3 S4
1. Menentukan Shard Key
Langkah penting dalam database sharding adalah menentukan shard key. Shard key merupakan field atau kombinasi field yang digunakan untuk menentukan bagaimana data didistribusikan ke shard. Misalnya tabel pengguna memiliki:
user_id
name
email
country
Sistem dapat menggunakan user_id sebagai shard key. Data kemudian didistribusikan berdasarkan nilai user_id.
2. Membagi Data ke Beberapa Shard
Setelah shard key ditentukan, sistem membagi data berdasarkan strategi tertentu.
Misalnya menggunakan range:
Shard 1 → user_id 1 - 1.000.000
Shard 2 → user_id 1.000.001 - 2.000.000
Shard 3 → user_id 2.000.001 - 3.000.000
Dengan demikian, setiap shard hanya menyimpan subset data.
3. Query Router Menentukan Lokasi Data
Ketika aplikasi mengirim query, sistem perlu mengetahui shard mana yang menyimpan data tersebut. Pada MongoDB, misalnya, komponen mongos bertindak sebagai query router antara aplikasi dan sharded cluster. Metadata mengenai distribusi data disimpan oleh config server.
4. Query Diteruskan ke Shard
Jika query memiliki shard key yang sesuai, router dapat mengarahkan query langsung ke shard yang relevan. Misalnya:
SELECT * FROM users
WHERE user_id = 1500000;
Jika user_id digunakan sebagai shard key dan ID tersebut berada di Shard 2, query dapat diarahkan langsung ke Shard 2. Pendekatan seperti ini disebut targeted query dan umumnya lebih efisien daripada meminta seluruh shard menjalankan query.
5. Hasil Dikembalikan ke Aplikasi
Setelah shard menyelesaikan query, hasilnya dikembalikan melalui router kepada aplikasi. Untuk query tertentu, sistem mungkin harus mengakses lebih dari satu shard dan menggabungkan hasilnya terlebih dahulu.
Shard key adalah atribut atau kumpulan atribut yang digunakan untuk menentukan distribusi data ke berbagai shard. Shard key merupakan salah satu keputusan paling penting dalam desain database sharding. Contohnya, pada tabel:
| user_id | nama | negara |
|---|---|---|
| 1001 | Andi | Indonesia |
| 1002 | Budi | Indonesia |
| 1003 | Citra | Malaysia |
| 1004 | Deni | Singapura |
Jika user_id digunakan sebagai shard key, sistem dapat menggunakan nilai tersebut untuk menentukan lokasi data. Pemilihan shard key harus mempertimbangkan pola query dan distribusi workload. Microsoft juga menekankan bahwa shard key perlu dipilih agar workload dapat tersebar dengan baik di antara shard. Shard key yang buruk dapat menyebabkan sebagian besar data atau request terkonsentrasi pada satu shard sehingga menciptakan hotspot.
Ada beberapa pendekatan yang umum digunakan untuk menentukan distribusi data.
1. Range-Based Sharding
Range-based sharding membagi data berdasarkan rentang nilai shard key. Contohnya:
Shard 1 → ID 1 - 1.000
Shard 2 → ID 1.001 - 2.000
Shard 3 → ID 2.001 - 3.000
MongoDB mendukung ranged sharding, di mana nilai shard key dibagi menjadi range tertentu dan chunk ditempatkan pada shard yang sesuai.
2. Hash-Based Sharding
Hash-based sharding menggunakan fungsi hash terhadap shard key untuk menentukan distribusi data. Contoh sederhana:
user_id
↓
Hash Function
↓
Shard Assignment
Nilai yang berbeda akan dipetakan ke distribusi hash sehingga data cenderung tersebar lebih merata. MongoDB, misalnya, menyediakan hashed sharding yang menghitung hash dari shard key sebelum menentukan distribusi chunk.
3. Directory-Based Sharding
Directory-based sharding menggunakan tabel atau layanan metadata untuk menentukan lokasi suatu data. Contohnya:
user_id 1001 → Shard A
user_id 1002 → Shard C
user_id 1003 → Shard B
Sistem terlebih dahulu mencari informasi lokasi data, kemudian meneruskan query ke shard yang sesuai. Pendekatan ini memberikan fleksibilitas tinggi, tetapi membutuhkan komponen metadata dan mekanisme routing yang harus dikelola dengan baik.
| Jenis | Cara Distribusi | Kelebihan | Kekurangan |
|---|---|---|---|
| Range-based | Berdasarkan rentang nilai | Mudah dan cocok untuk range query | Risiko hotspot |
| Hash-based | Berdasarkan hasil hash | Distribusi cenderung merata | Range query lebih kompleks |
| Directory-based | Berdasarkan metadata lokasi | Sangat fleksibel | Membutuhkan metadata dan routing |
Database sharding sering dianggap sama dengan partitioning karena keduanya membagi data. Namun, keduanya tidak selalu identik. Partitioning dapat membagi satu tabel atau dataset menjadi beberapa bagian secara logis atau fisik. Sementara sharding umumnya merujuk pada horizontal partitioning yang didistribusikan ke beberapa database atau server independen.
| Aspek | Partitioning | Sharding |
|---|---|---|
| Pembagian data | Menjadi beberapa partition | Menjadi beberapa shard |
| Lokasi | Bisa dalam satu database/server | Umumnya beberapa database/server |
| Tujuan | Organisasi dan performa data | Horizontal scaling |
| Infrastruktur | Dapat menggunakan satu server | Biasanya multi-server |
| Kompleksitas | Relatif lebih sederhana | Lebih kompleks |
| Contoh | Partition tabel berdasarkan tanggal | Data pelanggan dibagi ke beberapa database |
PostgreSQL, misalnya, mendukung table partitioning dengan membagi satu tabel besar menjadi bagian-bagian fisik yang lebih kecil.
Sharding juga berbeda dengan replication. Pada replication, data yang sama disalin ke beberapa server. Sementara pada sharding, data dibagi sehingga setiap server hanya menyimpan sebagian dataset.
| Aspek | Sharding | Replication |
|---|---|---|
| Data | Dibagi ke beberapa server | Disalin ke beberapa server |
| Tujuan utama | Horizontal scaling | Availability dan redundancy |
| Setiap server memiliki seluruh data? | Tidak | Umumnya ya |
| Storage capacity | Bertambah dengan shard | Tidak otomatis menambah kapasitas dataset |
| Read scaling | Dapat membantu | Sangat umum |
| Write scaling | Dapat membantu | Bergantung arsitektur |
| Kompleksitas | Relatif tinggi | Bergantung implementasi |
Keduanya juga dapat digunakan bersamaan. Misalnya, sebuah sistem dapat memiliki beberapa shard dan setiap shard memiliki replica untuk meningkatkan availability. MongoDB menggunakan pendekatan tersebut pada sharded cluster, di mana setiap shard harus dijalankan sebagai replica set.
1. Meningkatkan Skalabilitas
Manfaat utama database sharding adalah memungkinkan horizontal scaling. Ketika kebutuhan sistem meningkat, kapasitas dapat ditambah dengan menambahkan shard baru.
2. Menangani Data Berukuran Besar
Jika seluruh dataset sudah terlalu besar untuk ditangani secara efektif oleh satu server, sharding memungkinkan data tersebut dibagi ke beberapa server. Setiap shard hanya perlu menyimpan sebagian data sehingga kapasitas storage dapat ditingkatkan secara horizontal.
3. Mendistribusikan Workload
Sharding dapat membagi workload read dan write ke beberapa server. Dengan distribusi yang baik, satu server tidak perlu menangani seluruh operasi database.
4. Mengurangi Beban pada Satu Server
Karena data dan workload tersebar, penggunaan CPU, RAM, storage, dan I/O dapat didistribusikan ke beberapa server.
5. Mendukung Pertumbuhan Aplikasi
Sharding dapat menjadi bagian dari strategi scaling untuk aplikasi yang mengalami pertumbuhan pengguna dan data secara signifikan.
Meskipun menawarkan scalability, database sharding juga memiliki konsekuensi.
1. Kompleksitas Infrastruktur
Sistem tidak lagi hanya mengelola satu database server. Administrator perlu mengelola beberapa shard, routing, metadata, monitoring, backup, dan proses recovery. Microsoft menekankan bahwa sharding dapat meningkatkan scalability, tetapi juga membawa konsekuensi dalam pengelolaan dan distribusi data.
2. Pemilihan Shard Key Sulit
Shard key yang tidak tepat dapat menghasilkan distribusi data yang tidak seimbang. Misalnya:
Shard 1 → 80% workload
Shard 2 → 10% workload
Shard 3 → 10% workload
Dalam kondisi tersebut, Shard 1 menjadi bottleneck meskipun jumlah server sudah bertambah.
3. Query Lintas Shard
Query yang tidak dapat ditargetkan ke shard tertentu mungkin harus dikirim ke beberapa shard. MongoDB menyebut pola ini sebagai scatter/gather, dan query semacam ini dapat menjadi lebih lambat karena melibatkan banyak shard.
4. Transaksi Menjadi Lebih Kompleks
Transaksi yang melibatkan data pada beberapa shard dapat membutuhkan mekanisme tambahan dan memiliki overhead lebih tinggi dibandingkan transaksi pada satu database.
5. Maintenance Lebih Rumit
Administrator perlu memperhatikan:
Hotspot terjadi ketika workload tidak tersebar secara merata dan sebagian besar request terkonsentrasi pada shard tertentu. Contohnya:
Shard 1 → 10% workload
Shard 2 → 10% workload
Shard 3 → 80% workload
Shard 3 menjadi bottleneck meskipun kapasitas keseluruhan cluster masih tersedia.
Hotspot dapat terjadi karena pemilihan shard key yang buruk atau pola akses aplikasi yang tidak merata. Karena itu, shard key sebaiknya dipilih berdasarkan distribusi data dan pola query, bukan hanya berdasarkan field yang mudah digunakan.
Ketika data tidak lagi tersebar secara merata, sistem dapat melakukan rebalancing atau pemindahan sebagian data antar-shard. Contohnya:
Sebelum:
Shard 1 → 20%
Shard 2 → 60%
Shard 3 → 20%
Setelah Rebalancing:
Shard 1 → 33%
Shard 2 → 34%
Shard 3 → 33%
Tujuannya adalah menjaga distribusi data dan workload agar lebih seimbang. MongoDB, misalnya, memiliki balancer yang dapat memindahkan range/chunk untuk membantu menjaga distribusi data di antara shard.
Tidak selalu. Database sharding dapat membantu meningkatkan performa ketika data dan workload berhasil didistribusikan secara merata ke beberapa shard. Query yang menggunakan shard key dan dapat diarahkan langsung ke shard tertentu juga berpotensi berjalan lebih efisien karena tidak perlu mengakses seluruh database cluster.
Sebaliknya, query yang harus mengakses beberapa shard dapat menimbulkan overhead tambahan karena sistem perlu mengirimkan query ke beberapa server dan menggabungkan hasilnya. Kondisi ini dapat meningkatkan latency dan membuat performa tidak selalu lebih baik dibandingkan database tanpa sharding.
Oleh karena itu, database sharding tidak sebaiknya diterapkan hanya untuk mempercepat database. Efektivitasnya sangat bergantung pada pemilihan shard key, pola query, distribusi workload, network latency, serta kapasitas masing-masing shard. Dengan desain yang tepat, sharding dapat membantu meningkatkan scalability sekaligus mendukung performa database pada aplikasi berskala besar.
Database sharding sebaiknya dipertimbangkan ketika aplikasi sudah memiliki skala besar dan satu database server mulai mengalami keterbatasan kapasitas. Sharding memungkinkan data dan workload dibagi ke beberapa server sehingga aplikasi dapat melakukan horizontal scaling.
Beberapa kondisi yang dapat menjadi pertimbangan untuk menggunakan database sharding antara lain volume data yang sangat besar, traffic database yang terus meningkat, beban read dan write yang tinggi, kebutuhan storage yang melebihi kapasitas satu server, serta vertical scaling yang mulai mencapai batas. Sharding juga lebih efektif ketika workload dapat dibagi berdasarkan karakteristik data atau pola akses tertentu.
Sebaliknya, aplikasi dengan traffic rendah dan database yang masih dapat ditangani oleh satu server biasanya belum membutuhkan sharding. Menerapkan database sharding terlalu dini dapat menambah kompleksitas dalam pengelolaan, monitoring, dan maintenance tanpa memberikan manfaat yang sebanding. Oleh karena itu, sharding sebaiknya diterapkan berdasarkan kebutuhan dan skala aplikasi, bukan hanya sebagai langkah untuk meningkatkan performa.
Bayangkan sebuah e-commerce memiliki puluhan juta pelanggan. Jika seluruh data pelanggan disimpan pada satu database:
Database
│
50 juta pelanggan
│
Satu Server
Seiring pertumbuhan data, server dapat mengalami keterbatasan. Dengan sharding berdasarkan user_id:
Application
│
Query Router
│
┌──────────────┼──────────────┐
↓ ↓ ↓
Shard 1 Shard 2 Shard 3
User A-H User I-P User Q-Z
Setiap shard hanya menangani sebagian data. Jika pengguna dengan ID tertentu masuk, router menentukan shard yang menyimpan data tersebut dan mengarahkan query ke server yang sesuai.
Tidak selalu dalam bentuk komponen khusus yang berdiri sendiri, tetapi sistem yang menggunakan sharding membutuhkan mekanisme untuk menentukan lokasi data dan mengarahkan query ke shard yang tepat. Pada MongoDB, fungsi tersebut dilakukan oleh mongos. Dalam arsitektur lain, routing dapat ditangani oleh middleware, application layer, database proxy, atau mekanisme bawaan platform. Karena itu, arsitektur aplikasi perlu mengetahui atau dapat menentukan shard mana yang harus menangani suatu operasi.
Sebelum menerapkan sharding, beberapa aspek penting perlu dianalisis.
1. Tentukan Pola Query
Pahami query yang paling sering digunakan aplikasi. Shard key sebaiknya mendukung pola query utama sehingga query dapat diarahkan ke shard yang relevan.
2. Pilih Shard Key dengan Hati-Hati
Shard key harus membantu mendistribusikan data dan workload secara merata. Kesalahan dalam memilih shard key dapat menyebabkan hotspot dan masalah scalability.
3. Perhatikan Distribusi Data
Jangan hanya melihat jumlah data. Distribusi request juga penting. Shard dengan data sedikit tetapi menerima sebagian besar request tetap dapat menjadi bottleneck.
4. Siapkan Monitoring
Pantau:
5. Siapkan Strategi Rebalancing
Pertumbuhan data dapat membuat distribusi awal menjadi tidak seimbang. Sistem perlu memiliki strategi untuk melakukan rebalancing.
6. Pertimbangkan Backup dan Recovery
Setiap shard merupakan bagian dari dataset. Strategi backup dan recovery harus mempertimbangkan seluruh shard agar data dapat dipulihkan secara konsisten.
Database sharding sering menjadi bagian dari arsitektur distributed database dan sistem berskala besar. Dalam implementasi tertentu, sharding dapat dikombinasikan dengan replication. Contohnya:
Application
│
Query Router
│
┌─────────────┼─────────────┐
↓ ↓ ↓
Shard 1 Shard 2 Shard 3
│ │ │
Replica Replica Replica
Dalam arsitektur seperti ini, sharding digunakan untuk membagi data, sedangkan replication digunakan untuk menyediakan salinan data dan meningkatkan availability. Kombinasi keduanya dapat membantu sistem menangani dataset besar sekaligus menyediakan redundancy, tetapi juga meningkatkan kompleksitas operasional.
Database sharding adalah teknik membagi data secara horizontal ke beberapa database atau server yang disebut shard. Tujuan utamanya adalah mendukung horizontal scaling sehingga kapasitas storage dan workload database tidak hanya bergantung pada satu server.
Dalam penerapannya, shard key menjadi salah satu komponen penting karena menentukan bagaimana data didistribusikan. Strategi seperti range-based sharding dan hash-based sharding memiliki karakteristik berbeda sehingga pemilihannya perlu disesuaikan dengan pola data dan query aplikasi.
Database sharding dapat membantu meningkatkan scalability, mendistribusikan workload, dan menangani dataset berukuran besar. Namun, penerapannya juga menambah kompleksitas dalam routing query, pemilihan shard key, rebalancing, monitoring, transaksi lintas shard, serta backup dan recovery.
Karena itu, database sharding tidak selalu diperlukan untuk setiap aplikasi. Teknik ini lebih tepat digunakan ketika satu database server mulai menghadapi keterbatasan kapasitas dan horizontal scaling memang dibutuhkan. Dengan perencanaan yang tepat, sharding dapat menjadi bagian penting dari arsitektur database untuk aplikasi berskala besar.
Bagi Anda yang ingin mempelajari lebih banyak mengenai database, server, hosting, jaringan, dan teknologi web, berbagai panduan teknis lainnya juga dapat ditemukan di blog Hosteko. Informasi tersebut dapat membantu menambah wawasan mengenai pengelolaan website, server, hosting, serta infrastruktur digital.
Memilih software ERP bukan sekadar membandingkan jumlah fitur atau mencari vendor yang paling populer. ERP…
Database replication adalah teknik untuk membuat dan mempertahankan salinan data dari satu database ke database…
Setelah memahami fungsi dan manfaat ERP, langkah berikutnya adalah mengenali model penerapan ERP, modul yang…
Setelah memahami pengertian dan cara kerja ERP, pembahasan berikutnya adalah fungsi serta manfaatnya bagi perusahaan.…
Mengelola banyak server dan perangkat dalam sebuah infrastruktur IT dapat menjadi pekerjaan yang kompleks jika…
Di tengah persaingan bisnis digital yang semakin ketat, perusahaan tidak cukup hanya mengandalkan strategi pemasaran…