• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 数据节点内存管理

    当数据节点启动时,将执行该节点的所有内存分配。这确保了数据节点可以在不使用交换内存的情况下稳定运行,因此NDB可以用于对延迟敏感的(实时)应用程序。在数据节点启动时分配了以下类型的内存:

    • 资料储存
    • 共享的全局内存
    • 重做日志缓冲区
    • 作业缓冲区
    • 发送缓冲区
    • 磁盘数据记录的页面缓存
    • 模式事务存储器
    • 交易记忆
    • 撤消日志缓冲区
    • 查询内存
    • 块对象
    • 架构记忆
    • 块数据结构
    • 长信号记忆
    • 共享内存通信缓冲区

    NDB调节大部分数据节点内存的内存管理器处理以下内存资源:

    • 数据存储器(DataMemory
    • 重做日志缓冲区(RedoBuffer
    • 作业缓冲区
    • 发送缓冲区(SendBufferMemoryTotalSendBufferMemoryExtraSendBufferMemoryReservedSendBufferMemory
    • 磁盘数据记录页缓存(DiskPageBufferMemoryDiskPageBufferEntries
    • 交易记忆(TransactionMemory
    • 查询内存
    • 磁盘访问记录
    • 文件缓冲区

    这些资源中的每一个都设置有保留的存储区和最大的存储区。保留的内存区域只能由为其保留的资源使用,不能与其他资源共享;给定资源分配的资源永远不能超过该资源允许的最大内存。没有最大内存的资源可以扩展为使用内存管理器中的所有共享内存。

    这些资源的全局共享内存的大小由SharedGlobalMemory配置参数控制(默认值:128 MB)。

    数据存储器始终是保留的,从不从共享存储器获取任何存储器。它使用DataMemory配置参数控制,最大为16384 GB。DataMemory存储记录的地方,包括哈希索引(每行大约15个字节),有序索引(每个索引每行10-12字节)和行标题(每行16-32字节)。

    重做日志缓冲区也仅使用保留的内存。这由RedoBuffer配置参数控制,该参数设置每个LDM线程的重做日志缓冲区的大小。这意味着实际使用的内存量是此参数的值乘以数据节点中LDM线程的数量。

    作业缓冲区仅使用保留的内存。该内存的大小由NDB,根据各种类型的线程数来计算。

    发送缓冲区具有保留部分,但也可以分配额外的25%的共享全局内存。发送缓冲区保留大小是通过两个步骤计算的:

    1. 使用TotalSendBufferMemory配置参数的值(无默认值)或与数据节点的所有单个连接使用的单个发送缓冲区的总和。数据节点连接到所有其他数据节点,所有API节点和所有管理节点。这意味着,在具有2个数据节点,2个管理节点和10个API节点的群集中,每个数据节点具有13个节点连接。由于SendBufferMemory数据节点连接的默认值为 2 MB,因此总计为26 MB。
    2. 要获取发送缓冲区的总保留大小,请使用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被设定明确,没有刚上市的配置参数被用于计算存储器大小。此外,参数MaxNoOfConcurrentIndexOperationsMaxNoOfFiredTriggersMaxNoOfLocalOperations,和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线程的数量也对架构内存的大小产生重大影响,因为每个表和每个分区(及其副本)中的分区数量必须在架构内存中表示。

    此外,在启动过程中还会分配许多其他记录。这些相对较小。每个线程中的每个块都包含使用内存的块对象。与其他数据节点存储器结构相比,该存储器大小通常也很小。