1.4.4 自适应发送算法

抽象的

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

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

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

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

  1. NDB 传输器(TCP/IP 或共享内存)确定缓冲区已满并将其发送出去。缓冲区大小取决于实现,并且可能会在 NDB Cluster 版本之间发生变化。当 TCP/IP 是传输器时,缓冲区大小通常约为 64 KB。由于每个 Ndb对象为每个数据节点提供一个缓冲区,因此 完整缓冲区的概念对于每个数据节点都是本地的。

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

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

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

上面列出的条件在 NDB Cluster 的未来版本中可能会发生变化。