暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

openGauss数据库内存优化表MOT实践

openGauss 2024-12-04
230

一、MOT简介

内存优化表(Memory-Optimized Table,MOT)

  1. openGauss引入了MOT存储引擎,它是一种事务性行存储,针对多核和大内存服务器进行了优化。

  2. MOT是openGauss数据库最先进的生产级特性,它为事务性工作负载提供更高的性能。

  3. MOT完全支持ACID特性,并包括严格的持久性和高可用性支持。

  • 原子性(Atomicity):原子事务是一系列不可分割的数据库操作。在事务完成(分别提交或中止)之后,这些操作要么全部发生,要么全部不发生。

  • 一致性(Consistency):事务结束后,数据库处于一致状态,保留数据完整性。

  • 隔离性(Isolation):事务之间不能相互干扰。MOT支持可重复读、读已提交和快照隔离级别。更多信息,请参见MOT隔离级别。

  • 持久性(Durability):即使发生崩溃和失败,成功完成(提交)的事务效果持久保存。MOT完全集成了openGauss的基于WAL的日志记录。同时支持同步和异步日志记录选项。MOT还支持同步+面向NUMA优化的组提交。

  1. 企业可以在关键任务、性能敏感的在线事务处理(OLTP)中使用MOT,以实现高性能、高吞吐、可预测低延迟以及多核服务器的高利用率。

  • 低延迟(Low Latency):提供快速的查询和事务响应时间。

  • 高吞吐量(High Throughput):支持峰值和持续高用户并发。

  • 高资源利用率(High Resource Utilization):充分利用硬件。

  1. MOT尤其适合在多路和多核处理器的现代服务器上运行,例如基于Arm/鲲鹏处理器的华为TaiShan服务器,以及基于x86的戴尔或类似服务器。

二、MOT应用场景

MOT可以根据负载的特点,显著加快应用程序的整体性能。MOT通过提高数据访问和事务执行的效率,并通过消除并发执行事务之间的锁和锁存争用,最大程度地减少重定向,从而提高了事务处理的性能。

MOT的极速不仅因为它在内存中,还因为它围绕并发内存使用管理进行了优化。数据存储、访问和处理算法从头开始设计,以利用内存和高并发计算的最新先进技术。

openGauss允许应用程序随意组合MOT和基于标准磁盘的表。对于启用已证明是瓶颈的最活跃、高争用和对性能敏感的应用程序表,以及需要可预测的低延迟访问和高吞吐量的表来说,MOT特别有用。

MOT可用于各种应用,例如:

  1. 高吞吐事务处理:

    • 这是使用MOT的主要场景,因为它支持海量事务,同时要求单个事务的延迟较低。

    • 这类应用的例子有实时决策系统、支付系统、金融工具交易、体育博彩、移动游戏、广告投放等。

  2. 性能瓶颈加速:

    • 存在高争用现象的表可以通过使用MOT受益,即使该表是磁盘表。

    • 由于延迟更低、竞争和锁更少以及服务器吞吐量能力增加,此类表(除了相关表和在查询和事务中一起引用的表之外)的转换使得性能显著提升。

  3. 消除中间层缓存:

    • 云计算和移动应用往往会有周期性或峰值的高工作负载。

    • 此外,许多应用都有80%以上负载是读负载,并伴有频繁的重复查询。

    • 为了满足峰值负载单独要求,以及降低响应延迟提供最佳的用户体验,应用程序通常会部署中间缓存层。

    • 这样的附加层增加了开发的复杂性和时间,也增加了运营成本。

    • MOT提供了一个很好的替代方案,通过一致的高性能数据存储来简化应用架构,缩短开发周期,降低CAPEX和OPEX成本。

  4. 大规模流数据提取:

    • MOT可以满足云端(针对移动、M2M和物联网)、事务处理(Transactional Processing,TP)、分析处理(Analytical Processing,AP)和机器学习(Machine Learning,ML)的大规模流数据的提取要求。

    • MOT尤其擅长持续快速地同时提取来自许多不同来源的大量数据。
      这些数据可以在以后进行处理、转换,并在速度较慢的基于磁盘的表中进行移动。

  • 另外,MOT还可以查询到一致的、最新的数据,从而得出实时结果。
    在有许多实时数据流的物联网和云计算应用中,通常会有专门的数据摄取和处理。

  • 例如,一个Apache Kafka集群可以用来提取10万个事件/秒的数据,延迟为10ms。

  • 一个周期性的批处理任务会将收集到的数据收集起来,并将转换格式,放入关系型数据库中进行进一步分析。

  • MOT可以通过将数据流直接存储在MOT关系表中,为分析和决策做好准备,从而支持这样的场景(同时消除单独的数据处理层)。

  • 这样可以更快地收集和处理数据,MOT避免了代价高昂的分层和缓慢的批处理,提高了一致性,增加了分析数据的实时性,同时降低了总拥有成本(Total Cost of Ownership,TCO)。

  1. 降低TCO:
    提高资源利用率和消除中间层可以节省30%到90%的TCO。

三、MOT部署

1、操作系统设置

  • NUMA
    禁用NUMA平衡,如下所示。MOT以极其高效的NUMA-aware方式进行内存管理,远远超过操作系统使用的默认方法。

    echo 0 > /proc/sys/kernel/numa_balancing

    • 服务

    禁用如下服务:

      service irqbalance stop           # MANADATORY 
      service sysmonitor stop # OPTIONAL, performance
      service rsyslog stop       # OPTIONAL, performance

      • 调优服务

      以下为必填项。

      服务器必须运行throughput-performance配置文件。

        [...]$ tuned-adm profile throughput-performance 

        throughput-performance配置文件是广泛适用的调优,它为各种常见服务器工作负载提供卓越的性能。

        其他不太适合openGauss和MOT服务器的配置可能会影响MOT的整体性能,包括:平衡配置、桌面配置、延迟性能配置、网络延迟配置、网络吞吐量配置和节能配置。

        • 关闭enable_incremental_checkpoint

          vi postgresql.conf
          enable_incremental_checkpoint = off
          gs_ctl restart

          2、创建用户

          以授予数据库用户对MOT存储引擎的访问权限为例。每个数据库用户仅执行一次,通常在初始配置阶段完成。

          说明:MOT通过外部数据封装器(Foreign Data Wrapper,FDW)机制与openGauss数据库集成,所以需要授权用户权限。

          要使特定用户能够创建和访问MOT(DDL、DML、SELECT),以下语句只执行一次:

            openGauss=# CREATE USER usermot CREATEDB identified by 'user@MOT';
            GRANT USAGE ON FOREIGN SERVER mot_server TO usermot;

            所有关键字不区分大小写。

            3、 创建MOT表

            创建MOT非常简单。只有MOT中的创建和删除表语句与openGauss中基于磁盘的表的语句不同。SELECT、DML和DDL的所有其他命令的语法对于MOT表和openGauss基于磁盘的表是一样的。

            创建MOT:

              create FOREIGN table test(x int) server mot_server;


              以上语句中:

              始终使用FOREIGN关键字引用MOT。
              在创建MOT表时,[server mot_server]部分是可选的,因为MOT是一个集成的引擎,而不是一个独立的服务器。
              上文以创建一个名为test的内存表(表中有一个名为x的整数列)为例。在下一节(创建索引)中将提供一个更现实的例子。
              如果postgresql.conf中开启了增量检查点,则无法创建MOT。因此请在创建MOT前将enable_incremental_checkpoint设置为off。
              删除名为test的MOT:

                drop FOREIGN table test;
                ALTER TABLE

                支持添加列、删除列和重命名列。

                4、为MOT创建索引

                支持标准的PostgreSQL创建和删除索引语句。

                例如:

                  create index  text_index1 on test(x) ;

                  创建一个用于TPC-C的ORDER表,

                    create FOREIGN table bmsql_oorder ( 
                    o_w_id integer not null,
                    o_d_id integer not null,
                    o_id integer not null,
                    o_c_id integer not null,
                    o_carrier_id integer,
                    o_ol_cnt integer,
                    o_all_local integer,
                    o_entry_d timestamp,
                    primary key (o_w_id, o_d_id, o_id)
                    ); 

                    并创建索引:

                      create index  bmsql_oorder_index1 on bmsql_oorder(o_w_id, o_d_id, o_c_id, o_id) ;

                      说明:在MOT名字之前不需要指定FOREIGN关键字,因为它仅用于创建和删除表的命令。

                      有关MOT索引限制,请参见“MOT SQL覆盖和限制”的索引部分内容。


                      点击阅读原文跳转作者文章

                      文章转载自openGauss,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论