Skip to content

andrewtedja/raft-consensus-kv-store

Repository files navigation

Tugas Besar IF3130 - Sistem Paralel dan Terdistribusi

Implementasi Raft Consensus Algorithm

Proyek ini mengimplementasikan algoritma konsensus Raft menggunakan TypeScript dan gRPC untuk komunikasi antar node. Raft adalah algoritma konsensus terdistribusi yang dirancang untuk mengelola log yang direplikasi di sebuah cluster server.


Fitur

  • Distributed Key-Value Store - Penyimpanan key-value yang terdistribusi
  • Leader Election - Pemilihan leader otomatis saat leader gagal
  • Log Replication - Replikasi log ke semua node follower
  • Heartbeat Mechanism - Mekanisme heartbeat untuk deteksi kegagalan
  • Membership Change - Penambahan/penghapusan node secara dinamis
  • Transaction Support (BONUS) - Dukungan transaksi untuk operasi atomik
  • Jest Unit Testing (BONUS) - Unit testing untuk setiap komponen raft

Teknologi yang Digunakan

Teknologi Deskripsi
TypeScript Bahasa pemrograman utama dengan static typing
Node.js Runtime environment untuk menjalankan JavaScript/TypeScript
gRPC Framework RPC untuk komunikasi antar node
Protocol Buffers Serialisasi data untuk message gRPC
Jest Framework testing untuk unit tests
Docker Containerization untuk deployment cluster

Prasyarat

Pastikan Anda telah menginstal:

  • Node.js versi 18 atau lebih tinggi
  • npm (Node Package Manager)
  • Docker dan Docker Compose (untuk menjalankan dengan container)

Instalasi

1. Clone Repository

git clone https://github.com/labsister22/tugas-besar-if3130-sistem-paralel-dan-terdistribusi-mylittlecuda.git
cd tugas-besar-if3130-sistem-paralel-dan-terdistribusi-mylittlecuda

2. Install Dependencies

npm install

3. Generate Proto Files (Opsional)

Jika Anda perlu regenerate file proto:

npm run proto

Menjalankan Program

Metode 1: Menggunakan Docker Compose

Quick Start - Semua Node Sekaligus

Cara paling mudah untuk menjalankan cluster Raft dengan 4 node:

docker-compose up -d --build

Ini akan menjalankan:

  • Node 1 (Leader) pada port 5001
  • Node 2 (Follower) pada port 5002
  • Node 3 (Follower) pada port 5003
  • Node 4 (Follower) pada port 5004

Untuk menghentikan cluster:

docker-compose down

Sequential Start (Satu per Satu)

Untuk demo membership change atau melihat proses join:

# Start node1 saja (menjadi leader)
docker-compose up -d node1

# Join node2
docker-compose up -d node2

# Join node3
docker-compose up -d node3

# Join node4
docker-compose up -d node4

Melihat Logs (live follow)

# Semua nodes (gabungan)
docker-compose logs -f

# Single node
docker-compose logs -f node1
docker-compose logs -f node2

Metode 2: Menjalankan Manual Local (Development)

Menjalankan Node Pertama (Leader)

npm run server 5001

Menjalankan Node Tambahan (Follower)

Buka terminal baru untuk setiap node:

# Node 2
npm run server 5002 localhost:5001 localhost

# Node 3
npm run server 5003 localhost:5001 localhost

# Node 4
npm run server 5004 localhost:5001 localhost

Format Perintah:

npm run server <port> <contact_address> <hostname>
Parameter Deskripsi
port Port yang akan digunakan node
contact_address Alamat node yang sudah ada di cluster (untuk join)
hostname Hostname node (default: localhost)

Penggunaan Client

Client digunakan untuk berinteraksi dengan cluster Raft. Semua operasi akan diteruskan ke leader.

Menjalankan Client

npm run client <port> <command> [arguments...]

Perintah yang Tersedia

1. Ping - Cek koneksi ke node

npm run client 5001 ping

Output: PONG


2. Set - Menyimpan nilai dengan key

npm run client 5001 set <key> <value>

Contoh:

npm run client 5001 set nama "John Doe"
npm run client 5001 set umur 25

3. Get - Mengambil nilai berdasarkan key

npm run client 5001 get <key>

Contoh:

npm run client 5001 get nama
# Output: John Doe

4. Delete - Menghapus key

npm run client 5001 del <key>

Contoh:

npm run client 5001 del nama

5. Append - Menambahkan string ke nilai yang sudah ada

npm run client 5001 append <key> <value>

Contoh:

npm run client 5001 set greeting "Hello"
npm run client 5001 append greeting " World"
npm run client 5001 get greeting
# Output: Hello World

6. String Length - Mendapatkan panjang string

npm run client 5001 strln <key>

Contoh:

npm run client 5001 set pesan "Hello World"
npm run client 5001 strln pesan
# Output: 11

7. Request Log - Melihat log entries

npm run client 5001 request_log

Output akan menampilkan semua log entry dengan format:

[CLIENT] Retrieved N log entries
  [0] Term: 1, Command: set, Key: nama, Value: John
  [1] Term: 1, Command: set, Key: umur, Value: 25
  ...

8. Transaction - Menjalankan multiple commands secara atomik

npm run client 5001 txn <command1> <command2> ...

Format command: type:key=value

Contoh:

npm run client 5001 txn set:nama=John set:umur=25 append:nama=Doe

Arsitektur

┌─────────────────────────────────────────────────────────────┐
│                         CLIENT                               │
│                    (npm run client)                          │
└─────────────────────────────┬───────────────────────────────┘
                              │ gRPC
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                      RAFT CLUSTER                            │
│  ┌─────────┐    ┌─────────┐    ┌─────────┐    ┌─────────┐   │
│  │  Node1  │◄──►│  Node2  │◄──►│  Node3  │◄──►│  Node4  │   │
│  │ (Leader)│    │(Follower│    │(Follower│    │(Follower│   │
│  │  :5001  │    │  :5002  │    │  :5003  │    │  :5004  │   │
│  └─────────┘    └─────────┘    └─────────┘    └─────────┘   │
│       │              │              │              │         │
│       └──────────────┴──────────────┴──────────────┘         │
│                    Log Replication                           │
└─────────────────────────────────────────────────────────────┘

Struktur Direktori

.
├── src/
│   ├── client/
│   │   └── Client.ts
│   ├── constants/
│   │   └── constants.ts
│   ├── proto/
│   │   ├── raft.proto
│   │   └── raft.ts
│   ├── raft/
│   │   ├── RaftNode.ts
│   │   ├── RaftState.ts
│   │   ├── LogEntry.ts
│   │   ├── PersistentStore.ts
│   │   ├── commit/
│   │   │   └── AdvanceCommitIndex.ts
│   │   ├── handlers/
│   │   │   ├── AppendEntriesHandler.ts
│   │   │   ├── RequestVoteHandler.ts
│   │   │   ├── ExecuteHandler.ts
│   │   │   ├── MembershipHandler.ts
│   │   │   └── RequestLogHandler.ts
│   │   ├── statemachine/
│   │   │   ├── KVStore.ts
│   │   │   └── ApplyCommitted.ts
│   │   ├── timers/
│   │   │   ├── ElectionTimer.ts
│   │   │   ├── HeartbeatTimer.ts
│   │   │   └── StartElection.ts
│   │   ├── transitions/
│   │   │   ├── BecomeLeader.ts
│   │   │   └── StepDown.ts
│   │   └── utils/
│   │       ├── LogUtils.ts
│   │       └── TermUtils.ts
│   ├── rpc/
│   │   ├── client/
│   │   │   └── RaftRpcClient.ts
│   │   └── server/
│   │       ├── RaftRpcServer.ts
│   │       ├── NodeBootstrap.ts
│   │       ├── controllers/
│   │       └── helpers/
│   └── __tests__/
│       ├── raft/
│       ├── kvstore/
│       └── utils/
├── data/
├── docker-compose.yml
├── Dockerfile
└── package.json

File-file penting:

  • src/raft/RaftNode.ts - Core Raft node implementation
  • src/raft/handlers/ - RPC request handlers (AppendEntries, RequestVote, Execute, dll)
  • src/raft/statemachine/KVStore.ts - Key-value store state machine
  • src/rpc/server/NodeBootstrap.ts - Node startup dan auto-join logic
  • src/client/Client.ts - Client CLI untuk interaksi dengan cluster
  • docker-compose.yml - Docker compose untuk 4-node cluster
  • data/ - Persistent state storage

Testing

Jalankan unit tests:

npm run test

Dengan coverage:

npm run test:coverage

Mode watch (development):

npm run test:watch

Status Fitur

Fitur Status
Heartbeat Selesai
Leader Election Selesai
Log Replication Selesai
Membership Change Selesai
Unit Testing (bonus) Selesai
Transaction (bonus) Selesai
Log Compaction (bonus) Belum

Anggota Kelompok

Kelompok: MyLittleCuda

Name Student ID
Andrew Tedjapratama 13523148
Muhammad Farrel Wibowo 13523153
Theo Kurniady 13523154

About

Raft Consensus Algorithm with distributed k-v store, implemented with TS on top of gRPC and protobuffers

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages