首页 > 系统相关 >openGauss MOT内存和存储规划

openGauss MOT内存和存储规划

时间:2024-04-29 14:22:05浏览次数:27  
标签:max MOT 检查点 memory openGauss 日志 内存

MOT内存和存储规划

本节描述了为满足特定应用程序需求,在评估、估计和规划内存和存储容量数量时,需要注意的事项和准则,以及影响所需内存数量的各种数据,例如计划表的数据和索引大小、维持事务管理的内存以及数据增长的速度。

MOT内存规划

MOT是一种内存数据库存储引擎(IMDB),其中所有表和索引完全驻留在内存中。

说明:

内存存储是易失的,需要电力来维护所存储的信息。磁盘存储是持久的,写入磁盘是非易失性存储。MOT使用两种存储,既把所有数据保存在内存中,也把事务性更改同步(通过WAL日志记录)到磁盘上以保持严格一致性(使用同步日志记录模式)。

服务器上必须有足够的物理内存以维持内存表的状态,并满足工作负载和数据的增长。所有这些都是在传统的基于磁盘的引擎、表和会话所需的内存之外的要求。因此,提前规划好足够的内存来容纳这些内容是非常有必要的。

开始可以使用任何数量的内存并执行基本任务和评估测试。但当准备好生产时,应解决以下问题:

  • 内存配置

    openGauss数据库和标准Postgres类似,其内存上限是由max_process_memory设置的,该上限在postgres.conf文件中定义。MOT及其所有组件和线程,都驻留在openGauss进程中。因此,分配给MOT的内存也是在整个openGauss数据库进程的max_process_memory定义的上限内分配。

    MOT为自己保留的内存是max_process_memory的一部分。可以通过百分比或通过小于max_process_memory的绝对值定义。这个部分在mot.conf配置文件中由<min / max>_mot_<global / local>_memory配置项定义。

    max_process_memory中可以除了被MOT使用的部分之外,必须为openGauss封装留下至少2GB的可用空间。为了确保这一点,MOT在数据库启动过程中会进行如下校验:

    (max_mot_global_memory + max_mot_local_memory) + 2GB < max_process_memory
    

    如果违反此限制,则调整MOT内存内部限制,最大可能地满足上述限制范围。该调整在启动时进行,并据此计算MOT最大内存值。

    说明:

    MOT最大内存值是配置或调整值(max_mot_global_memory + max_mot_local_memory)的逻辑计算值。

    此时,会向服务器日志发出警告,如下所示:

    以下是报告问题的警告消息示例:

    [WARNING] <Configuration> MOT engine maximum memory definitions (global: 9830 MB, local: 1843 MB, session large store: 0 MB, total: 11673 MB) breach GaussDB maximum process memory restriction (12288 MB) and/or total system memory (64243 MB). MOT values shall be adjusted accordingly to preserve required gap (2048 MB).  
    

    以下警告消息示例提示MOT正在自动调整内存限制:

    [WARNING] <Configuration> Adjusting MOT memory limits: global = 8623 MB, local = 1617 MB, session large store = 0 MB, total = 10240 MB 
    

    新内存限制仅在此处显示。

    此外,当总内存使用量接近所选内存限制时,MOT不再允许插入额外数据。不再允许额外数据插入的阈值即是MOT最大内存百分比(如上所述,这是一个计算值)。默认值为90,即90%。尝试添加超过此阈值的额外数据时,会向用户返回错误,并且也会注册到数据库日志文件中。

  • 最小值和最大值

    为了确保内存安全,MOT根据最小的全局和本地设置预先分配内存。数据库管理员应指定MOT和会话维持工作负载所需的最小内存量。这样可以确保即使另一个消耗内存的应用程序与数据库在同一台服务器上运行,并且与数据库竞争内存资源,也能够将这个最小的内存分配给MOT。最大值用于限制内存增长。

  • 全局和本地

    MOT使用的内存由两部分组成:

    • 全局内存:全局内存是一个长期内存池,包含MOT的数据和索引。它平均分布在NUMA节点,由所有CPU核共享。

    • 本地内存:本地内存是用于短期对象的内存池。它的主要使用者是处理事务的会话。这些会话将数据更改存储在专门用于相关特定事务的内存部分(称为事务专用内存)。在提交阶段,数据更改将被移动到全局内存中。内存对象分配以NUMA-local方式执行,以实现尽可能低的延迟。

      被释放的对象被放回相关的内存池中。在事务期间尽量少使用操作系统内存分配(malloc)函数,避免不必要的锁和锁存。

      这两个内存的分配由专用的min/max_mot_global_memory和min/max_mot_local_memory设置控制。如果MOT全局内存使用量太接近最大值,则MOT会保护自身,不接受新数据。超出此限制的内存分配尝试将被拒绝,并向用户报告错误。

  • 最低内存要求

    在开始执行对MOT性能的最小评估前,请确保:

    除了磁盘表缓冲区和额外的内存,max_process_memory(在postgres.conf中定义)还有足够的容量用于MOT和会话(由mix/max_mot_global_memory和mix/max_mot_local_memory配置)。对于简单的测试,可以使用mot.conf的默认设置。

  • 生产过程中实际内存需求

    在典型的OLTP工作负载中,平均读写比例为80:20,每个表的MOT内存使用率比基于磁盘的表高60%(包括数据和索引)。这是因为使用了更优化的数据结构和算法,使得访问速度更快,并具有CPU缓存感知和内存预取功能。

    特定应用程序的实际内存需求取决于数据量、预期工作负载,特别是数据增长。

  • 最大全局内存规划:数据和索引大小

    要规划最大全局内存,需满足:

    1. 确定特定磁盘表(包括其数据和所有索引)的大小。如下统计查询可以确定customer表的数据大小和customer_pkey索引大小:

      • 数据大小:选择pg_relation_size('customer');
      • 索引:选择pg_relation_size('customer_pkey');
    2. 额外增加60%的内存,相对于基于磁盘的数据和索引的当前大小,这是MOT中的常见要求。

    3. 额外增加数据预期增长百分比。例如:

      5%月增长率 = 80%年增长率(1.05^12)。因此,为了维持年增长,需分配比表当前使用的还多80%的内存。

      至此,max_mot_global_memory值的估计和规划就完成了。实际设置可以用绝对值或openGauss max_process_memory的百分比来定义。具体的值通常在部署期间进行微调。

  • 最大本地内存规划:并发会话支持

    本地内存需求主要是并发会话数量的函数。平均会话的典型OLTP工作负载最大占用8MB。此值乘以会话的数量,再加一点额外的值。

    可以通过这种方式进行内存计算,然后进行微调:

    SESSION_COUNT * SESSION_SIZE (8 MB) + SOME_EXTRA (100MB should be enough)
    

    默认指定openGauss最大进程内存(默认为12GB)的15%。相当于1.8GB可满足230个会话,即max_mot_local内存需求。实际设置可以用绝对值或openGauss max_process_memory的百分比来定义。具体的值通常在部署期间进行微调。

  • 异常大事务

    某些事务非常大,因为它们将更改应用于大量行。这可能导致单个会话的本地内存增加到允许的最大限制,即1GB。例如:

    delete from SOME_VERY_LARGE_TABLE;
    

    在配置max_mot_local_memory设置和应用程序开发时,请考虑此场景。

    说明:

    有关配置的更多信息,请参阅内存(MOT)部分。

存储IO

MOT是一个内存优化的持久化数据库存储引擎。需要磁盘驱动器来存储WAL重做日志和定期检查点。

推荐采用低延迟的存储设备,如配置RAID-1的SSD、NVMe或者任何企业级存储系统。当使用适当的硬件时,数据库事务处理和竞争将成为瓶颈,而非IO。

由于持久性存储比RAM内存慢得多,因此IO操作(日志和检查点)可能成为内存中数据库和内存优化数据库的瓶颈。但是,MOT具有针对现代硬件(如SSD、NVMe)进行优化的高效持久性设计和实现。此外,MOT最小化和优化了写入点(例如,使用并行日志记录、每个事务的单日志记录和NUMA-aware事务组写入),并且最小化了写入磁盘的数据(例如,只把更改记录的增量或更新列记录到日志,并且只记录提交阶段的事务)。

容量需求

所需容量取决于检查点和记录的要求,如下所述:

  • 检查点

    检查点将所有数据的快照保存到磁盘。

    需要给检查点分配两倍数据大小的容量。不需要为检查点索引分配空间。

    检查点 = 2 x MOT数据大小(仅表示行,索引非持久)。

    检查点之所以需要两倍大小,是因为快照会保存数据的全部大小到磁盘上,此外还应该为正在进行的检查点分配同样数量的空间。当检查点进程结束时,以前的检查点文件将被删除。

说明:

在下一个openGauss版本中,MOT将有一个增量检查点特性,这将大大降低存储容量需求。

  • 日志记录

    MOT日志记录与基于磁盘的表的其它记录写入同一个数据库事务日志。

    日志的大小取决于事务吞吐量、数据更改的大小和检查点之间的时间(每次检查点,重做日志被截断并重新开始扩展)。

    与基于磁盘的表相比,MOT使用较少的日志带宽和较低的IO争用。这由多种机制实现。

    例如,MOT不会在事务完成之前记录每个操作。它只在提交阶段记录,并且只记录更新的增量记录(不像基于磁盘的表那样的完整记录)。

    为了确保日志IO设备不会成为瓶颈,日志文件必须放在具有低延迟的驱动器上。

说明:

有关配置的更多信息,请参阅存储(MOT)

详情查看:https://opengauss.org

详情查看:https://docs-opengauss.osinfra.cn

标签:max,MOT,检查点,memory,openGauss,日志,内存
From: https://www.cnblogs.com/renxyz/p/18165530

相关文章

  • openGauss 查询原生编译
    查询原生编译MOT的另一个特性是,在预编译的完整查询需要执行之前,能够以原生格式(使用PREPARE语句)准备并解析这些查询。这种原生格式方便后续更有效地执行(使用EXECUTE命令)。这种执行类型速度要快得多,因为原生格式在执行期间绕过多个数据库处理层,从而获得更好地性能。这种分工避免......
  • openGauss 查看审计结果
    查看审计结果前提条件审计功能总开关已开启。需要审计的审计项开关已开启。数据库正常运行,并且对数据库执行了一系列增、删、改、查操作,保证在查询时段内有审计结果产生。数据库各个节点审计日志单独记录。背景信息只有拥有AUDITADMIN属性的用户才可以查看审计记录。有......
  • openGauss 查看数据
    查看数据使用系统表pg_tables查询数据库所有表的信息。openGauss=#SELECT*FROMpg_tables;使用gsql的\d+命令查询表的属性。openGauss=#\d+customer_t1;执行如下命令查询表customer_t1的数据量。openGauss=#SELECTcount(*)FROMcustomer_t1;执行如下命......
  • openGauss 查看数据库连接数
    查看数据库连接数背景信息当用户连接数达到上限后,无法建立新的连接。因此,当数据库管理员发现某用户无法连接到数据库时,需要查看是否连接数达到了上限。控制数据库连接的主要以下几种选项。全局的最大连接数:由运行参数max_connections指定。某用户的连接数:在创建用户时由CREAT......
  • openGauss 查看参数值
    查看参数值openGauss安装后,有一套默认的运行参数,为了使openGauss与业务的配合度更高,用户需要根据业务场景和数据量的大小进行GUC参数调整。操作步骤以操作系统用户omm登录数据库主节点。使用如下命令连接数据库。gsql-dpostgres-p8000postgres为需要连接的数据库名......
  • openGauss 参数设置
    参数设置openGauss提供了多种修改GUC参数的方法,用户可以方便的针对数据库、用户、会话进行设置。参数名称不区分大小写。参数取值有整型、浮点型、字符串、布尔型和枚举型五类。布尔值可以是(on,off)、(true,false)、(yes,no)或者(1,0),且不区分大小写。枚举类型的取值是在系统表pg_s......
  • openGauss Schema
    SchemaSchema又称作模式。通过管理Schema,允许多个用户使用同一数据库而不相互干扰,可以将数据库对象组织成易于管理的逻辑组,同时便于将第三方应用添加到相应的Schema下而不引起冲突。每个数据库包含一个或多个Schema。数据库中的每个Schema包含表和其他类型的对象。数据库创建初......
  • openGauss SSL证书管理
    SSL证书管理openGauss默认配置了通过openssl生成的安全证书、私钥。并且提供证书替换的接口,方便用户进行证书的替换。证书生成-TLS证书生成-TLCP证书替换主备证书认证配置详情查看:https://opengauss.org详情查看:https://docs-opengauss.osinfra.cn......
  • openGauss MOT纵向扩容架构
    MOT纵向扩容架构纵向扩容即为同一台机器添加额外的核以增加算力。纵向扩容是传统上为单对控制器和多核的机器增加算力的常见形式。纵向扩容架构受限于控制器的可扩展性。技术要求MOT旨在实现以下目标:线性扩容:MOT提供事务性存储引擎,利用单个NUMA架构服务器的所有核,以提供近线......
  • openGauss mysql_fdw
    mysql_fdwmysql_fdw是一款开源插件。openGauss基于开源的mysql_fdwRelease2.5.3版本进行开发适配。编译和使用mysql_fdw需要环境上包含MariaDB的开发包,所以openGauss默认不编译mysql_fdw,下面依次介绍如何编译和使用mysql_fdw。编译mysql_fdw编译mysql_fdw需要安装MariaDB的......