数据节点的所有内存分配在节点启动时执行。这确保数据节点可以在不使用交换内存的情况下稳定运行,因此NDB
可用于对延迟敏感(实时)的应用程序。以下类型的内存是在数据节点启动时分配的:
数据内存
共享全局内存
重做日志缓冲区
作业缓冲区
发送缓冲区
磁盘数据记录的页面缓存
模式事务内存
事务内存
撤消日志缓冲区
查询内存
块对象
模式内存
块数据结构
长信号内存
共享内存通信缓冲区
The NDB
内存管理器(它控制着大部分数据节点内存)处理以下内存资源:
数据内存 (
DataMemory
)重做日志缓冲区 (
RedoBuffer
)作业缓冲区
发送缓冲区 (
SendBufferMemory
,TotalSendBufferMemory
,ExtraSendBufferMemory
)磁盘数据记录页面缓存 (
DiskPageBufferMemory
,DiskPageBufferEntries
)事务内存 (
TransactionMemory
)查询内存
磁盘访问记录
文件缓冲区
每个资源都设置了保留内存区域和最大内存区域。保留内存区域只能由其保留的资源使用,不能与其他资源共享;给定资源永远不能分配超过该资源允许的最大内存。没有最大内存的资源可以扩展到使用内存管理器中的所有共享内存。
这些资源的全局共享内存大小由 SharedGlobalMemory
配置参数控制(默认值:128 MB)。
数据内存始终是保留的,并且从未从共享内存中获取任何内存。它使用 DataMemory
配置参数控制,其最大值为 16384 GB。 DataMemory
用于存储记录,包括哈希索引(每行大约 15 字节)、有序索引(每索引每行 10-12 字节)和行头(每行 16-32 字节)。
重做日志缓冲区也仅使用保留内存;这由 RedoBuffer
配置参数控制,该参数设置了每个 LDM 线程的重做日志缓冲区大小。这意味着实际使用的内存量是此参数的值乘以数据节点中的 LDM 线程数量。
作业缓冲区仅使用保留内存;此内存的大小由 NDB
根据各种类型线程的数量计算。
发送缓冲区有一个保留部分,但也可以分配共享全局内存的额外 25%。发送缓冲区保留大小分两步计算:
使用
TotalSendBufferMemory
配置参数的值(没有默认值)或所有与数据节点的单个连接使用的单个发送缓冲区的总和。一个数据节点连接到所有其他数据节点,所有 API 节点以及所有管理节点。这意味着,在一个包含 2 个数据节点、2 个管理节点和 10 个 API 节点的集群中,每个数据节点都有 13 个节点连接。由于数据节点连接的SendBufferMemory
的默认值为 2 MB,因此总计为 26 MB。要获取发送缓冲区的总保留大小,请将
ExtraSendBufferMemory
配置参数(如果有)的值(默认值为 0)添加到上一步获得的值。
换句话说,如果已设置 TotalSendBufferMemory
,则发送缓冲区大小为 TotalSendBufferMemory + ExtraSendBufferMemory
;否则,发送缓冲区的大小等于 ([
。节点连接数量
] * SendBufferMemory) + ExtraSendBufferMemory
磁盘数据记录的页面缓存仅使用保留资源;此资源的大小由 DiskPageBufferMemory
配置参数控制(默认值为 64 MB)。还为 32 KB 磁盘页面条目分配内存;这些条目的数量由 DiskPageBufferEntries
配置参数确定(默认值为 10)。
事务内存有一个保留部分,该部分要么由 NDB
计算,要么使用 TransactionMemory
配置参数显式设置;事务内存还可以使用无限量的共享全局内存。事务内存用于处理所有操作资源,包括事务、扫描、锁、扫描缓冲区和触发器操作。它还保存更新后的表行,在下次提交将它们写入数据内存之前。
资源从一个公共事务内存资源分配,也可以使用全局共享内存中的资源。此资源的大小可以使用单个 TransactionMemory
配置参数控制。
撤消日志缓冲区的保留内存可以使用 InitialLogFileGroup
配置参数设置。如果撤消日志缓冲区是在 CREATE LOGFILE GROUP
SQL 语句的一部分创建的,则内存将从事务内存中获取。
与磁盘数据资源的元数据相关的许多资源也无保留部分,并且仅使用共享全局内存。因此,共享全局内存由发送缓冲区、事务内存和磁盘数据元数据共享。
如果未设置 TransactionMemory
,则它将根据以下参数计算:
当 TransactionMemory
显式设置时,上面列出的配置参数都不用于计算内存大小。此外,参数 MaxNoOfConcurrentIndexOperations
、MaxNoOfFiredTriggers
、MaxNoOfLocalOperations
和 MaxNoOfLocalScans
与 TransactionMemory
不兼容,不能与其同时设置;如果设置了 TransactionMemory
并且在 config.ini
配置文件中也设置了这四个参数中的任何一个,则管理服务器无法启动。
参数 MaxNoOfConcurrentIndexOperations
、MaxNoOfFiredTriggers
、MaxNoOfLocalOperations
和 MaxNoOfLocalScans
已被弃用;您应该预计它们将在 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 线程数量也会对架构内存大小产生重大影响,因为每个表和每个分区(及其碎片副本)的划分数量必须在架构内存中表示。
此外,在启动期间还会分配许多其他记录。 这些记录相对较小。 每个线程中的每个块都包含使用内存的块对象。 此内存大小通常也比其他数据节点内存结构小得多。