openGauss数据库内存优化表MOT实践
一、MOT简介
内存优化表(Memory-Optimized Table,MOT)
- openGauss引入了MOT存储引擎,它是一种事务性行存储,针对多核和大内存服务器进行了优化。
- MOT是openGauss数据库最先进的生产级特性,它为事务性工作负载提供更高的性能。
- MOT完全支持ACID特性,并包括严格的持久性和高可用性支持。
- 原子性(Atomicity):原子事务是一系列不可分割的数据库操作。在事务完成(分别提交或中止)之后,这些操作要么全部发生,要么全部不发生。
- 一致性(Consistency):事务结束后,数据库处于一致状态,保留数据完整性。
- 隔离性(Isolation):事务之间不能相互干扰。MOT支持可重复读、读已提交和快照隔离级别。更多信息,请参见MOT隔离级别。
- 持久性(Durability):即使发生崩溃和失败,成功完成(提交)的事务效果持久保存。MOT完全集成了openGauss的基于WAL的日志记录。同时支持同步和异步日志记录选项。MOT还支持同步+面向NUMA优化的组提交。
- 企业可以在关键任务、性能敏感的在线事务处理(OLTP)中使用MOT,以实现高性能、高吞吐、可预测低延迟以及多核服务器的高利用率。
- 低延迟(Low Latency):提供快速的查询和事务响应时间。
- 高吞吐量(High Throughput):支持峰值和持续高用户并发。
- 高资源利用率(High Resource Utilization):充分利用硬件。
- MOT尤其适合在多路和多核处理器的现代服务器上运行,例如基于Arm/鲲鹏处理器的华为TaiShan服务器,以及基于x86的戴尔或类似服务器。
二、MOT应用场景
MOT可以根据负载的特点,显著加快应用程序的整体性能。MOT通过提高数据访问和事务执行的效率,并通过消除并发执行事务之间的锁和锁存争用,最大程度地减少重定向,从而提高了事务处理的性能。
MOT的极速不仅因为它在内存中,还因为它围绕并发内存使用管理进行了优化。数据存储、访问和处理算法从头开始设计,以利用内存和高并发计算的最新先进技术。
openGauss允许应用程序随意组合MOT和基于标准磁盘的表。对于启用已证明是瓶颈的最活跃、高争用和对性能敏感的应用程序表,以及需要可预测的低延迟访问和高吞吐量的表来说,MOT特别有用。
MOT可用于各种应用,例如:
- 高吞吐事务处理:
- 这是使用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)。
- 降低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覆盖和限制”的索引部分内容。
本文作者:博
欢迎观看作者技术文章:https://www.modb.pro/db/1854090417044819968
- 点赞
- 收藏
- 关注作者
评论(0)