文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  数据节点内存管理

25.4.3.13 数据节点内存管理

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

  • 数据内存

  • 共享全局内存

  • 重做日志缓冲区

  • 作业缓冲区

  • 发送缓冲区

  • 磁盘数据记录的页面缓存

  • 模式事务内存

  • 事务内存

  • 撤消日志缓冲区

  • 查询内存

  • 块对象

  • 模式内存

  • 块数据结构

  • 长信号内存

  • 共享内存通信缓冲区

The 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 MB,因此总计为 26 MB。

  2. 要获取发送缓冲区的总保留大小,请将 ExtraSendBufferMemory 配置参数(如果有)的值(默认值为 0)添加到上一步获得的值。

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

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

事务内存有一个保留部分,该部分要么由 NDB 计算,要么使用 TransactionMemory 配置参数显式设置;事务内存还可以使用无限量的共享全局内存。事务内存用于处理所有操作资源,包括事务、扫描、锁、扫描缓冲区和触发器操作。它还保存更新后的表行,在下次提交将它们写入数据内存之前。

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

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

与磁盘数据资源的元数据相关的许多资源也无保留部分,并且仅使用共享全局内存。因此,共享全局内存由发送缓冲区、事务内存和磁盘数据元数据共享。

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

TransactionMemory 显式设置时,上面列出的配置参数都不用于计算内存大小。此外,参数 MaxNoOfConcurrentIndexOperationsMaxNoOfFiredTriggersMaxNoOfLocalOperationsMaxNoOfLocalScansTransactionMemory 不兼容,不能与其同时设置;如果设置了 TransactionMemory 并且在 config.ini 配置文件中也设置了这四个参数中的任何一个,则管理服务器无法启动。

参数 MaxNoOfConcurrentIndexOperationsMaxNoOfFiredTriggersMaxNoOfLocalOperationsMaxNoOfLocalScans 已被弃用;您应该预计它们将在 MySQL NDB Cluster 的未来版本中被移除。

事务内存资源包含大量内存池。每个内存池代表一种对象类型,并包含一组对象;每个池都包含在启动时分配给池的保留部分;此保留内存永远不会返回到共享全局内存。保留记录使用只有单个级别的快速检索数据结构找到,这意味着每个池中的许多记录都应该被保留。每个池中的保留记录数量对性能和保留内存分配有一些影响,但在某些非常高级的使用场景中,只有在显式设置保留大小的情况下才需要保留记录。

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

对于在 config.ini 中未显式设置的任何参数,保留设置将被计算为相应最大设置的 25%。例如,如果未设置,则 ReservedConcurrentIndexOperations 将被计算为 MaxNoOfConcurrentIndexOperations 的 25%,而 ReservedLocalScans 将被计算为 MaxNoOfLocalScans 的 25%。

注意

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

保留记录的数量是每个数据节点;这些记录将分布在每个节点上处理它们的线程(LDM 和 TC 线程)之间。在大多数情况下,仅设置 TransactionMemory 就足够了,并允许池中记录的数量由其值控制。

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

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

可以通过 MaxDMLOperationsPerTransaction 参数限制 NDB 集群中单个事务的大小。 如果未设置此参数,则一个事务的大小受 MaxNoOfConcurrentOperations 限制,因为此参数限制了每个 TC 线程的并发操作总数。

以下一组配置参数控制架构内存大小

节点数量和 LDM 线程数量也会对架构内存大小产生重大影响,因为每个表和每个分区(及其碎片副本)的划分数量必须在架构内存中表示。

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