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

一、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的戴尔或类似服务器。

e8d88fb9-0964-4851-b30f-768bb48488e1.png

二、MOT应用场景

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

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

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

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

  1. 高吞吐事务处理:

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

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

性能瓶颈加速:

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

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

消除中间层缓存:

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

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

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

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

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

大规模流数据提取:

  • 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

b333dcd1-589d-4d97-acf9-946564813767.png

  • 服务

禁用如下服务:

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

bd5bde58-22c7-4494-9c22-01eec3e69be2.png

0d2d6b93-a1ad-40f9-865c-0a3c387aaeba.png

  • 调优服务

以下为必填项。

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

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

b7e34436-385f-4579-89a6-75807263cc76.png

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

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

  • 关闭enable_incremental_checkpoint

vi postgresql.confenable_incremental_checkpoint = offgs_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;

a96374c9-08e9-4378-a8d5-84a13975b3b4.png

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

3、 创建MOT表

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

创建MOT:

create FOREIGN table test(x int) server mot_server;

8e49b441-bee6-4783-bb12-8a51f9e90615.png
以上语句中:

始终使用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) ;

b3321a60-e75d-4750-9236-5ea779c36ff3.png

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

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


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

本文分享自微信公众号 - openGauss(openGauss)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“ OSC源创计划 ”,欢迎正在阅读的你也加入,一起分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

openGauss社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值