OvSDB 副本同步机制

94 阅读3分钟

Source of truth database database whose content will be replicated to another database

数据源数据库,其内容将被复制到另一个数据库

  • Active server: ovsdb-server 提供到真实数据库源的 RPC 接口。
  • Standby server: ovsdb-server 提供RPC接口到数据库,不是真实的来源

设计

复制的总体设计包括一个 ovsdb-server(主服务器)将其数据库的状态通信给另一个ovsdb-server(备用服务器),以便后者将其自己的数据库保持在相同的状态。为了实现这一点,备用服务器充当主服务器的客户机,也就是说,它发送一个监视器请求,以便与活动服务器数据库中的更改保持同步。当来自主服务器的通知到达时,备用服务器执行必要的一组操作,使其数据库达到与主服务器数据库相同的状态:

image.png

备用服务器通过配置 --sync-from=server 选项连接到主服务器, 此选项将导致备用服务器在每次主循环迭代中尝试向主服务器发送监视器请求,直到主服务器响应为止。

当发送监视器请求时,备用服务器正在做以下事情:

  1. 擦除为其提供 RPC 接口的数据库的内容
  2. 打开 jsonrpc 通道与主服务器通信
  3. 获取位于主服务器中的所有数据库
  4. 对于在主服务器和备用服务器中具有相同模式的每个数据库:构造并发送一个监视请求消息,指定将被监视的表(即数据库上除黑名单[*]之外的所有表)。
  5. 将备用数据库设置为主数据库的当前状态

当网络不稳定,主备切换频繁,每次都是全量同步

发送监控器请求消息后,备用服务器将持续接收请求中指定的表发生更改的通知。后续将详细介绍处理此通知的过程。

主备流表同步范围 [*] 可以通过命令行选项——sync-exclude-tables=db:table[,db:table]…设定,其中 db 对应表所在的数据库。

同步业务进程

复制过程包括处理在备用服务器中收到的更新通知,这些通知是由先前发送到主服务器的监视器请求引起的。在每次循环迭代中,备用服务器尝试从主服务器接收消息,该消息可以是错误消息、回显消息(用于保持连接活动)或更新通知。如果消息是致命错误,备用服务器将与活动服务器断开连接,而不会丢失复制的数据。如果是回显消息,备用服务器也将用回显(echo)消息进行应答。如果消息是更新通知,则会进行以下处理:

  1. 创建一个新事务。

  2. 从通知的 params 成员中获取 对象

  3. 对于 对象中的每个 ,根据对象成员存在的条件检查应该执行哪些操作:

    • 如果旧成员不存在,则使用从新成员执行插入操作
    • 如果旧成员存在而新成员不存在,则使用从旧成员执行删除操作
    • 如果旧成员和新成员都存在,则从新成员中使用执行更新操作
  4. 提交事务。 如果在复制过程中发生错误,则通过重新发送新的监视器请求重新启动所有复制,如“设置复制”一节所述。

由于是事务的设计,所有重试都是“所有复制”。


# sets the name of the active server

ovsdb-server/set-remote-ovsdb-server {server}
   
# gets the name of the active server

ovsdb-server/get-remote-ovsdb-server
   

# causes the server to attempt to send a monitor request every main loop iteration

ovsdb-server/connect-remote-ovsdb-server
   
# closes the jsonrpc channel between the active server and frees the memory used for the replication configuration.
   
ovsdb-server/disconnect-remote-ovsdb-server

# sets the tables list that will be excluded from being replicated

ovsdb-server/set-sync-exclude-tables {db:table,...}
   

# gets the tables list that is currently excluded from replication

ovsdb-server/get-sync-excluded-tables