数据节点的所有内存分配在节点启动时执行。这确保数据节点可以稳定运行,无需使用交换内存,因此 NDB
可用于对延迟敏感(实时)的应用程序。以下类型的内存是在数据节点启动时分配的
数据内存
共享全局内存
重做日志缓冲区
作业缓冲区
发送缓冲区
磁盘数据记录的页面缓存
模式事务内存
事务内存
撤消日志缓冲区
查询内存
块对象
模式内存
块数据结构
长信号内存
共享内存通信缓冲区
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 MByte,因此总计为 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 线程数量也会对模式内存的大小产生重大影响,因为必须在模式内存中表示每个表中的分区数量以及每个分区(及其片段副本)。
此外,在启动期间还会分配许多其他记录。这些相对较小。每个线程中的每个块都包含使用内存的块对象。此内存大小通常也比其他数据节点内存结构小很多。