NDB
使用一个或多个内存缓冲区来存储从数据节点接收到的事件。每个订阅表事件的 Ndb
对象都有一个这样的缓冲区,这意味着每个执行二进制日志记录的 mysqld 通常有两个缓冲区(一个用于架构事件,一个用于数据事件)。每个缓冲区都包含由事件组成的时期。这些事件由操作类型(插入、更新、删除)和行数据(前后镜像以及元数据)组成。
NDB
会在集群日志中生成消息来描述这些缓冲区的的状态。尽管这些报告出现在集群日志中,但它们指的是 API 节点上的缓冲区(这与大多数其他由数据节点生成的集群日志消息不同)。
集群日志中的事件缓冲区日志记录报告使用此处显示的格式
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
:生成报告的原因。可能的原因将在本节后面介绍。
报告的可能原因如下所述
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
:间隙后的缓冲区空闲百分比已上升到阈值,该阈值可以在 mysql 客户端中使用ndb_eventbuffer_free_percent
服务器系统变量或在 NDB API 应用程序中通过调用set_eventbuffer_free_percent()
来设置。新的时期被缓冲。由于间隙而无法完成的时期将被丢弃。COMPLETELY_BUFFERING
:接收到的所有时期都被缓冲,这意味着有足够的事件缓冲区内存。事件流中的间隙已关闭。