一、多控制器需要同步的信息
- 路由信息配置
- 单播路由算法类型
- 单播路由算法参数
- 多播路由算法参数
- ARP缓存表信息
- 主机发现信息
- 用于失效恢复的路由信息维护
二、主从控制器工作
由多控制器模块与zookeeper通信,获知当前控制器在zookeeper的角色(master or slave)。
本方案采用逻辑主从,即对于交换机而言每个控制器的角色都是EQUAL,但控制器依据自身的角色进行工作。
1、主控制器模式–数据同步
当zookeeper判断当前控制器为master时,多控制器模块向其他模块发送事件,通知其余模块当前控制器的角色。当packet_in模块得知当前为master时,开始处理交换机发送的packet_in消息;
路由管理模块、代理ARP模块以及主机管理模块发送EventCreateZnode事件至多控制器模块,由多控制器模块执行
@set_ev_cls(multictrler_event.EventLocked)
def locked_handle(self, ev):
self.logger.info("this controllers is:%s", ev.role)
if ev.role is 'master':
self.send_event_to_observers(multictrler_event.EventCreateZnode("arp_table", ""))
self.send_event_to_observers(multictrler_event.EventWatchZnode("arp_table"))
elif ev.role is 'slave':
self.send_event_to_observers(multictrler_event.EventWatchZnode("arp_table"))
多控制器模块监听到EventCreateZnode、EventWatchZnode事件,并创建新节点,监听节点数据是否更新。
@set_ev_cls(multictrler_event.EventWatchZnode, MAIN_DISPATCHER)
def handle_watch_znode(self, ev):
flag = ev.flag
watch_file = PATH + FILE_PATH + flag + ".json"
fp = open(watch_file, 'w')
fp.close()
path = DATA_PATH + "/" + flag
watch = Watcher(self, path, self.handle, self.role)
# greenle = gevent.spawn(watch._watcher)
# greenle.join(