21.5.2.3 群集日志中的事件缓冲区报告

NDB将一个或多个内存缓冲区用于从数据节点接收的事件。订阅 table 事件的每个Ndb对象都有一个这样的缓冲区,这意味着每个mysqld执行二进制日志记录通常有两个缓冲区(一个用于模式事件的缓冲区,一个用于数据事件的缓冲区)。每个缓冲区包含由事件组成的时期。这些事件包括操作类型(插入,更新,删除)和行数据(图像加元数据之前和之后)。

NDB在群集日志中生成消息以描述这些缓冲区的状态。尽管这些报告显示在群集日志中,但它们引用 API 节点上的缓冲区(与大多数其他群集日志消息不同,这些消息是由数据节点生成的)。这些消息及其基础的数据结构在 NDB 7.5.1 中进行了显着更改,增加了NDB_LE_EventBufferStatus2事件类型和ndb_logevent_EventBufferStatus2数据结构(请参见Ndb_logevent_type 类型)。本讨论的其余部分重点介绍基于NDB_LE_EventBufferStatus2的实现。

群集日志中的事件缓冲区日志记录报告使用以下格式:

Node node_id: Event buffer status (object_id):
used=bytes_used (percent_used% of alloc)
alloc=bytes_allocated (percent_alloc% of max) max=bytes_available
latest_consumed_epoch=latest_consumed_epoch
latest_buffered_epoch=latest_buffered_epoch
report_reason=report_reason

此处列出了构成此报告的字段,并提供了描述:

    • node_id *:报告来源的节点的 ID。
    • object_id *:报告来源的Ndb对象的 ID。
    • bytes_used *:缓冲区使用的字节数。
    • percent_used *:已使用的已分配字节百分比。
    • bytes_allocated *:分配给该缓冲区的字节数。
    • bytes_available *:可用字节数;如果ndb_eventbuffer_max_alloc为 0(无限制),则为 0.
    • latest_consumed_epoch *:最近消耗到完成的时代。 (在 NDB API 应用程序中,这是通过调用nextEvent()来完成的。)
    • latest_buffered_epoch *:最近(完全)在事件缓冲区中缓冲的时期。
    • report_reason *:做出报告的原因。可能的原因在本节后面显示。

latest_consumed_epochlatest_buffered_epoch字段分别对应于 NDB 7.5.1 之前使用的旧式事件缓冲区日志记录消息的apply_gcilatest_gci字段。

下 table 描述了可能的报告原因:

  • ENOUGH_FREE_EVENTBUFFER:事件缓冲区有足够的空间。

LOW_FREE_EVENTBUFFER:事件缓冲区的可用空间不足。

可以通过设置ndb_report_thresh_binlog_mem_usage服务器变量来调整触发这些报告的无阈值百分比级别。

  • BUFFERED_EPOCHS_OVER_THRESHOLD:缓冲的纪元数是否已超过配置的阈值。此数字是全部收到的最新纪元与最近消耗的纪元之间的差(在 NDB API 应用程序中,这是通过调用nextEvent()nextEvent2()完成的)。每秒生成一次报告,直到缓冲的纪元数低于阈值为止,可以通过设置ndb_report_thresh_binlog_epoch_slip服务器变量来调整该阈值。您还可以通过调用setEventBufferQueueEmptyEpoch()来调整 NDB API 应用程序中的阈值。

  • PARTIALLY_DISCARDING:事件缓冲区内存已用完,即已使用ndb_eventbuffer_max_alloc的 100%。即使使用率超过 100%,任何部分缓冲的纪元也会缓冲到完成,但接收到的任何新纪元都会被丢弃。这意味着事件流中已出现间隙。

  • COMPLETELY_DISCARDING:没有时期被缓冲。

  • PARTIALLY_BUFFERING:差距之后的无缓冲百分比已提高到阈值,可以在mysqlClient 端中使用ndb_eventbuffer_free_percent服务器系统变量或在 NDB API 应用程序中通过调用set_eventbuffer_free_percent()进行设置。新纪元被缓冲。由于间隔而无法完成的时期将被丢弃。

  • COMPLETELY_BUFFERING:正在缓冲接收到的所有纪元,这意味着有足够的事件缓冲存储器。事件流中的缝隙已消除。