暂无图片
暂无图片
暂无图片
暂无图片
2
暂无图片

openGauss训练营学习心得——不懂数据库的测试不是好测试

原创 宋小宝 2022-05-19
1261

趁着周末给自己充充电,有幸参加了云和恩墨组织的《8小时玩转openGauss训练营——第三期》活动后,使自己对openGauss 又复习了一遍。此前接触到 openGaus 是由于工作的需要,项目中测试涉及到openGauss数据库,其实当时是一脸懵逼,因为之前的测试仅限于Oracle Mysql这些比较大众的数据库,接手这个测试很棘手,然后就各种途径去学习,找相关资料等,其实我当时测试的不是开源的openGauss,是华为 GaussDB(for openGauss),而且项目中涉及的还是集群,根本没有资料去学习,只有华为给的一套文档,自己参照文档安装,不过功夫不负有心,最终花了一周的时间搞好了,后面就开始我的测试啦。下面是这次周末训练营学习的一些总结,还请各位大佬多多指教。

一、openGauss

1. openGauss产品是集 商用+自用+开源相结合,而且内核将长期演进

2. 五大关键特性:高性能、高可用、高安全、高智能、全开放

3. 架构:数据库线程池 → SQL 引擎(SQL接口、SQL解析器、SQL优化器、并行执行、AI自调优) → 存储引擎(MVCC行存储引警 内存引警 列存储引警)

4. 体系结构:客户端 、链接驱动(JDBC/ODBC/Libpq)、instance、Database

5. 逻辑模块:客户端驱动、各类线程管理、通信管理、安全管理、SQL引擎、存储引擎、AI、通用组件、工具

6. SQL命令处理流程

image.png

7. 查询优化:

image.png

8.执行引擎:关系数据库本身是对关系集合Relation的运算操作,执行引擎作为运算的控制逻辑主要是围绕着关系运算来实现的

算子可以分成以下几类:扫描算子、控制算子、物化算子、连接算子

9. NUMA

image.png
image.png
image.png

10. CLOG 日志即事务提交日志,用来记录事务的最终状态,是XLOG日志的辅助,用来加速通过日志判断事务状态的过程,存在四种事务状态。

11. 64位事务ID:

  • 解决事务ID回卷问题,防止频繁vacuum对系统造成性能影响
  • 64位事务ID特性平滑升级,对现有业务无影响,高效率,低风险。
  • 老版本数据页面在页面头部增加xid_base(64bit), 避免对页面中的 tuple进行修改。

12. NUMA ARM原子指令:

  • 原子操作,用于多线程操作下,确保数据写入的一致性; 在多线程编程中实现不被打断的数据交换操作,避免同时改写某一数据时由于执行顺序不确定性及中断的不可预知性导致数据不一致问题。

13. 数据库事务机制:

  • 事务的持久性(Durability)主要 通过预写式日志WAL算法实现。在事 务提交时,采用预写式日志方式,把 REDO日志写到磁盘。
  • 检查点:将脏缓冲队列上的全部 数据写出到数据文件。

14. 增量检查点技术原理:

  • 每一个脏数据库块都会被记录到脏页队列,按照第一次对此数据块修改时日志的LSN顺序来排列,如果一个数据块进行多 次修改,该数据块在脏页队列中的顺序并不会发生变化。
  • 在执行增量检查点时,把一定LSN之前的脏页刷盘,不需要把所有dirty buffer 全部写到磁盘。
  • 效果:
    • IO均分到各个阶段,性能更加平稳。
    • Checkpoint点效率和频率更高,减少宕机恢复时间,降低RTO。

15. 大并发问题解决方案

  • 连接池一般在客户端设置,连接池避免了连接的频繁创建和销
    毁。连接复用。
  • 线程池在数据库服务器上配置,控制数据库服务器活动线程数
    目。线程复用。对系统的业务起到流控作用,防止出现雪崩。
  • 在高并发场景下,可以将连接池和线程池结合起来使用。

16. 线程池实现原理

  • 客户端向数据库发起连接请求,PostMaster线程接收到连接请求并被唤醒求。PostMaster
    线程创建该连接对应的socket,以及创建session数据结构。遍历当前所有的Thread
    Group,找到当前活跃session数量最少的Thread Group,并把最新的session分发给该
    Thread Group,加入到该Thread Group 的epoll列表之中。
  • Thread Group的listener线程负责监听epoll列表中所有的客户连接。
  • 客户端发起任务请求,listener线程被唤醒。Listener线程检查当前的Thread Group 是否
    有空闲worker线程,如果有,则把当前session分配给该worker线程,并唤醒该worker线
    程;如果没有,则把该session放在等待队列之中。
  • worker线程被唤醒后,读取客户端连接上的请求,执行相应请求,并返还请求结果。在一
    次事务结束(提交、回滚),或者事务超时退出的时候,worker线程的一次任务完成。
    worker线程将session返回给listener线程,listener线程继续等待该session的下一次请
    求。worker线程返还session后,检查session等待队列,如果存在等待响应请求的
    session,则直接从该队列中取出新的session并继续工作;如果没有等待响应的session,
    则将自身标记为free状态,等待listener线程唤醒。
  • 客户端断开连接时,listener线程被唤醒,关闭连接,同时清理session相关结构,释放内
    存和fd等资源。
    image.png

17. 行存&列存

image.png
image.png

18. MOT

image.png
image.png

二、openGauss安全技术:

image.png

  • 密态价值:通过技术手段实现数据密文查询和计算,彻底解决数据库中的数据泄露问题及运维管理服务信任问题;
  • 软件思路:在数据库服务侧全程存储密文,通过数学算法在密文空间直接查询运算,保障数据隐私不泄露;
  • 硬件思路:借助物理隔离或逻辑隔离明文计算空间,通过访问控制,实现计算及数据对外“不可见”,防止数据泄露;

三、两天的训练营内容其实还是很多的,老师们讲的好多得慢慢消化,不过感觉自己收获还是挺多的,之前只是简单的会用,会写sql,对于很多openGauss架构,新特性等等都还不了解,可能也只是处于入门的阶段,后面还需要再接再厉,不得不说,老师们的课件是真的很好,要反复看。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

严少安
暂无图片 暂无图片
2年前
评论
暂无图片 0
这个标题好,我常说,不懂测试的开发不是好DBA
2年前
暂无图片 点赞
1
宋小宝
暂无图片
2年前
回复
暂无图片 0
@严少安: 🌝
2年前
暂无图片 点赞
回复
目录
  • 一、openGauss
    • 1. openGauss产品是集 商用+自用+开源相结合,而且内核将长期演进
    • 2. 五大关键特性:高性能、高可用、高安全、高智能、全开放
    • 3. 架构:数据库线程池 → SQL 引擎(SQL接口、SQL解析器、SQL优化器、并行执行、AI自调优) → 存储引擎(MVCC行存储引警 内存引警 列存储引警)
    • 4. 体系结构:客户端 、链接驱动(JDBC/ODBC/Libpq)、instance、Database
    • 5. 逻辑模块:客户端驱动、各类线程管理、通信管理、安全管理、SQL引擎、存储引擎、AI、通用组件、工具
    • 6. SQL命令处理流程
    • 7. 查询优化:
    • 8.执行引擎:关系数据库本身是对关系集合Relation的运算操作,执行引擎作为运算的控制逻辑主要是围绕着关系运算来实现的
    • 9. NUMA
    • 10. CLOG 日志即事务提交日志,用来记录事务的最终状态,是XLOG日志的辅助,用来加速通过日志判断事务状态的过程,存在四种事务状态。
    • 11. 64位事务ID:
    • 12. NUMA ARM原子指令:
    • 13. 数据库事务机制:
    • 14. 增量检查点技术原理:
    • 15. 大并发问题解决方案
    • 16. 线程池实现原理
    • 17. 行存&列存
    • 18. MOT
  • 二、openGauss安全技术:
  • 三、两天的训练营内容其实还是很多的,老师们讲的好多得慢慢消化,不过感觉自己收获还是挺多的,之前只是简单的会用,会写sql,对于很多openGauss架构,新特性等等都还不了解,可能也只是处于入门的阶段,后面还需要再接再厉,不得不说,老师们的课件是真的很好,要反复看。