基于云原生数据库 PolarDB for PostgreSQL 分布式开源项目实现序列号生成和性能调优赛题解析 | 学习笔记

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 快速学习基于云原生数据库 PolarDB for PostgreSQL 分布式开源项目实现序列号生成和性能调优赛题解析

开发者学堂课程【第八届大学生创新创业大赛阿里命题数据库命题解析基于云原生数据库 PolarDB for PostgreSQL 分布式开源项目实现序列号生成和性能调优赛题解析学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/1045/detail/15278


基于云原生数据库 PolarDB for PostgreSQL 分布式开源项目实现序列号生成和性能调优赛题解析


内容介绍:

一、PolarDB for PostgreSQL 分布式架构

二、比赛题目


一、PolarDB for PostgreSQL 分布式架构

1、PolarDB分布式是基于社区 pg 上面演进出的分布式架构,主要采用mpp架构,主要分两层,一层是协调节点,一层是存储节点,协调节点负责用户数据接入多个协调节点之间是彼此独立的,也就是每个cn节点都可以单独接受用户的查询请求,其他节点处理sql请求的时候,它会生成分布式plan,发到对应的DN进行执行,把执行结果返回给客户端,真正的表数据是在多个dn节点上存储,比如表的数据,它会根据分布k划分为多份数据,单独的一份数据会存储在单独的data node节点上,可以增加背景的形式保障它的可靠性,分布式事务采用的是2PC提交的方式,也用了 hnc 的四种协议保证一致性。

image.png

2、经过过去几个版本的迭代,演进出插件化的形态,在社区单机配件基础上提供分布式的插件,通过使用插件,就可以把单个 pg 扩展成分布式的集群可以用代码部署单机节点,如果后续业务有需要,可以用插件的形态把单个节点继续扩展为分布式集群,内核组建相对更加统一,数据库节点没有那么多的类型,在兼容性方面可以做到兼容pg的最新版本,sql功能方面,尽最大的限度兼容单机的 sql 功能,但是分布式跟单机还是有一些区别,有的地方还是需要继续演进。

3.插件化的一种形态在插件里面包含查询优化器,分布式事务的管理,以及连接池功能,比如用户的 sql 过来之后,在插件里面,社区编辑器有 hook 功能,利用 hook 在插件里面进行分布式的查询优化,把执行计划再分发给对应的data node,让它执行再收集结果,分布式事务方面,2pc结合的四种协议2pc在commit时候,会先进行 prepare,完成之后,再进行连接,减少连接的负担,以及更好的管理 Cn和 dn 之间的 commit,在插件里面也维护了一个连接池 hlc 特性在 data node上需要有一些支持,但是没有进行插件化,在设计底层存储进行修改在pg11版本上提供patch,用社区11版本再加上 planner patch,再加上插件,就可以得到完全的支持,分事务分布式的 pg 数据库。

image.png

4、交互流程,一个cn,底层有两个cn,假如用户连接到cn1上,开始执行sql,首先sql会分发到各个dn上,cn上自己当前的时钟,发送给dn1和dn2,dn1和dn2在收到时钟之后,它会跟自己的本地时钟进行比较,会把自己的本地始终更新为最大的值,当cn开始commit时候,开始2pc的过程,首先进行prepare,发送给各个dn之后,每个dn就会把自己的本地时钟往前推进,加一,把preparets回复给cn,cn会拿到所有dn的prepare ts之后,会从里面选择一个最大的prepare ts作为分布式事务的提交式检索,同时它也会把自己的本地时钟推进到最大的commit ts,进行加2PC的第二阶段,向各个dn发送commit,DN会把自己的本地时钟也会继续推进提交时间,完成两阶段的第二阶段,整个分布式事物就是简单的概要。

image.png

5、演示用代码和文档部署环境,文档和代码通过链接都可以找到,直接直接直接找到。

参考文档: htps://github.com/ApsaraDB/PolarDB· -for- PostgreSQL/tree/distributed#deployment-from-source code

代码 : htps//github.com/ApsaraDB/PolarDB-for- PostgreSQL/tree/distributed

在一台机器上部署两个CN和两个DN的分布式集群,用阿里云的ecs,把代码下载好,首先直接从编译开始,编译也提供了脚本,bash里面需要注意的地方就是要安装的目录需要指定,包括安装的时候,有bug或者之类的一些选项,默认情况下,什么都不加就可以,编译好之后,可以看配置下环境变量,后面操作会更方便一点,路径跟bash中对应的,准备部署文件,对pgxc ctl工具进行改造,用prepare distributed命令可以直接直接把SHOME/polardb/ polardb_ paxos . conf配置文件准备好,配置文件的默认就是在一台机器上进行两个dn,一个sql进行部署,内容里面格式跟查询社区是一样的,可以有两个cn,也会有两个dn,包括端口号,如果有需要修改的,可以自己修改,用默认的就可以,清理集群就是可以把上一次部署的一些目录进程全部清空掉,有配置文件,用命令可以初始化集群,首先会把commit 和datanode initdb拉起来,因为插件本质上在polarx基础上进行修改,可以看到每个插件每个节点都会进行poreign data wrapper polarx添加的操作,这时已经拿到两个cn,两个dn的节点,可以看到状态,15,16是两个cn,18,19是两个dn,可以连接上看,select*from pg foreign_ server可以看到两条cn,两条dn,端口号,比如随便插两条数据,分布式数据最终会到底层的两个dn上,可以查到两条数据,

image.png

cn1,cn2也可以查询到数据,连接到某一个dn,18和19是dn,可以看到插入的两条数据,1和100,1落在dn1上,在另一个节点,100数据,整个集群搭建好。


二、比赛题目

1、序列号的生成,序列号在单机里面比较容易实现,用一些进程间通信就可以实现,因为分布式的网络通信的开销会大,单机本身的复杂度也比分布式要低,所以现在的目标就是在分布式的集群里面,设计跟单击数据库里面sql效果差不多的东西。

2、可以看单机sequence的实现,一些用法,语句和语法是兼容的,有extval,setval,currval,lastval操作,默认从start1开始,nextval是2,之后是3,不管多少个sequence连接到数据库里面,每次顺序都是单调递增的。

3、但是在分布式环境里面的情况就会变得复杂,客户端可以连到不同的cn,不同的cn之间需要产生全局有序的序列号,要求就是在介绍的分布式数据库的项目上实现功能实现nextval,setval,currval,lastval操作,在实现的方式上,有几条路径可以选,需要在功能和性能上有平衡,比如用最严格的方式,比如跟单机的效果是一模一样,也就是产生sequence一定是全局单调递增,在不同的session之间要生成严格有序的序列号,不管多少个客户端连到不同的cn或从全局上看不可能出现有两个一样的序列号,比如cn1上next1,cn3上next得到3,中间的2被缺掉是不行的,方式是严格有序,但是方式的性能会有一些影响,所以可以用另外一种路径,可以分批进行分配,可以在每个session上或者每个cn一批一批的进行分配,比如session获得1到100,另一个session获得101到200,一定是递增的,但是不一定是严格有序的,可能中间会缺一些东西,但是能换来性能上的一些的改进,在全局范围内也不会出现两个一样的sequence。

4、第二个题目是性能调优的题目,因为在数据库场景里面经常会看sql跑得慢或者性能比较差,经常做性能调优的事情,在单机数据库里面可以通过常见的命令或者在数据库里面采集函数级别的信息做事情,但是在分布式上面,题目是开放性的,比如一台机器的节点,有方法可以做性能的查看和诊断,但是包括业界没有好用的工具,在分布式跨了几个节点或是在场景下有全局的统计,内部的一些汇总,buffer命中率,cpu的利用率,每个节点上的热点函数,希望profile性能调优的工具最后是一种图形化的形式进行展现或者让开发人员方便的获取整个数据库内部的热点瓶颈等形式。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
128 6
|
3月前
|
存储 关系型数据库 分布式数据库
PolarDB 并行查询问题之分布式查询执行过程中的数据分发如何解决
PolarDB 并行查询问题之分布式查询执行过程中的数据分发如何解决
47 1
|
1月前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
70 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
18天前
|
数据库
|
2月前
|
SQL 关系型数据库 MySQL
php学习笔记-连接操作mysq数据库(基础)-day08
本文介绍了PHP中连接操作MySQL数据库的常用函数,包括连接服务器、设置字符集、关闭连接、选择数据库、结果集释放、获取影响行数以及遍历结果集等操作。通过书籍查询的实例演示了如何使用这些函数进行数据库操作,并提供了一个PHP操纵MySQL数据库的模板。
php学习笔记-连接操作mysq数据库(基础)-day08
|
2月前
|
关系型数据库 分布式数据库 数据库
开源云原生数据库PolarDB PostgreSQL 15兼容版本正式发布
PolarDB进行了深度的内核优化,从而实现以更低的成本提供商业数据库的性能。
|
3月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
55 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
3月前
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
126 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
3月前
|
存储 缓存 负载均衡
【PolarDB-X 技术揭秘】Lizard B+tree:揭秘分布式数据库索引优化的终极奥秘!
【8月更文挑战第25天】PolarDB-X是阿里云的一款分布式数据库产品,其核心组件Lizard B+tree针对分布式环境优化,解决了传统B+tree面临的数据分片与跨节点查询等问题。Lizard B+tree通过一致性哈希实现数据分片,确保分布式一致性;智能分区实现了负载均衡;高效的搜索算法与缓存机制降低了查询延迟;副本机制确保了系统的高可用性。此外,PolarDB-X通过自适应分支因子、缓存优化、异步写入、数据压缩和智能分片等策略进一步提升了Lizard B+tree的性能,使其能够在分布式环境下提供高性能的索引服务。这些优化不仅提高了查询速度,还确保了系统的稳定性和可靠性。
90 5
|
3月前
|
SQL 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
38 6