1.4.4 自适应发送算法

摘要

讨论 NDB 集群和 NDB API 中事务处理和传输的机制,以及用于实现这些机制的对象。

当使用 NdbTransaction::execute() 发送事务时,它们不会立即传输到 NDB 内核。相反,事务被保存在一个特殊的发送列表(缓冲区)中,该列表位于它们所属的 Ndb 对象中。自适应发送算法决定何时应将事务实际传输到 NDB 内核。

NDB API 被设计为多线程接口,因此通常需要同时从多个线程传输数据库操作。NDB API 跟踪哪些 Ndb 对象正在向 NDB 内核传输信息,以及与 NDB 内核交互的预期线程数。请注意,一个给定的 Ndb 实例最多只能在一个线程中使用;不同的线程 不应 共享同一个 Ndb 对象。

有四种情况会导致数据库操作从 Ndb 对象缓冲区传输到 NDB 内核:

  1. NDB 传输器(TCP/IP 或共享内存)决定缓冲区已满并将其发送出去。缓冲区大小取决于实现,并且可能在 NDB 集群的不同版本之间发生变化。当使用 TCP/IP 作为传输器时,缓冲区大小通常约为 64 KB。由于每个 Ndb 对象为每个数据节点提供一个缓冲区,“满”缓冲区的概念对于每个数据节点都是局部的。

  2. 传输信息的统计数据的积累可能会强制将缓冲区发送到所有存储节点(即,当所有缓冲区都满时)。

  3. 每隔 10 毫秒,一个特殊的传输线程就会检查是否发生了任何发送活动。如果没有,则该线程将强制向所有节点传输。这意味着 20 毫秒是数据库操作在被调度之前保持等待的最长时间。在未来版本的 NDB 集群中,可能会将此限制设为 10 毫秒;比这更频繁的检查需要操作系统提供额外的支持。

  4. 对于受自适应发送算法影响的方法(例如 NdbTransaction::execute()),有一个 force 参数可以覆盖其在这方面的默认行为,并强制立即传输到所有节点。有关更多信息,请参阅各个 NDB API 类列表。

上述条件可能会在未来版本的 NDB 集群中发生变化。