Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

25.4.3.13 数据节点内存管理

数据节点的所有内存分配都是在节点启动时执行的。这确保了数据节点可以在不使用交换内存的情况下稳定运行,从而使得 NDB 可以用于延迟敏感(实时)应用程序。以下类型的内存是在数据节点启动时分配的:

  • 数据内存

  • 共享全局内存

  • 重做日志缓冲区

  • 作业缓冲区

  • 发送缓冲区

  • 磁盘数据记录页缓存

  • 模式事务内存

  • 事务内存

  • 撤销日志缓冲区

  • 查询内存

  • 块对象

  • 模式内存

  • 块数据结构

  • 长信号内存

  • 共享内存通信缓冲区

NDB 内存管理器,负责管理大多数数据节点内存,处理以下内存资源:

每个资源都设置了一个保留内存区域和一个最大内存区域。保留内存区域只能由该资源使用,不能与其他资源共享;给定资源永远不能分配超过该资源允许的最大内存。一个资源如果没有最大内存限制,可以扩展到使用所有共享内存。

这些资源的全局共享内存大小由 SharedGlobalMemory 配置参数控制(默认:128 MB)。

数据内存总是保留的,永远不会从共享内存中获取内存。它是使用 DataMemory 配置参数控制的,最大值为 16384 GB。DataMemory 是记录存储的地方,包括哈希索引(每行约 15 字节)、有序索引(每行每个索引 10-12 字节)和行头(每行 16-32 字节)。

重做日志缓冲区也只使用保留内存;这由 RedoBuffer 配置参数控制,该参数设置每个 LDM 线程的重做日志缓冲区大小。这意味着实际使用的内存量是该参数值乘以数据节点中的 LDM 线程数。

作业缓冲区也只使用保留内存;该内存大小由 NDB 根据不同类型的线程数量计算。

发送缓冲区有一个保留部分,也可以从共享全局内存中分配额外的 25%。发送缓冲区的保留大小是通过两个步骤计算的:

  1. 使用 TotalSendBufferMemory 配置参数(无默认值)或所有个体连接到数据节点的发送缓冲区总和。数据节点连接到所有其他数据节点、所有 API 节点和所有管理节点。这意味着,在一个集群中有 2 个数据节点、2 个管理节点和 10 个 API 节点,每个数据节点有 13 个节点连接。由于数据节点连接的默认 SendBufferMemory 值为 2 MByte,因此总共是 26 MB。

  2. 要获取发送缓冲区的总reserved大小,需要将ExtraSendBufferMemory配置参数的值(默认值为0)添加到前一步骤中获得的值。

换言之,如果设置了TotalSendBufferMemory,则发送缓冲区的大小为TotalSendBufferMemory + ExtraSendBufferMemory;否则,发送缓冲区的大小等于([节点连接数] * SendBufferMemory) + ExtraSendBufferMemory

磁盘数据记录的页面缓存使用保留的资源;该资源的大小由DiskPageBufferMemory配置参数控制(默认64 MB)。还分配了32 KB磁盘页条目;这些条目的数量由DiskPageBufferEntries配置参数确定(默认10)。

事务内存有一个保留部分,该部分要么由NDB计算,要么使用TransactionMemory配置参数设置;事务内存也可以使用无限量的共享全局内存。事务内存用于处理事务、扫描、锁、扫描缓冲区和触发操作的所有操作资源。它还持有表行,直到下一个提交将其写入数据内存。

资源从公共事务内存资源中分配,也可以使用共享全局内存的资源。该资源的大小可以使用单个TransactionMemory配置参数控制。

可以使用InitialLogFileGroup配置参数设置undo日志缓冲区的保留内存。如果undo日志缓冲区是在CREATE LOGFILE GROUP SQL语句的一部分创建的,则内存来自事务内存。

与磁盘数据资源相关的一些元数据资源没有保留部分,只使用共享全局内存。因此,共享全局内存被send缓冲区、事务内存和磁盘数据元数据共享。

如果未设置TransactionMemory,则它将基于以下参数计算:

事务内存被明确设置时,前面列出的所有配置参数都不用于计算内存大小。此外,参数MaxNoOfConcurrentIndexOperationsMaxNoOfFiredTriggersMaxNoOfLocalOperationsMaxNoOfLocalScans事务内存不兼容,不能与其同时设置;如果事务内存被设置,并且这些四个参数中的任何一个也在config.ini配置文件中设置,那么管理服务器将无法启动。

参数MaxNoOfConcurrentIndexOperationsMaxNoOfFiredTriggersMaxNoOfLocalOperationsMaxNoOfLocalScans均已弃用;您应该期望它们在未来版本的MySQL NDB Cluster中被删除。

事务内存资源包含许多内存池。每个内存池代表一个对象类型,包含一组对象;每个池包括在启动时分配给池的保留部分,这些保留内存从不返回共享的全局内存。保留记录使用只有一个级别的数据结构快速检索,这意味着每个池中应该保留一定数量的记录。每个池中的保留记录数量对性能和保留内存分配有一定的影响,但通常只有在某些非常高级的使用场景中才需要明确设置保留大小。

可以通过设置以下配置参数来控制每个池的保留部分的大小:

对于上面列出的任何未在config.ini中明确设置的参数,其保留设置将被计算为相应的最大设置的25%。例如,如果未设置,ReservedConcurrentIndexOperations将被计算为MaxNoOfConcurrentIndexOperations的25%,ReservedLocalScans将被计算为MaxNoOfLocalScans的25%。

Note

如果ReservedTransactionBufferMemory未设置,它将被计算为TransactionBufferMemory的25%。

每个数据节点的保留记录数将被分配给处理它们的线程(LDM和TC线程);在大多数情况下,仅设置事务内存,并允许池中的记录数量由其值控制。

MaxNoOfConcurrentScans限制了每个TC线程中可以活动的并发扫描数量。这对于防止集群过载非常重要。

最大并发操作数 限制了更新事务中可以活动的操作数。(简单的读取不受此参数影响。)需要限制这个数字,因为需要预分配内存以处理节点故障,并且需要在 TC 线程中处理最大活动操作时与节点故障竞争。强烈建议在所有节点上将 最大并发操作数 设置为相同的数字(可以在 [ndbd default] 部分的全局配置文件 config.ini 中设置一次)。虽然可以使用滚动重启(见 第 25.6.5 节,“执行 NDB 集群的滚动重启”)增加该值,但降低该值是不安全的,因为可能在滚动重启期间发生节点故障。

可以通过 每个事务的最大 DML 操作数 参数限制 NDB 集群中的单个事务大小。如果不设置该参数,则事务大小将由 最大并发操作数 限制,因为该参数限制了每个 TC 线程的总并发操作数。

模式内存大小由以下一组配置参数控制:

节点数和 LDM 线程数也对模式内存大小产生了重要影响,因为每个表和每个分区(及其碎片副本)都需要在模式内存中表示。

此外,在启动期间还分配了一些其他记录。这些记录相对较小。每个线程中的每个块都包含使用内存的块对象。该内存大小通常也相对较小,相比其他数据节点内存结构。