Parrot
Distributed key-value store based on Dynamo using Golang
Building
Build using Bazel. This builds all source files,
mocks, tests and generates Protocol Buffers/gRPC files:
$ bazelisk build --stamp --workspace_status_command=./version/version.sh ...
(or bazelisk build //pkg/raft:go_default_library)
Note bazelisk is used to ensure the correct version of Bazel is always used,
installed from Bazelisk.
--workspace_status_command
is required for the GIT commit to be included.
Use Gazelle to generate
all Bazel build files:
Generate BUILD.bazel
files when a dependency is added or file layout
modified using Gazelle:
$ bazelisk run //:gazelle
Run unit tests:
$ bazelisk test ...
Components
- Done - Requires optimization and extension Storage engine with gRPC
transport layer
- In Progress Replication to preference list (hard code the preference list for now)
** Forward to each replica (which is hard coded), no repair or conflict
resolution yet (just use LWW)
- TODO Cluster Membership and Failure Detection
- TODO Partitioning
- TODO Syncronization using Merkle Trees / Anti-Entropy / Repair
- TODO Hinted Handoff
- TODO Versioning & Conflict Resolution
Replication
On PUT and DELETE requests to a node (is a background routine), it will forward
this request to all other nodes (without waiting for a response - can later add
quorum support). This will not retry etc but leaves it up to anti-entropy
to repair any differences between nodes. Note this doesnt yet have any
partitioning so each node handles any request.