diff --git a/README.md b/README.md index 392541b5f9..3795fc211a 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,35 @@ 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 @@ -56,15 +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. -## Project Status +## History -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 +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. -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