Skip to content

ajitirto/sharding-mysql

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MySQL Sharding Demo with ProxySQL, Golang, and Docker

Proyek ini mendemonstrasikan implementasi Horizontal Sharding pada MySQL menggunakan ProxySQL sebagai middleware routing dan Golang sebagai aplikasi client.

Arsitektur

  • 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.

Struktur Folder

.
├── 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

Cara Menjalankan

  1. Pastikan Docker dan Docker Compose sudah terinstal.
  2. Jalankan perintah berikut:
    docker-compose up --build
  3. Perhatikan log di terminal. Aplikasi Golang akan menunggu koneksi database, memasukkan data contoh, dan memverifikasi letak data tersebut (dari shard mana data diambil).

REST API Endpoints

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

Contoh Penggunaan (CURL)

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/1

Hasil JSON akan menyertakan field shard_info untuk menunjukkan dari mana data diambil.

Logika Sharding

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 ke mysql-shard-1.
  • Ganjil ([13579]) -> Diarahkan ke mysql-shard-2.

Verifikasi Manual

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;"

About

poc sharding mysql using proxysql

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors