数据节点的所有内存分配都是在节点启动时执行的。这确保了数据节点可以在不使用交换内存的情况下以稳定的方式运行,因此
NDB
可以用于对延迟敏感(实时)的应用程序。在数据节点启动时分配以下类型的内存:
数据存储器
共享全局内存
重做日志缓冲区
作业缓冲区
发送缓冲区
磁盘数据记录的页面缓存
模式事务内存
交易记忆
撤消日志缓冲区
查询内存
块对象
图式记忆
块数据结构
长信号记忆
共享内存通信缓冲区
管理大部分数据节点内存的NDB
内存管理器处理以下内存资源:
数据存储器 (
DataMemory
)重做日志缓冲区 (
RedoBuffer
)作业缓冲区
发送缓冲区 (
SendBufferMemory
,TotalSendBufferMemory
,ExtraSendBufferMemory
,ReservedSendBufferMemory
)磁盘数据记录页面缓存 (
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
;否则,发送缓冲区的大小等于。
([
number of node
connections
] * SendBufferMemory) +
ExtraSendBufferMemory
磁盘数据记录的页面缓存仅使用保留资源;此资源的大小由
DiskPageBufferMemory
配置参数控制(默认 64 MB)。还分配了 32 KB 磁盘页面条目的内存;它们的数量由
DiskPageBufferEntries
配置参数决定(默认为 10)。
事务内存有一个保留部分,它要么由 计算,要么NDB
使用 NDB 8.0 中引入的配置参数显式设置
TransactionMemory
(以前,此值始终由 计算
NDB
);事务内存还可以使用无限量的共享全局内存。事务内存用于处理事务、扫描、锁定、扫描缓冲区和触发操作的所有操作资源。在下一次提交将它们写入数据内存之前,它还会在表行更新时保存它们。
以前,操作记录使用专用资源,其大小由许多配置参数控制。在 NDB 8.0 中,这些都是从公共事务内存资源分配的,也可以使用来自全局共享内存的资源。可以使用单个TransactionMemory
配置参数来控制此资源的大小。
可以使用
InitialLogFileGroup
配置参数设置为撤消日志缓冲区保留的内存。如果撤消日志缓冲区是作为CREATE LOGFILE GROUP
SQL 语句的一部分创建的,那么内存将从事务内存中获取。
许多与磁盘数据资源的元数据相关的资源也没有保留部分,仅使用共享全局内存。共享全局共享内存因此在发送缓冲区、事务内存和磁盘数据元数据之间共享。
如果TransactionMemory
未设置,则根据以下参数计算:
当TransactionMemory
显式设置时,刚才列出的配置参数都不会用于计算内存大小。另外参数
MaxNoOfConcurrentIndexOperations
,
MaxNoOfFiredTriggers
,
MaxNoOfLocalOperations
, 和MaxNoOfLocalScans
它不兼容,TransactionMemory
不能同时设置;如果
TransactionMemory
设置了并且
config.ini
配置文件中同时设置了这四个参数中的任何一个,则管理服务器无法启动。NDB 8.0 中不推荐使用这四个参数;期望它们从 MySQL NDB Cluster 的未来版本中删除。
事务内存资源包含大量内存池。每个内存池代表一个对象类型,包含一组对象;每个池都包含一个在启动时分配给池的保留部分;此保留内存永远不会返回到共享全局内存。保留记录是使用只有一个级别的数据结构来快速检索的,这意味着每个池中的一些记录应该被保留。每个池中保留记录的数量对性能和保留内存分配有一定影响,但通常只有在某些非常高级的用例中才需要明确设置保留大小。
可以通过设置以下配置参数来控制池保留部分的大小:
对于刚刚列出但未在中明确设置的任何参数config.ini
,保留设置计算为相应最大设置的 25%。例如,如果未设置,
ReservedConcurrentIndexOperations
则计算为 的 25%
MaxNoOfConcurrentIndexOperations
,ReservedLocalScans
计算为 的 25% MaxNoOfLocalScans
。
如果ReservedTransactionBufferMemory
未设置,则按 的 25% 计算
TransactionBufferMemory
。
保留记录的数量是每个数据节点;这些记录在每个节点上处理它们的线程(LDM 和 TC 线程)之间拆分。在大多数情况下,单独设置就足够了
TransactionMemory
,并允许池中的记录数由其值控制。
MaxNoOfConcurrentScans
限制每个 TC 线程中可以活动的并发扫描数。这对于防止集群过载很重要。
MaxNoOfConcurrentOperations
限制更新事务中任一时刻可以激活的操作数。(简单读取不受此参数影响。)需要限制此数量,因为需要为节点故障处理预分配内存,并且必须有资源可用于处理与竞争时一个 TC 线程中的最大活动操作数节点故障。必须
在所有节点上设置相同的数字(这可以通过在全局配置文件的部分中
MaxNoOfConcurrentOperations
为它设置一次值来最容易地完成)。虽然可以使用滚动重启来增加它的值(请参阅
第 23.6.5 节,“执行 NDB Cluster 的滚动重启”[ndbd
default]
config.ini
),由于在滚动重启期间可能发生节点故障,因此以这种方式减少它被认为是不安全的。
可以通过参数限制 NDB Cluster 中单个事务的大小
MaxDMLOperationsPerTransaction
。如果未设置,则一个事务的大小将受到限制,MaxNoOfConcurrentOperations
因为此参数限制了每个 TC 线程的并发操作总数。
模式内存大小由以下一组配置参数控制:
节点数和 LDM 线程数也对模式内存的大小有重大影响,因为每个表中的分区数和每个分区(及其片段副本)必须在模式内存中表示。
此外,在启动期间分配了一些其他记录。这些相对较小。每个线程中的每个块都包含使用内存的块对象。与其他数据节点内存结构相比,此内存大小通常也非常小。