数据节点的所有内存分配都是在节点启动时执行的。这确保了数据节点可以在不使用交换内存的情况下稳定运行,从而使得 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。 -
要获取发送缓冲区的总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
,则它将基于以下参数计算:
当事务内存
被明确设置时,前面列出的所有配置参数都不用于计算内存大小。此外,参数MaxNoOfConcurrentIndexOperations
、MaxNoOfFiredTriggers
、MaxNoOfLocalOperations
和MaxNoOfLocalScans
与事务内存不兼容,不能与其同时设置;如果事务内存被设置,并且这些四个参数中的任何一个也在config.ini
配置文件中设置,那么管理服务器将无法启动。
参数MaxNoOfConcurrentIndexOperations
、MaxNoOfFiredTriggers
、MaxNoOfLocalOperations
和MaxNoOfLocalScans
均已弃用;您应该期望它们在未来版本的MySQL NDB Cluster中被删除。
事务内存资源包含许多内存池。每个内存池代表一个对象类型,包含一组对象;每个池包括在启动时分配给池的保留部分,这些保留内存从不返回共享的全局内存。保留记录使用只有一个级别的数据结构快速检索,这意味着每个池中应该保留一定数量的记录。每个池中的保留记录数量对性能和保留内存分配有一定的影响,但通常只有在某些非常高级的使用场景中才需要明确设置保留大小。
可以通过设置以下配置参数来控制每个池的保留部分的大小:
对于上面列出的任何未在config.ini
中明确设置的参数,其保留设置将被计算为相应的最大设置的25%。例如,如果未设置,ReservedConcurrentIndexOperations
将被计算为MaxNoOfConcurrentIndexOperations
的25%,ReservedLocalScans
将被计算为MaxNoOfLocalScans
的25%。
如果ReservedTransactionBufferMemory未设置,它将被计算为TransactionBufferMemory
的25%。
每个数据节点的保留记录数将被分配给处理它们的线程(LDM和TC线程);在大多数情况下,仅设置事务内存,并允许池中的记录数量由其值控制。
MaxNoOfConcurrentScans
限制了每个TC线程中可以活动的并发扫描数量。这对于防止集群过载非常重要。
最大并发操作数
限制了更新事务中可以活动的操作数。(简单的读取不受此参数影响。)需要限制这个数字,因为需要预分配内存以处理节点故障,并且需要在 TC 线程中处理最大活动操作时与节点故障竞争。强烈建议在所有节点上将 最大并发操作数
设置为相同的数字(可以在 [ndbd default]
部分的全局配置文件 config.ini
中设置一次)。虽然可以使用滚动重启(见 第 25.6.5 节,“执行 NDB 集群的滚动重启”)增加该值,但降低该值是不安全的,因为可能在滚动重启期间发生节点故障。
可以通过 每个事务的最大 DML 操作数
参数限制 NDB 集群中的单个事务大小。如果不设置该参数,则事务大小将由 最大并发操作数
限制,因为该参数限制了每个 TC 线程的总并发操作数。
模式内存大小由以下一组配置参数控制:
节点数和 LDM 线程数也对模式内存大小产生了重要影响,因为每个表和每个分区(及其碎片副本)都需要在模式内存中表示。
此外,在启动期间还分配了一些其他记录。这些记录相对较小。每个线程中的每个块都包含使用内存的块对象。该内存大小通常也相对较小,相比其他数据节点内存结构。