Proyek ini mendemonstrasikan implementasi Horizontal Sharding pada MySQL menggunakan ProxySQL sebagai middleware routing dan Golang sebagai aplikasi client.
- MySQL Shard 1: Menyimpan data dengan ID Genap (Hostgroup 10).
- MySQL Shard 2: Menyimpan data dengan ID Ganjil (Hostgroup 20).
- ProxySQL: Berfungsi sebagai load balancer dan router yang menganalisis query SQL dan mengarahkannya ke shard yang benar berdasarkan ID.
- Golang App: Aplikasi sederhana yang melakukan operasi INSERT dan SELECT melalui ProxySQL.
.
├── app/ # Source code aplikasi Golang
│ ├── Dockerfile
│ ├── go.mod
│ └── main.go
├── mysql/ # Script inisialisasi database
│ ├── init-shard1.sql
│ └── init-shard2.sql
├── proxysql/ # Konfigurasi ProxySQL
│ └── proxysql.cnf
├── docker-compose.yml
└── README.md
- Pastikan Docker dan Docker Compose sudah terinstal.
- Jalankan perintah berikut:
docker-compose up --build
- Perhatikan log di terminal. Aplikasi Golang akan menunggu koneksi database, memasukkan data contoh, dan memverifikasi letak data tersebut (dari shard mana data diambil).
Aplikasi sekarang berjalan sebagai REST API di port 8087.
| Method | Endpoint | Keterangan |
|---|---|---|
| POST | /users |
Menambah user baru (sharding otomatis) |
| GET | /users/:id |
Mengambil data user berdasarkan ID |
| PUT | /users/:id |
Mengupdate data user |
| DELETE | /users/:id |
Menghapus user |
1. Tambah User (ID Ganjil -> Shard 2):
curl -X POST http://localhost:8087/users \
-H "Content-Type: application/json" \
-d '{"id": 1, "name": "Alice", "email": "alice@gmail.com"}'2. Tambah User (ID Genap -> Shard 1):
curl -X POST http://localhost:8087/users \
-H "Content-Type: application/json" \
-d '{"id": 2, "name": "Bob", "email": "bob@gmail.com"}'3. Ambil Data User:
curl http://localhost:8087/users/1Hasil JSON akan menyertakan field shard_info untuk menunjukkan dari mana data diambil.
Sharding diatur di proxysql/proxysql.cnf menggunakan mysql_query_rules. ProxySQL menggunakan Regular Expression (Regex) untuk mendeteksi ID pada perintah INSERT dan WHERE clause:
- Genap (
[02468]) -> Diarahkan kemysql-shard-1. - Ganjil (
[13579]) -> Diarahkan kemysql-shard-2.
Anda dapat masuk ke dalam container MySQL untuk melihat data secara langsung:
Cek Shard 1 (ID Genap):
docker exec -it mysql-shard-1 mysql -uuser -ppassword sharded_db -e "SELECT * FROM users;"Cek Shard 2 (ID Ganjil):
docker exec -it mysql-shard-2 mysql -uuser -ppassword sharded_db -e "SELECT * FROM users;"