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
*:分配给该缓冲区的字节数。
-
percent_alloc
*:使用的可用字节百分比;如果ndb_eventbuffer_max_alloc等于 0(不限),则不打印。
-
bytes_available
*:可用字节数;如果ndb_eventbuffer_max_alloc
为 0(无限制),则为 0.
-
latest_consumed_epoch
*:最近消耗到完成的时代。 (在 NDB API 应用程序中,这是通过调用nextEvent()来完成的。)
-
latest_buffered_epoch
*:最近(完全)在事件缓冲区中缓冲的时期。
-
report_reason
*:做出报告的原因。可能的原因在本节后面显示。
latest_consumed_epoch
和latest_buffered_epoch
字段分别对应于 NDB 7.5.1 之前使用的旧式事件缓冲区日志记录消息的apply_gci
和latest_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
:正在缓冲接收到的所有纪元,这意味着有足够的事件缓冲存储器。事件流中的缝隙已消除。