VLCP 是一款为生产集群应用而严格设计开发的 SDN 控制器。它从根本性的设计上改变了以往 SDN 控制器不稳定的印象,使用 ZooKeeper + 专业的事务性技术为控制器集群提供同步性支持,使用先进的异步编程框架实现内部逻辑。
项目已经开发约18个月,目前已经在借贷宝公司小规模投产。在10台物理机组成的集群中进行压测,控制器可以在:每服务器1000+容器;16+Gbps 流量;每分钟、每服务器创建/删除两百个容器的高压力环境下长期稳定运行。VLCP 的最终设计目标是面向数千台物理服务器、数万乃至数十万个虚拟网络端点的巨型 IDC 环境中稳定运行,提供高效、可靠、可控的 SDN 网络。
VLCP 可以通过 vlcp-docker-plugin 与 docker 进行对接,为 docker 提供更多功能、更高稳定性的 SDN 网络,直接为容器提供外部网络连通性,或者子网之间的连通性等。
VLCP 使用协程化的架构实现了无锁、高性能的并发逻辑。基于 Pub/Sub 机制的协程同步机制为扩展提供了极大的便利。独特的调度器实现简化了许多异步逻辑,通过统一的中心队列在进程内实现了众多的生产者- 消费者模型,使得程序结构稳定、易读、统一排错:
VLCP 使用高可扩展性的模块化设计。每个模块都可以单独加载、单独卸载,加载不同模块即可为控制器添加新的功能。模块功能不仅限于 SDN,也包括外围功能如管理、监控、排障等。官方自带的模块就已经有了很丰富的内容:
VLCP利用ZooKeeper实现了统一的事务层——ObjectDB,保证了从任意节点的读写都满足事务性,并与其他节点的数据保持同步。事务层的使用简便而有特色,通过WALK与TRANSACT两个原语实现了任意的读事务和写事务;组合两者则可以实现任意的事务操作。同时,写入的内容会通过更新消息推送的机制推送到其他节点上,从而实时更新其他节点上的信息和流表。
VLCP使用一种通用的方式来解析OpenFlow中的二进制结构,利用了namedstruct库。这种库通过类似于C程序中结构体定义的语法定义出结构体并进行动态的解析或构造。这种写法很容易跟着OpenFlow的版本升级,甚至可以比较容易地保持以往程序的兼容性。同样的技术还用来解析以太网数据包和ZooKeeper协议。
VLCP使用OpenFlow1.3的多流表功能实现了从L2到L3的完整功能,这些功能可以通过独特的流表分配机制由模块系统进行扩展。现有的流表结构大致如下图所示:
VLCP支持预推送、OpenvSwitch学习、控制器学习与首包上传等多种不同运行策略。
VLCP甚至包含了内置的HTTP服务器,用于提供WebAPI接口;也可以用来开发简单的管理界面。
VLCP有统一的配置系统,很容易将配置文件映射到具体的类中的属性。