自己动手实现RAFT算法
前段时间学习了一下分布式系统的raft算法,相比较Paxos协议,理解起来确实容易多了,于是就产生了自己动手实现一套基于raft一致性协议的分布式缓存的想法,经过大约两个月的空闲时间,终于完成了一个可以运行的python版本aducode/simple-raft-py
模块划分
项目主要包括如下几个模块:
1. server:
- main loop所在,在main loop中处理IO事件和超时事件(参考redis的实现)
def server_forever(self):
"""
启动服务
:return:
"""
# init the server runtime env
self.initialise()
# Main Loop
while self.inputs:
# handle io
self.handle_io_event()
# handle timer
self.handle_timeout_event()
if not self.is_running():
# stoppde or stopping
break
# release the resources
self.realease()
print 'Server stopped!'
- 网络模型采用IO多路复用模型,使用python的select模块
- 将socket连接封装成channel,channel中进行输入输出数据格式化处理,同时多个channel组成链式结构,按顺序格式化数据
class Channel(object):
def __init__(self, server, client, _next):
self.server = server
self.client = client
self.next = _next
def input(self, data, recv):
"""
:param data 数据
:param recv 是否从socket接受来的消息
当为False时,说明数据是发送到其他server的,不是server接受来的
"""
pass
def output(self):
pass
def close(self):
"""
说明socket被关闭,传递到handler
"""
return self.next.close()
- handler进行真正的逻辑