Skip to content

Miaopashi/raftr-kv-demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Raft-KV-Demo

Raft-KV-Demo is a distributed KV system using raft protocol, which is access by memory.

This is a final homework of a column class. Since I completed this course by pirated material, I'm not sure whether the lecturer gave a better implementation.

Building

This repository uses [hashicorp-raft](GitHub - hashicorp/raft: Golang implementation of the Raft consensus protocol), so you'll need Go version 16+ installed.

There are two port needed in a single node (such as: 8080, 8079, one for HTTP service, the other for raft RPC). they can be set by -haddr and -raddr.

Documentiaon

Initiate raft node

For the first node to be initiated, you should use -bootstrap param. So that the first node will vote itself as the leader of cluster.

raft-kv-demo -id node1 -raddr cluster-host1:8080 -haddr cluster-host1:8079 -bootstrap

For other nodes, we can use -join, sending join http request to leader, to make the node join in the cluster.

raft-kv-demo -id node2 -raddr cluster-host2:8080 -haddr cluster-host2:8079 -join localhost:8079

Of course, onece you initiate the node by -join, you don't need to use -join fot the next initiation.

Try KV options by curl

After initiate the cluster, you can try to send http request to every node in the cluster.

curl -XGET "http://cluster-host1:8079/key?key=raft&level=default"
curl -XGET "http://cluster-host2:8079/key?key=raft&level=stale"
curl -XGET "http://cluster-host2:8079/key?key=raft&level=consistent"

curl -X POST http://cluster-host1:8079/key -d '{"key":"raft","value":"paxos"}'

curl -XDELETE "http://cluster-host1:8079/key/?key=raft"
curl -XDELETE "http://cluster-host2:8079/key/?key=raft"

As you can see, fot GET request, you can chose different level of consistent of the querying.

In default level, you must get KV in (new/old) leader.

In stale level, you can get KV both in follower ans leader.

In consistent level, you must get KV in the latest leader of the cluster.

For POST and DELETE request, you must send it to leader.

Redirection

If the node you send message is not leader, the http service will return you a 307 redirection. So the client will help you send same message to the latest leader.

Change member of cluster

You can send join or remove http request to add or delete node in cluster.

# addr param means RaftBind of the node need to be joined.
curl -XGET "http://cluster-host1:8079/join?id=node2&addr=cluster-host2:8080"

curl -XGET "http://cluster-host1:8079/remove?id=node2"

About

一个基于Raft协议的分布式KV缓存系统

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages