- Notifications
You must be signed in to change notification settings - Fork2
⛵ Raft Consensus Algorithm. gRPC for communication. Tested with a few cases.
License
iskyzh/raft
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Raft Consensus Algorithm implemented in C++. Refer tohttps://raft.github.io/ for original paper.
- Use vcpkg or other tools to install build dependencies (boost, gtest, grpc, protobuf, cpptoml).Use pip to install test dependencies.
apt install libboost-all-devvcpkg install gtest grpc protobuf cpptomlpip3 install -r tests/requirements.txt
- Generate protobuf header
export VCPKG_ROOT="$HOME/vcpkg"export VCPKG_DEFAULT_TRIPLET="x64-osx"cd protos&& ./generate.sh
- Build and run unit tests
cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmakecd build&& cmake --build../RaftTestexport RAFT_EXECUTABLE=$(pwd)/RaftService
- Use python to run system tests
pytest tests/
On macOS, there'll be some problems with launching subprocess in Python. Testing scriptwill retry launching until server is reachable.
Some changes were made on Raft RPC described in original paper. Thisimplementation uses gRPC for node communication, but I make requestand reply into 2 separate RPCs. Therefore it's not possible to corresponda response to a request. ForAppendEntries
RPC, prevLogTerm in requestshould be known when sending AppendEntries reply. Therefore alastAgreedLogIndex
field was added. For other reply RPCs, sender field is added.
Personally I would like to break down Raft protocol to many smallparts as it is more convenient to test.
core/
contains core Raft algorithm. The core algorithm (Instance.cpp
) containsonly 200+ lines of code.
rpc/
contains one RPC implementation with gRPC. Here I choose single-thread asynchronizedimplementation. All RPCs requests are pushed into a lock-free queue, and then are processedin the event-loop thread. This choice leads to the split of RPC request and response messagedescribed above. Therefore, thread lock usage is eliminated.
Insrc/
,mock_main.cpp
can be used to mock a Raft cluster with 'events',which means that there're no RPC requests and all RPC are simulated withevents and callbacks. You may adjustdrop_rate
anddelay
to mock anunstable network. You may add events to simulate events in network.Currently the mock main will kick off leader and restore it to test log consistency.It will generateRaftMockMain
executable.
grpc_main.cpp
uses gRPC for communication between clients. It also helps setup a Raft cluster. It will generateRaftMockRPC
executable.
service_main.cpp
is a real Raft client with server control for system testing.It corresponds toRaftService
executable.
System tests intests/
are written in Python. It will automatically run Raft serviceexecutable, build a 5-node cluster and test it with different conditions.
- Async log read and write