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优化的组提交。

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

  • 低延迟(Low Latency):提供快速的查询和事务响应时间。
  • 高吞吐量(High Throughput):支持峰值和持续高用户并发。
  • 高资源利用率(High Resource Utilization):充分利用硬件。

5. 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)。

5. 降低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
### 如何在 openGauss 数据库中插入数据 #### 插入数据的方法 在 openGauss 中,可以通过 SQL 语句 `INSERT INTO` 来实现向中插入数据。以下是基本语法结构: ```sql INSERT INTO table_name (column1, column2, ..., columnN) VALUES (value1, value2, ..., valueN); ``` 此方法适用于单条记录的插入操作[^1]。如果需要高效地插入大量数据,则可以考虑批量插入的方式。 对于大规模的数据插入需求,例如物联网设备产生的实时数据流场景,openGauss 提供了高效的 MOT(Memory-Optimized Table)技术来加速写入性能。根据实际测试,在特定硬件配置下,通过多线程并行执行批量插入命令,吞吐量可达约 10000 记录/核,延迟约为 2.8 毫秒每批 10 条记录[^5]。 #### 批量插入示例 为了提高效率,推荐使用批量插入方式代替逐条插入。下面是一个简单的 Python 脚本示例,展示如何利用 `psycopg2` 库配合 openGauss 的 JDBC 驱动程序完成大批量数据加载任务[^2]: ```python import psycopg2 try: connection = psycopg2.connect( user="your_username", password="your_password", host="localhost", port="5432", database="your_database" ) cursor = connection.cursor() sql_query = """ INSERT INTO your_table (col1, col2) VALUES (%s,%s); """ records_to_insert = [('val1', 'val2'), ('val3', 'val4')] cursor.executemany(sql_query, records_to_insert) connection.commit() except Exception as e: print(f"Error occurred: {e}") finally: if connection: cursor.close() connection.close() ``` 以上脚本展示了如何一次性提交多个值到目标格中的两列里去[^2]。 #### 查询已插入的数据 要验证或者检索刚刚被加入的新纪录,可以采用标准 SELECT 查询语句: ```sql SELECT * FROM table_name WHERE condition; ``` 这里,“condition”代任何有效的过滤条件达式,比如匹配某个字段的具体数值等[^1]。 --- ###
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Gauss松鼠会

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

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

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

打赏作者

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

抵扣说明:

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

余额充值