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

openGauss训练营学习心得

原创 贾勇智 2022-05-18
676

参加云和恩墨组织的《8小时玩转openGauss训练营活动》活动后,终于对openGauss有了初步的了解。此前对它的了解仅来源江湖传说,同时恭喜openGauss登顶国产数据库排行榜榜首。下面是这次学习的一些总结,不周之处请多多指点。

1.openguass:

  • 商用+自用+开源结合

2.openguass定位:

  • 高性能、高可用&高安全、高智能、全发放

3、架构:

  • 数据库线程池>>>SQL 引擎(SQL接口、SQL解析器、SQL优化器、并行执行、AI自调优)>>>存储引擎(MVCC行存储引警 内存引警 列存储引警)

4、体系结构:

  • 客户端>>>驱动>>>instance>>>Database

5、逻辑模块:

  • 客户端驱动>>>线程管理>>>通信管理>>>SQL引擎>>>存储引擎>>>AI>>>安全管理>>>通用组件>>>工具

6、SQL命令处理流程:

  • 应用>链接>认证>查询解析>查询重写>代价估算、路径生成>查询执行>数据读取>事务、日志、复制

7、查询优化:

  • 统计信息>行数估算>代价估算>路径搜索>计划生成

8、执行引擎主要围绕关系运算实现,算子分以下几类:

  • 扫描算子、控制算子、物化算子、连接算子

9、NUMA内核特点:

  • 线程绑核,避免线程在核间偏移。
  • NUMA化数据结构改造,减少跨核访问。
  • 数据分区,减少线程访问冲突。
  • 算法调整,减少单点瓶颈。
  • 借助ARM原子指令,减少计算开销。

10、NUMA线程绑核:

  • 网络中断和后台业务线程分开绑核。
  • 不同业务线程分开绑核。

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

12、64位事务ID:

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

13、NUMA ARM原子指令:

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

14、数据库事务机制:

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

15、增量检查点技术原理:

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

16、大并发问题解决方案

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

17、线程池实现原理

  • 客户端向数据库发起连接请求,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等资源。

18、行存&列存

image.png
image.png

19、MOT原理

  • openGauss免锁,高吞吐,低时延
  • openGauss的融合内存引擎MoT架构

优势1:性能高、CPU利用率高、延迟低

① 高度优化的全内存免锁存储引擎
② 基于全内存优化实现的免锁索引
③ 高度优化的并发访问控制
④ 针对NUMA优化的内存管理,预缓存对象池
⑤ 针对NUMA高度优化的组提交

优势2:生态好、兼容好,功能完整

① 有效利用openGauss现有的查询引擎,
兼容PG生态
② 兼容PG原生FDW和索引,SQL标准兼容
度高,功能完整
③ 除PG原生FDW之外,还支持存储过程、
用户定义函数等功能

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

评论