commit
bddabe564a
54
README.md
54
README.md
|
@ -1,19 +1,49 @@
|
|||
[![Build Status](https://travis-ci.org/benbjohnson/go-raft.png?branch=master)](https://travis-ci.org/benbjohnson/go-raft)
|
||||
|
||||
go-raft
|
||||
=======
|
||||
|
||||
[![Build Status](https://travis-ci.org/benbjohnson/go-raft.png?branch=master)](https://travis-ci.org/benbjohnson/go-raft)
|
||||
|
||||
## Overview
|
||||
|
||||
This is an Go implementation of the Raft distributed consensus protocol.
|
||||
Raft is a protocol by which a cluster of nodes can maintain a replicated state machine.
|
||||
The state machine is kept in sync through the use of a replicated log.
|
||||
|
||||
For more details on Raft, you can read [In Search of an Understandable Consensus Algorithm](https://ramcloud.stanford.edu/wiki/download/attachments/11370504/raft.pdf) by Diego Ongaro and John Ousterhout.
|
||||
For more details on Raft, you can read [In Search of an Understandable Consensus Algorithm][raft-paper] by Diego Ongaro and John Ousterhout.
|
||||
|
||||
## Project Status
|
||||
|
||||
This library is feature complete but should be considered experimental until it has seen more usage.
|
||||
If you have any questions on implementing go-raft in your project please file an issue.
|
||||
There is an [active community][community] of developers who can help.
|
||||
go-raft is under the MIT license.
|
||||
|
||||
[community]: https://github.com/benbjohnson/go-raft/contributors
|
||||
|
||||
### Features
|
||||
|
||||
- Leader election
|
||||
- Log replication
|
||||
- Configuration changes
|
||||
- Log compaction
|
||||
- Unit tests
|
||||
- Fast Protobuf Log Encoding
|
||||
- HTTP transport
|
||||
|
||||
### Projects
|
||||
|
||||
These projects are use go-raft:
|
||||
|
||||
- [coreos/etcd](https://github.com/coreos/etcd) - A highly-available key value store for shared configuration and service discovery
|
||||
- [benbjohnson/raftd](https://github.com/benbjohnson/raftd) - A reference implementation for using the go-raft library for distributed consensus.
|
||||
|
||||
If you have a project that you're using go-raft in, please add it to this README so others can see implementation examples.
|
||||
|
||||
## The Raft Protocol
|
||||
|
||||
This section provides a short simple summary of the Raft protocol from a high level.
|
||||
For a more detailed explanation on the failover process and election terms please see the full paper describing the protocol: [In Search of an Understandable Consensus Algorithm][raft-paper].
|
||||
|
||||
### Overview
|
||||
|
||||
Maintaining state in a single process on a single server is easy.
|
||||
|
@ -26,7 +56,7 @@ Servers can crash or the network between two machines can become unavailable or
|
|||
A distributed consensus protocol is used for maintaining a consistent state across multiple servers in a cluster.
|
||||
Many distributed systems are built upon the Paxos protocol but Paxos can be difficult to understand and there are many gaps between Paxos and real world implementation.
|
||||
|
||||
An alternative is the [Raft distributed consensus protocol](https://ramcloud.stanford.edu/wiki/download/attachments/11370504/raft.pdf) by Diego Ongaro and John Ousterhout.
|
||||
An alternative is the [Raft distributed consensus protocol][raft-paper] by Diego Ongaro and John Ousterhout.
|
||||
Raft is a protocol built with understandability as a primary tenant and it centers around two things:
|
||||
|
||||
1. Leader Election
|
||||
|
@ -53,17 +83,9 @@ By ensuring that this log is replicated identically between all the nodes in the
|
|||
Replicating the log under normal conditions is done by sending an `AppendEntries` RPC from the leader to each of the other servers in the cluster (called Peers).
|
||||
Each peer will append the entries from the leader through a 2-phase commit process which ensure that a majority of servers in the cluster have entries written to log.
|
||||
|
||||
For a more detailed explanation on the failover process and election terms please see the full paper describing the protocol: [In Search of an Understandable Consensus Algorithm](https://ramcloud.stanford.edu/wiki/download/attachments/11370504/raft.pdf)
|
||||
## History
|
||||
|
||||
Ben Johnson started this library for use in his behavioral analytics database called [Sky](https://github.com/skydb/sky).
|
||||
He put it under the MIT license in the hopes that it would be useful for other projects too.
|
||||
|
||||
## Project Status
|
||||
|
||||
The go-raft library is feature complete but in alpha.
|
||||
There is a reference implementation called [raftd](https://github.com/benbjohnson/raftd) that demonstrates how to use the library
|
||||
|
||||
The library will be considered experimental until it has significant production usage.
|
||||
I'm writing the library for the purpose of including distributed processing in my behavioral analytics database called [Sky](https://github.com/skydb/sky).
|
||||
However, I hope other projects can benefit from having a distributed consensus protocol so the go-raft library is available under MIT license.
|
||||
|
||||
If you have a project that you're using go-raft in, please add it to this README and send a pull request so others can see implementation examples.
|
||||
If you have any questions on implementing go-raft in your project, feel free to contact me on [GitHub](https://github.com/benbjohnson), [Twitter](https://twitter.com/benbjohnson) or by e-mail at [ben@skylandlabs.com](mailto:ben@skylandlabs.com).
|
||||
[raft-paper]: https://ramcloud.stanford.edu/wiki/download/attachments/11370504/raft.pdf
|
||||
|
|
Loading…
Reference in New Issue