MOT介绍
MOT即Memory-Optimized Table,是openGauss数据库最先进的生产级特性(Beta版本),它为事务性工作负载提供更高的性能。
MOT在高性能(查询和事务延迟)、高可扩展性(吞吐量和并发量)以及高资源利用率(某些程度上节约成本)方面拥有显著优势。
企业可以在关键任务、性能敏感的在线事务处理OLTP中使用MOT,以实现高性能、高吞吐、可预测低延迟以及多核服务器的高利用率
MOT的关键技术如下:
- 免锁事务管理:MOT在保证严格一致性和数据完整性的前提下,采用乐观的策略实现高并发和高吞吐
- 免锁索引:由于内存表的数据和索引完全存储在内存中,MOT索引机制基于最先进的Masstree,这是一种用于多核系统的快速和可扩展的键值(Key Value,KV)存储索引,以B+树的Trie实现
- NUMA-aware的内存管理:MOT内存访问的设计支持非统一内存访问(NUMA)感知
- 高效持久性:日志和检查点是实现磁盘持久化的关键能力,也是ACID的关键要求之一(D代表持久性)
- 高SQL覆盖率和功能集:MOT通过扩展的PostgreSQL外部数据封装(FDW)以及索引,几乎支持完整的SQL范围,包括存储过程、用户定义函数和系统函数调用
- 使用PREPARE语句的查询原生编译:通过使用PREPARE客户端命令,可以以交互方式执行查询和事务语句。
- MOT和openGauss数据库的无缝集成:MOT是一个高性能的面向内存优化的存储引擎,已集成在openGauss包中。
如下图所示,openGauss数据库内存优化存储引擎组件(绿色部分)负责管理MOT和事务。
详见介绍参见:MOT简介
MOT 实践
授权权限及关闭增量检查点
- MOT通过外部数据封装器(Foreign Data Wrapper,FDW)机制与openGauss数据库集成,所以需要授权用户权限。
- 如果postgresql.conf中开启了增量检查点,则无法创建MOT。因此请在创建MOT前将enable_incremental_checkpoint设置为off。
-- select * from pg_foreign_server ;
-- select usename,usesysid from pg_user;
#授权权限
GRANT USAGE ON FOREIGN SERVER mot_server TO test;
#查看配置
show enable_incremental_checkpoint;
#修改配置,修改后需要重启数据库
alter system set enable_incremental_checkpoint='off';
创建表
参照TPC-C基准中的ORDER表创建MOT表,MOT表的定义详见下图
create foreign table mot_order (
o_id integer not null,
o_d_id integer not null,
o_w_id integer not null,
o_c_id integer not null,
o_entry_d timestamp,
o_carrier_id integer,
o_ol_cnt integer,
o_all_local integer,
primary key (o_w_id, o_d_id, o_id)
);
字 段 名 称 | 字 段 定 义 | 注 释 |
---|---|---|
O_ID | 10,000,000 unique IDs | |
O_D_ID | 20 unique IDs | |
O_W_ID | 2*W unique IDs | |
O_C_ID | 96,000 unique IDs | |
O_ENTRY_D | date and time | 制单时间 |
O_CARRIER_ID | 10 unique IDs, or null | 货运代号 |
O_OL_CNT | from 5 to 15 | 分录数 |
O_ALL_LOCAL | numeric, 1 digit | 是否全部本地供货 |
产生模拟数据
insert into mot_order
select number, (number % 20) + 1,ceil(random()*20000+1),ceil(random()*96000+1),'2020-12-02 00:00:00'::timestamp + number * interval '1 second',(number % 10),(number % 10)+5, ceil(random()*2) FROM generate_series(1,200000) as number;
查询
explain select * from mot_order where o_w_id=2 limit 4;
select * from mot_order where o_w_id=2 limit 4;
#SQL优化做得好,能根据索引调整条件的顺序
explain select * from mot_order where o_d_id=1 and o_w_id=2 limit 4;
数据库重启
gs_om -t restart
MOT恢复是随着openGauss数据库其余部分的恢复而自动执行的,并且完全集成到openGauss恢复过程(也称为冷启动)。
分为2个阶段:
- 检查点恢复:必须通过将数据加载到内存行并创建索引,从磁盘上的最新检查点文件恢复数据。
- WAL重做日志恢复:从检查点恢复中使用检查点后,必须通过重放之后添加到日志中的记录,从WAL重做日志中恢复最近的数据(在检查点中未捕获)。
删除表
drop foreign table mot_order;