数据节点内存管理
当数据节点启动时,将执行该节点的所有内存分配。这确保了数据节点可以在不使用交换内存的情况下稳定运行,因此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 MB,因此总计为26 MB。 - 要获取发送缓冲区的总保留大小,请使用
ExtraSendBufferMemory
配置参数的值(如果有)(默认值0)。将添加到上一步中获得的值。
换句话说,如果TotalSendBufferMemory
已设置,则发送缓冲区大小为TotalSendBufferMemory + ExtraSendBufferMemory
;否则,发送缓冲区的大小等于。([number of node connections]* SendBufferMemory)+ ExtraSendBufferMemory
磁盘数据记录的页面缓存仅使用保留的资源。此资源的大小由DiskPageBufferMemory
配置参数控制(默认为64 MB)。还分配了用于32 KB磁盘页面条目的内存。它们的数量由DiskPageBufferEntries
配置参数确定(默认为10)。
事务存储器具有一个保留部分,该保留部分可以由计算得出NDB
,也可以使用TransactionMemory
NDB 8.0.19中引入的配置参数进行显式设置(在以前的版本中,该值始终由计算得出NDB
);事务内存还可以使用无限数量的共享全局内存。事务内存用于处理事务,扫描,锁,扫描缓冲区和触发器操作的所有操作资源。在下一次提交将表行写入数据存储器之前,它还保存表行的更新。
在NDB 8.0.16及更早版本中,操作记录使用了专用资源,这些资源的大小由许多配置参数控制。从NDB 8.0.17开始,它们都是从公共事务内存资源分配的,也可以使用全局共享内存中的资源。在NDB 8.0.19和更高版本中,可以使用单个TransactionMemory
配置参数来控制此资源的大小。
可以使用InitialLogFileGroup
配置参数设置撤消日志缓冲区的保留内存。如果在CREATE LOGFILE GROUP
SQL语句中创建了撤消日志缓冲区,则该内存将从事务内存中获取。
与磁盘数据资源的元数据有关的许多资源也没有保留部分,仅使用共享的全局内存。因此,共享的全局共享内存在发送缓冲区,事务内存和磁盘数据元数据之间共享。
如果TransactionMemory
未设置,则根据以下参数计算:
MaxNoOfConcurrentOperations
MaxNoOfConcurrentTransactions
MaxNoOfFiredTriggers
MaxNoOfLocalOperations
MaxNoOfConcurrentIndexOperations
MaxNoOfConcurrentScans
MaxNoOfLocalScans
BatchSizePerLocalScan
TransactionBufferMemory
当TransactionMemory
被设定明确,没有刚上市的配置参数被用于计算存储器大小。此外,参数MaxNoOfConcurrentIndexOperations
,MaxNoOfFiredTriggers
,MaxNoOfLocalOperations
,和MaxNoOfLocalScans
与不兼容TransactionMemory
,并且不能同时进行其设置;如果TransactionMemory
设置了if 并且在config.ini
配置文件中还设置了这四个参数中的任何一个,则管理服务器将无法启动。这四个参数在NDB 8.0.19中已弃用,将从将来的MySQL NDB Cluster版本中删除。
事务内存资源包含大量内存池。每个内存池代表一个对象类型并包含一组对象。每个池包括在启动时分配给池的保留部分;此保留的内存永远不会返回到共享的全局内存。保留的记录是使用仅具有单个级别的数据结构来快速检索的,这意味着每个池中应保留许多记录。每个池中保留记录的数量会影响性能和保留内存分配,但是通常只有在某些非常高级的用例中才有必要显式设置保留大小。
可以通过设置以下配置参数来控制池的保留部分的大小:
ReservedConcurrentIndexOperations
ReservedFiredTriggers
ReservedConcurrentOperations
ReservedLocalScans
ReservedConcurrentTransactions
ReservedConcurrentScans
ReservedTransactionBufferMemory
如果未设置刚刚列出的参数,则保留设置为事务内存的25%。保留记录的数量是每个数据节点;这些记录在每个节点上分配在处理它们的线程(LDM和TC线程)中。在大多数情况下,TransactionMemory
单独设置并允许池中的记录数受其值控制就足够了。
MaxNoOfConcurrentScans
限制每个TC线程中可以激活的并发扫描数。这对于防止群集过载很重要。
MaxNoOfConcurrentOperations
限制在更新事务中任何时候可以激活的操作数。(简单读取不受此参数影响。)此数目需要受到限制,因为有必要为节点故障处理预先分配内存,并且在与一个TC线程进行冲突时,必须有资源可用于处理最大数量的活动操作。节点故障。必须MaxNoOfConcurrentOperations
在所有节点上将其设置为相同的数字([ndbd default]
在config.ini
全局配置文件的部分中,只需为其设置一次值就可以最轻松地完成此操作)。虽然可以使用滚动重启来增加其值(请参见“执行NDB群集的滚动重启”)以这种方式降低它的安全性不被认为是安全的,因为在滚动重启过程中可能会发生节点故障。
通过该MaxDMLOperationsPerTransaction
参数可以限制NDB Cluster中单个事务的大小。如果未设置,则一个事务的大小受到限制,MaxNoOfConcurrentOperations
因为此参数限制了每个TC线程的并发操作总数。
架构内存大小由以下配置参数集控制:
MaxNoOfSubscriptions
MaxNoOfSubscribers
MaxNoOfConcurrentSubOperations
MaxNoOfAttributes
MaxNoOfTables
MaxNoOfOrderedIndexes
MaxNoOfUniqueHashIndexes
MaxNoOfTriggers
节点的数量和LDM线程的数量也对架构内存的大小产生重大影响,因为每个表和每个分区(及其副本)中的分区数量必须在架构内存中表示。
此外,在启动过程中还会分配许多其他记录。这些相对较小。每个线程中的每个块都包含使用内存的块对象。与其他数据节点存储器结构相比,该存储器大小通常也很小。