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

`新开发银行`为从数据节点接收到的事件使用一个或多个内存缓冲区。每个都有一个这样的缓冲区[`钕铁硼`](https://dev.mysql.com/doc/ndbapi/en/ndb-ndb.html)订阅表事件的对象，这意味着通常每个都有两个缓冲区[**mysqld**](mysqld.html)执行二进制日志记录（一个缓冲区用于模式事件，一个用于数据事件）。每个缓冲区包含由事件组成的时期。这些事件由操作类型（插入、更新、删除）和行数据（图像前后加上元数据）组成。

`新开发银行`在集群日志中生成消息来描述这些缓冲区的状态。尽管这些报告出现在集群日志中，但它们指的是 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`*: 的ID[`钕铁硼`](https://dev.mysql.com/doc/ndbapi/en/ndb-ndb.html)报告来源的对象。

-   *`bytes_used`*：缓冲区使用的字节数。

-   *`使用百分比`*：使用的分配字节的百分比。

-   *`bytes_allocated`*: 分配给这个缓冲区的字节数。

-   *`percent_alloc`*：使用的可用字节的百分比；如果不打印[`ndb_eventbuffer_max_alloc`](mysql-cluster-options-variables.html#sysvar_ndb_eventbuffer_max_alloc)等于 0（无限制）。

-   *`字节可用`*: 可用字节数；这是 0 如果`ndb_eventbuffer_max_alloc`为 0（无限制）。

-   *`latest_consumed_epoch`*：最近消耗到完成的纪元。（在 NDB API 应用程序中，这是通过调用[`下一个事件（）`](https://dev.mysql.com/doc/ndbapi/en/ndb-ndb.html#ndb-ndb-nextevent).)

-   *`latest_buffered_epoch`*：事件缓冲区中最近（完全）缓冲的纪元。

-   *`报告原因`*: 举报的原因。可能的原因将在本节后面显示。

    以下列表中描述了可能的报告原因：

-   `ENOUGH_FREE_EVENTBUFFER`：事件缓冲区有足够的空间。

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

    触发这些报告的无阈值百分比水平可以通过设置[`ndb_report_thresh_binlog_mem_usage`](mysql-cluster-options-variables.html#sysvar_ndb_report_thresh_binlog_mem_usage)服务器变量。

-   `BUFFERED_EPOCHS_OVER_THRESHOLD`: 缓冲的 epoch 数量是否超过了配置的阈值。这个数字是完整接收到的最新纪元与最近消费的纪元之间的差异（在 NDB API 应用程序中，这是通过调用[`下一个事件（）`](https://dev.mysql.com/doc/ndbapi/en/ndb-ndb.html#ndb-ndb-nextevent)要么[`下一个事件2()`](https://dev.mysql.com/doc/ndbapi/en/ndb-ndb.html#ndb-ndb-nextevent2)）。报告每秒生成一次，直到缓冲的 epoch 数低于阈值，可以通过设置[`ndb_report_thresh_binlog_epoch_slip`](mysql-cluster-options-variables.html#sysvar_ndb_report_thresh_binlog_epoch_slip)服务器变量。您还可以通过调用调整 NDB API 应用程序中的阈值[`setEventBufferQueueEmptyEpoch()`](https://dev.mysql.com/doc/ndbapi/en/ndb-ndb.html#ndb-ndb-seteventbufferqueueemptyepoch).

-   `部分丢弃`：事件缓冲内存已用尽——即 100%[`ndb_eventbuffer_max_alloc`](mysql-cluster-options-variables.html#sysvar_ndb_eventbuffer_max_alloc)已经用过。即使使用量超过 100%，任何部分缓冲的 epoch 都会被缓冲到完成，但接收到的任何新 epoch 都会被丢弃。这意味着事件流中出现了间隙。

-   `COMPLETELY_DISCARDING`：没有时代被缓冲。

-   `部分缓冲`: 跟随gap的buffer free百分比已经上升到阈值，可以在[**mysql**](mysql.html)客户端使用[`ndb_eventbuffer_free_percent`](mysql-cluster-options-variables.html#sysvar_ndb_eventbuffer_free_percent)服务器系统变量或在 NDB API 应用程序中通过调用[`set_eventbuffer_free_percent()`](https://dev.mysql.com/doc/ndbapi/en/ndb-ndb.html#ndb-ndb-set-eventbuffer-free-percent).新的纪元被缓冲。由于间隙而无法完成的 epoch 将被丢弃。

-   `COMPLETELY_BUFFERING`: 接收到的所有 epoch 都被缓冲，这意味着有足够的事件缓冲内存。事件流中的差距已关闭。
