etcd-io / raft

Raft library for maintaining a replicated state machine
Apache License 2.0
666 stars 164 forks source link

WIP: Add raft example #153

Open Elbehery opened 9 months ago

Elbehery commented 9 months ago

This PR add standalone raft example

resolves https://github.com/etcd-io/raft/issues/2

This PR supersedes https://github.com/etcd-io/raft/pull/67

The refactor commits are cherrypicked from https://github.com/Elbehery/raft/pull/1/commits

Elbehery commented 9 months ago

cc @mhagger @ahrtr

Elbehery commented 9 months ago

@serathius @pav-kv @ahrtr

i have added the wal and its deps from etcd repo, i know that this should be standalone without any deps.

however, the raft example requires wal. I need suggestions how to proceed

same issue exist with rafthttp.Transport.

pav-kv commented 9 months ago

@Elbehery Do you intend the example to be a fully-functional server with a fully-functional storage, and run each node in a different process?

My sense is that, for example purposes, you can cut corners, and make Storage and transport simple and in-memory. For example, you can use MemoryStorage from this repo. For implementing transport between nodes, you can take some inspiration from tests. All nodes can be in the same process, and transport can shuffle messages from one in-memory node to another.

I.e. things like wal are probably not needed.

Also, what kind of state-machine/commands do you want to support? I think it can also be super-simple, like a single-value register with a put and/or conditional-put command. Doesn't need to be a fully-fledged key-value store.

I think a much smaller example can be started up from taking code snippets in the README, and putting them together to work. It can be done gradually, for instance you don't need to support config changes in the first version.

Elbehery commented 9 months ago

@Elbehery Do you intend the example to be a fully-functional server with a fully-functional storage, and run each node in a different process?

My sense is that, for example purposes, you can cut corners, and make Storage and transport simple and in-memory. For example, you can use MemoryStorage from this repo. For implementing transport between nodes, you can take some inspiration from tests. All nodes can be in the same process, and transport can shuffle messages from one in-memory node to another.

Thanks @pav-kv for your comment

I actually also agree to keep it simple since it is an example. However, I think the example should at least have each raft node in a separate process iiuc

wdyt @ahrtr @serathius ?