这是一个简单的python实现的raft协议,只是为了学习raft而写的代码。 关于raft的资料可以参考: http://thesecretlivesofdata.com/raft/
目前进度:
- 完成基本的网络通讯框架,使用python select做多路IO复用
- 可以处理定时器事件
- 单节点可以进行一些基本的操作(get set del commit)
- cluster内节点选举
- Leader挂掉,其余节点从新选举出leader
- 单个客户端连接Leader节点进行update操作时实现Leader Follower之间数据同步
- client关闭后,node内进行资源释放
- leader关闭后,释放follower资源
- 开始编写简单的coroutine框架,简化异步的编程模型。
目标:
- 多个客户端连接Leader节点,Leader Follower之间数据同步
- 新增节点时同步数据(全量同步、增量同步)
新接入节点数据同步方案:
- 引入一个新的状态Syncing,表示正在进行数据同步
- Leader心跳request带上当前的commit log号
- Follower收到leader commit log号后比较自身log号,如果落后,则进入Syncing状态开始同步
- 同步完成转为follower
一些问题:
- 状态转换时,不能自动的处理状态内的定时时间处理函数
- 异步调用,整个程序的逻辑是分散的,考虑用yield协程重新改写一下事件循环的架构
Usage:
目前没有单独的客户端程序,可以使用telnet进行测试
$ telnet 127.0.0.1 2333
> set test 1
> @127.0.0.1:2335@redirect # 表示写操作被重定向到主节点
$ telnet 127.0.0.1 2335
> set test 1
> success # 写成功,事物未提交
> commit
> success # 提交成功,写操作同步到Followers
> get test
> 1 # 返回结果
BLOG: http://aducode.github.io/posts/2015-06-04/simple-raft-py.html