ovsdb协议
- 基于json的RPC
- 协议定义参考 https://www.rfc-editor.org/rfc/rfc7047.txt
- 当前ovsdb-server(ovs 2.7.0)实现是单线程,性能很低,HA只有主备。
client库
自带 C 和 Python的。其他开源的库有
- golang
https://github.com/socketplane/libovsdb/blob/master/example/play_with_ovs.go
https://github.com/contiv/ofnet/blob/master/ovsdbDriver/ovsdbDriver.go
- python
ovsdbapp
以下是一个ovsdbapp使用的例子,
|
|
协议交互举例
ovs-vsctl操作的是ovs db。ovs-vswitchd有monitor ovs db,ovs db的变更都会发到ovs-vswitchd。ovs-vsctl和ovs-vswitchd都是通过ovsdb-server进程(unix socket或者是tcp连接)去watch或者update db的。
以ovs-vsctl add-port br0 abc -- set interface abc type=internal
为例,
ovs-vsctl会在ovsdb的Port表和Interface表增加一行数据,ovs-vswitchd收到通知后,会创建接口,并且把ofport,mtu,mac,link_state等信息写入Interface表里。写入是否成功呢,还是靠的监控通知机制。
ovs-vsctl -v
可以打印出ovs-vsctl和ovsdb-server详细的json rpc交互过程。
ovsdb-client monitor tcp:127.0.0.1:6640 Interface name,ofport,external_ids --format=json
这个命令可以watch某些表某些字段的变更通知:
1. 初始时会把所有的内容返回来。
2. 以后只会返回变化的。
3. 注意,返回的action里有initial,delete, new不是实际协议的内容,这是处理过了的。协议里只有old和new。见rfc里的4.1.6里的解释。
ovs-vswitchd消息处理过程如下,
- 收到update通知消息,
|
|
- 创建接口,
bridge br0: added interface abc on port 10
- 更新ovsdb,
发送transact请求1,
|
|
请求2,
|
|
- 收到update通知消息(因为上面的update transact),
update通知消息1,
|
|
update通知消息2,
|
|