{"id":13630852,"url":"https://github.com/stateIs0/lu-raft-kv","last_synced_at":"2025-04-17T17:31:50.173Z","repository":{"id":40499956,"uuid":"165345084","full_name":"stateIs0/lu-raft-kv","owner":"stateIs0","description":"this is raft java project. raft-kv-storage ","archived":false,"fork":false,"pushed_at":"2024-09-19T14:50:01.000Z","size":193,"stargazers_count":804,"open_issues_count":19,"forks_count":215,"subscribers_count":12,"default_branch":"master","last_synced_at":"2024-11-08T22:36:49.053Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://thinkinjava.cn/2019/01/12/2019/2019-01-12-lu-raft-kv/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stateIs0.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-01-12T04:14:01.000Z","updated_at":"2024-11-07T10:25:28.000Z","dependencies_parsed_at":"2023-12-06T15:30:02.098Z","dependency_job_id":"bd157fbf-60e7-4cf1-9798-7d869de9800b","html_url":"https://github.com/stateIs0/lu-raft-kv","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stateIs0%2Flu-raft-kv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stateIs0%2Flu-raft-kv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stateIs0%2Flu-raft-kv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stateIs0%2Flu-raft-kv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stateIs0","download_url":"https://codeload.github.com/stateIs0/lu-raft-kv/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249360019,"owners_count":21257152,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T22:02:01.128Z","updated_at":"2025-04-17T17:31:49.866Z","avatar_url":"https://github.com/stateIs0.png","language":"Java","funding_links":[],"categories":["Java","数据库"],"sub_categories":[],"readme":"\n\n![visitors](https://visitor-badge.glitch.me/badge?page_id=stateIs0.lu-raft-kv\u0026left_color=green\u0026right_color=red)\n[![build status](https://travis-ci.com/stateis0/lu-raft-kv.svg?branch=master)](https://travis-ci.com/stateis0/lu-raft-kv)\n[![codecov](https://codecov.io/gh/stateis0/lu-raft-kv/branch/master/graph/badge.svg)](https://codecov.io/gh/stateis0/lu-raft-kv)\n![license](https://img.shields.io/github/license/stateis0/lu-raft-kv.svg)\n[![average time to resolve an issue](http://isitmaintained.com/badge/resolution/stateis0/lu-raft-kv.svg)](http://isitmaintained.com/project/stateis0/lu-raft-kv \"average time to resolve an issue\")\n[![percentage of issues still open](http://isitmaintained.com/badge/open/stateis0/lu-raft-kv.svg)](http://isitmaintained.com/project/stateis0/lu-raft-kv \"percentage of issues still open\")\n\n## Lu-Raft-KV-Storage\n\n这是一个 Java 版本的 Raft(CP) KV  分布式存储实现. 可用于 Raft 初学者深入学习 Raft 协议. \n\n相关文章 http://thinkinjava.cn/2019/01/12/2019/2019-01-12-lu-raft-kv/\n\n为了尽可能的保证数据一致性，该实现的\"性能\"没有基于 AP 的实现好。\n\n目前实现了 Raft 4 大核心功能的其中 2 个功能.\n\n1. leader 选举\n2. 日志复制\n3. 成员变更(未测试)\n4. 快照压缩(未实现)\n\n## Design \n\n完全是参照 RAFT 论文来写的. 没有任何妥协.\n\n![image](https://user-images.githubusercontent.com/24973360/50371851-b13de880-05fd-11e9-958a-5813b3b6d761.png)\n\n\n\n## quick start\n\n🔥🔥🔥🔥🔥 注意：该项目仅支持 oracle jdk8 启动。\n\n🔴🔴🔴🔴🔴 注意：idea 需要安装 lombok 插件。\n\n#### 验证 \"leader 选举\"\n\n1. 在 idea 中配置 5 个 application 启动项,配置 main 类为 RaftNodeBootStrap 类, 加入 -DserverPort=8775 -DserverPort=8776 -DserverPort=8777 -DserverPort=8778 -DserverPort=8779 \n  系统配置, 表示分布式环境下的 5 个机器节点.\n2. 依次启动 5 个 RaftNodeBootStrap 节点, 端口分别是 8775，8776， 8777, 8778, 8779.\n3. 观察控制台, 约 6 秒后, 会发生选举事件,此时,会产生一个 leader. 而  leader 会立刻发送心跳维持自己的地位.\n4. 如果leader 的端口是  8775, 使用 idea 关闭 8775 端口，模拟节点挂掉, 大约 15 秒后, 会重新开始选举, 并且会在剩余的 4 个节点中,产生一个新的 leader.  并开始发送心跳日志。\n\n#### 验证\"日志复制\"\n\n##### 正常状态下\n\n\n\n1. 在 idea 中配置 5 个 application 启动项,配置 main 类为 RaftNodeBootStrap 类, 加入 -DserverPort=8775 -DserverPort=8776 -DserverPort=8777 -DserverPort=8778 -DserverPort=8779 \n2. 依次启动 5 个 RaftNodeBootStrap 节点, 端口分别是 8775，8776， 8777, 8778, 8779.\n3. 使用客户端写入 kv 数据.\n4. 杀掉所有节点, 使用 junit test 读取每个 rocksDB 的值, 验证每个节点的数据是否一致.\n\n##### 非正常状态下\n\n1. 在 idea 中配置 5 个 application 启动项,配置 main 类为 RaftNodeBootStrap 类, 加入 -DserverPort=8775 -DserverPort=8776 -DserverPort=8777 -DserverPort=8778 -DserverPort=8779 \n2. 依次启动 5 个 RaftNodeBootStrap 节点, 端口分别是 8775，8776， 8777, 8778, 8779.\n3. 使用客户端写入 kv 数据.\n4. 杀掉 leader （假设是 8775）.\n5. 再次写入数据.\n6. 重启 8775.\n7. 关闭所有节点, 读取 RocksDB 验证数据一致性.\n\n\n## Acknowledgments\n\n感谢 SOFA-Bolt 提供 RPC 网络框架 https://github.com/alipay/sofa-bolt\n\n感谢 rocksDB 提供 KV 存储 https://github.com/facebook/rocksdb\n\n## License\n\n[Apache 2.0 License.](https://github.com/stateIs0/lu-raft-kv/blob/master/LICENSE)\n\n\n## Star History\n\n![Star History Chart](https://starchart.cc/stateis0/lu-raft-kv.svg)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FstateIs0%2Flu-raft-kv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FstateIs0%2Flu-raft-kv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FstateIs0%2Flu-raft-kv/lists"}