OBCE 第三章实验 内存管理手动实践 深入了解Queuing(buffer)表

本文主要是介绍OBCE 第三章实验 内存管理手动实践 深入了解Queuing(buffer)表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验环境:oceanbase 企业版V3 1-1-1 架构。

1.查看当前资源情况

select unit_config_id,name,max_cpu,min_cpu,round(max_memory/1024/1024/1024) max_mem_gb, round(min_memory/1024/1024/1024) min_mem_gb, round(max_disk_size/1024/1024/1024) max_disk_size_gb  from __all_unit_config  order by unit_config_id;

2.黑屏创建oracle租户

(1)创建unit

CREATE RESOURCE UNIT unit1 MAX_CPU 3, MAX_MEMORY '6G', MAX_IOPS 10000,MAX_DISK_SIZE '500G', MAX_SESSION_NUM 1000, MIN_CPU=3, MIN_MEMORY='6G',MIN_IOPS=1000;

(2)创建资源池

create resource pool ora_pool_test unit = 'unit1',unit_num = 1;

(3)创建oracle租户

create tenant ob_ora resource_pool_list=('ora_pool_test'), primary_zone='RANDOM',comment 'oracle tenant/instance', charset='utf8' set ob_tcp_invited_nodes='%', ob_compatibility_mode='oracle';

这样我们就有了租户资源规格大小为 3C6G 的oracle类型租户。

开始实验:
 

步骤 1 登录 Oracle 租户的 sys 用户(注意不是 sys 租户),查看修改前参数值;修改隐含参数 _ob_queuing_fast_freeze_min_count 的默认值,此参数限制 delete 语句到达这个阈值 后, 触发对 queuing 表执行转储的操作;

show parameters like '_ob_queuing_fast_freeze_min_count';
alter system set "_ob_queuing_fast_freeze_min_count"=20000;

上面这个参数查不到值 ,应该类似于oracle 的隐含参数,目前还没搞清楚ob中oracle租户的隐含参数怎么查询,但可以直接修改。

步骤 2 创建并登录 tpcc 用户,授予 dba 权限,创建 2 张表,一张表为普通表,另外一个为 queuing 表

create user tpcc identified by obce_test;
grant dba to tpcc;
drop table tab_no_queue purge; 
drop table tab_queue purge; 
create table tab_no_queue (id int primary key, name varchar(10), contact 
varchar(20), addr varchar(100)); 
create table tab_queue(id int primary key, name varchar(10), contact varchar(20), 
addr varchar(100)) table_mode='queuing';

步骤3 查看两个表的主副本位置

SELECTtenant.tenant_name,meta.table_id,tab.table_name,partition_id,ZONE,svr_ip,svr_port,CASEWHEN ROLE = 1 THEN 'leader'WHEN ROLE = 2
THEN 'follower'ELSE NULLEND AS ROLE,tab.primary_zone
FROM__all_virtual_meta_table meta
INNER JOIN __all_tenant tenant ONmeta.tenant_id = tenant.tenant_id
INNER JOIN __all_virtual_table tab ONmeta.tenant_id = tab.tenant_idAND meta.table_id = tab.table_id
WHEREtenant.tenant_id = 1004
ORDER BYtenant.tenant_name,table_name,partition_id,ZONE;

步骤4 向表 tab_no_queue 添加测试数据

insert into tab_no_queue select level, 
case mod(level,5) 
when 0 then '张一'
when 1 then '李一'
when 2 then '王一'
when 3 then '赵一'
when 4 then '钱一'
else null
end
, '1234567890','Asia-China-Sichuan-Chengdu' 
from dual where mod(level,5)=3 connect by level <=200000;
commit;

我这里把50w变成了20w 执行了两次,不然很容易报

步骤5 执行一次表和租户级别的转储, 避免以上插入操作对本实验的影响

ALTER SYSTEM MINOR FREEZE TENANT=(ob_ora);

步骤6 确认转储成功

SELECT * FROM __all_zone WHERE name='merge_status';

查看 gv$merge_info,确认转储发生时间

select * from gv$merge_info where table_id =1103909674337105 order by start_time  desc limit 6;

步骤 7 执行批量 insert 语句,模拟此表被应用插入新数据的场景

insert into tab_no_queue select level, 
case mod(level,5) 
when 0 then '张一'
when 1 then '李一'
when 2 then '王一'
when 3 then '赵一'
when 4 then '钱一'
else null
end, '1234567890','Asia-China-Sichuan-Chengdu' from dual where mod(level,5) in (2) 
connect by level <=150000;
commit; 

步骤 8 登陆 sys 租户,查看 tab_no_queue 表在 memstore 的内存消耗情况, 关注 used_mb 字段值

select ip,table_id,partition_id,round(used/1024/1024,1) as used_mb,hash_items,btree_items,is_active from gv$memstore_info 
where table_id =1103909674337105;

步骤 9 模拟修改表的操作,了解多版本数据对 memstore 内存的使用

update tab_no_queue set name = '王二' where mod(id,5) in (2);
commit;

步骤 10 删除记录, 观察是否触发系统转储,理解隐含参数 ob_queuing_fast_freeze_min_count 的含义, 得出结果此参数对非 queuing 表无效

delete from tab_no_queue where mod(id,5) in (2);
commit;

步骤 11 查看表 tab_no_queue 的转储情况,确认没有转储

select * from gv$merge_info where table_id =1103909674337105 order by start_time 
desc limit 6;

再次执行 insert 和 delete 操作, 观察 tab_no_queue 表的转储情况, 确认没有转储发生
insert into tab_no_queue
select level, 
case mod(level,5) 
when 0 then '张一'
when 1 then '李一'
when 2 then '王一'
when 3 then '赵一'
when 4 then '钱一'
else null
end
, '1234567890','Asia-China-Sichuan-Chengdu' 
from dual 
where mod(level,5) in (4) 
connect by level <=150000;
delete from tab_no_queue where mod(id,5) in (4);
commit;

步骤 12 对 tab_no_queue 执行全表扫描, 查看 gv$sql_audit 的执行信息 , 注意 execute_time 时间(86744),记录与后面的 queuing 表对比。

select 
svr_ip,query_sql,trace_id,sql_id,plan_id,is_hit_plan,plan_type,elapsed_time, 
execute_time,get_plan_time,table_scan,memstore_read_row_count, 
ssstore_read_row_count from gv$sql_audit where tenant_id=1004 and query_sql like 
'select%, count(*) from tab_no_queue%';

步骤 13 对 tab_queue 表(queuing 表)执行以上相同的步骤,查询表 tab_queue 的 table_id 和 leader 副本所在的 Observer IP 地址; 注意 tenant_id 根据实际 tenant_id(我这里是1004), 记录 table_id(1103909674337106)和 IP(127.0.0.1)

select tenant.tenant_name,meta.table_id, tab.table_name, 
partition_id,zone,svr_ip,svr_port, case when role=1 then 'leader' when role=2 
then 'follower' else null end as role, tab.primary_zone from 
__all_virtual_meta_table meta inner join __all_tenant tenant on 
meta.tenant_id=tenant.tenant_id inner join __all_virtual_table tab on 
meta.tenant_id=tab.tenant_id and meta.table_id=tab.table_id where 
tenant.tenant_id=1004 and tab.table_name='TAB_QUEUE' order by 
tenant.tenant_name,table_name,partition_id,zone;

步骤 14 向 queuing 表(tab_queue)添加测试数据

insert into tab_queue select level, 
case mod(level,5) 
when 0 then '张一'
when 1 then '李一'
when 2 then '王一'
when 3 then '赵一'
when 4 then '钱一'
else null
end
, '1234567890','Asia-China-Sichuan-Chengdu' 
from dual where mod(level,5)=3 connect by level <=200000;
commit; 

这里level这个测试参数还是改为200000。

步骤 15 执行一次表和租户级别的转储, 避免以上插入操作对本实验的影响

ALTER SYSTEM MINOR FREEZE TENANT=(ob_ora);

步骤 16 确认转储结束

SELECT * FROM __all_zone WHERE name='merge_status';

 查看 gv$merge_info,确认转储发生时间
select * from gv$merge_info where table_id =1103909674337106 order by start_time 
desc limit 6;

 步骤 17 执行批量 insert 语句,模拟此表被应用插入新数据的场景

insert into tab_queue select level, 
case mod(level,5) 
when 0 then '张一'
when 1 then '李一'
when 2 then '王一'
when 3 then '赵一'
when 4 then '钱一'
else null
end, '1234567890','Asia-China-Sichuan-Chengdu' from dual where mod(level,5) in (2) 
connect by level <=150000;
commit;

步骤 18 登陆 sys 租户,查看 tab_queue 表在 memstore 的内存消耗情况, 关注 used_mb 字段值

select ip,table_id,partition_id,round(used/1024/1024,1) as 
used_mb,hash_items,btree_items,is_active from gv$memstore_info where table_id = 1103909674337106;

步骤 19 模拟修改表的操作 ,了解多版本数据对 memstore 内存的使用 

update tab_queue set name = '王二' where mod(id,5) in (2);
commit;

 

步骤 20 再次查看此步骤的内存消耗,可以看到 update 语句消耗更多内存

select ip,table_id,partition_id,round(used/1024/1024,1) as 
used_mb,hash_items,btree_items,is_active from gv$memstore_info where table_id = 1103909674337106;

 

步骤 21 删除记录,观察是否触发系统转储,理解隐含参数 ob_queuing_fast_freeze_min_count 的含义

delete from tab_queue where mod(id,5) in (2);
commit;

 

步骤 22 查看表 tab_queue 的转储情况, 确认发生转储的信息(若没有立即发现转储发生,可以等 待 30 秒左右,多次执行此命令)

select * from gv$merge_info where table_id =1103909674337106 order by start_time 
desc limit 6;

步骤 23 再次执行 insert 和 delete 操作,观察 tab_queue 表的转储情况, 确认发生一次新的转储

insert into tab_queue
select level, 
case mod(level,5) 
when 0 then '张一'
when 1 then '李一'
when 2 then '王一'
when 3 then '赵一'
when 4 then '钱一'
else null
end
, '1234567890','Asia-China-Sichuan-Chengdu' 
from dual 
where mod(level,5) in (4) 
connect by level <=150000;
delete from tab_queue where mod(id,5) in (4);
commit; 

(思考:比较和非 queuing 表 tab_no_queue 的转储情况,可以看到 tab_queue 在 delete 语句满足隐含参数(_ob_queuing_fast_freeze_min_count)设定的阈值时,立刻发生自 动转储,随即执行了 queuing 表独有的 buf minor merge,把刚刚转储生成的 mini sstable 与 major sstable 合并成一个 minor sstable,这个操作有利于对 queuing 表的全表扫描效率)

步骤 24 对 tab_queue 执行全表扫描, 查看 gv$sql_audit 的执行信息 , 注意 execution_time 时 间, 对比与非 queuing 表的执行时间, queuing 表明显缩短。

select 
svr_ip,query_sql,trace_id,sql_id,plan_id,is_hit_plan,plan_type,elapsed_time, 
execute_time,get_plan_time,table_scan,memstore_read_row_count, 
ssstore_read_row_count from gv$sql_audit where tenant_id=1004 and query_sql like 
'select%, count(*) from tab_queue%';

 

官网结论:从 queuing 表和 no queuing 表的执行时间对比结果得出,queue 表在用户多次执 行 DML 语句后造成内存数据增加,但是对批量 delete 语句自动转储对查询链路增加的问题 进行了优化, queuing 表的全表扫描总耗时大大减少

个人结论: 在oceanbase 的LSM-tree 架构中,对表进行DML操作,因为oceanbase是准内存性数据库,所以中间的记录都会在内存中记录,有点像PG中update方式(PG中update操作会先insert 再给原数据打上delete,但数据并没有真正删除)。所以当表中比较频繁的执行DML操作的时候,就会占用大量的内存,并且在做查询的时候也会扫描已经打上delete的数据块。PG中有autovacuum来清理数据块,oceanbase中也有buffer(Queuing表)来解决这个问题,对于table_mode='queuing' 的表,

当删除的数据量达到 _ob_queuing_fast_freeze_min_count

或删除的比例达到_ob_queuing_fast_freeze_min_threshold 则直接开始转储。

官网中有很明确的buffer(Queuing表)转储策略图:

 

我们在做实验的时候也可以看到明确的buf minor merge 标记,也可以看到 非buffer表的execute时间 38361 明显 大于buffer表的execute时间 13967。并且非buffer表没有自适应的转储策略。

文章有参考自官网OBCE 培训学习资料-官网内存管理学习资料

这篇关于OBCE 第三章实验 内存管理手动实践 深入了解Queuing(buffer)表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130597

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝