《PolarDB for PostgreSQL源码与应用实战》——PolarDB-PostgreSQL开源核心Feature介绍(3)

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
简介: 《PolarDB for PostgreSQL源码与应用实战》——PolarDB-PostgreSQL开源核心Feature介绍(3)

《PolarDB for PostgreSQL源码与应用实战》——PolarDB-PostgreSQL开源核心Feature介绍(2) https://developer.aliyun.com/article/1232761?groupCode=polardbforpg


基于CTS支持分布式全局一致性事务(2)


image.png


我们目前主要开源的是HLC的版本,在分布式下,每个提交时间戳提交的物理时间并不一定完全一致。比如T1在A节点和B节点,我们不能保证完全同时提交,另一个并发事务T2,可能会看到T1部分的修改,比如看到A提交了,看到了它的修改,但是B正在运行还没提交,根据隔离性它不可见,此时就无法保证分布式的一致性和隔离性。


我们可以采用2PC Prepare等待机制来解决全局提交一致性:采用2PC来提交一个分布式事务,在Prepare阶段,每个节点在CTS中写入该分布式事务的Prepared状态。Commit的时候,我们会去决策一个提交时间戳,再把提交时间戳发下去,把Prepare的状态原子的替换成提交时间戳,当另外一个并发事务T2对T1的修改进行可行性判断时,如果T1处于prepare的状态,我们就要等待T1结束,再进行时间戳的比较。


这样的话,我们就能避免在A节点、B节点看到部分提交结果的问题。


基于PostgreSQL数据结构的读等待机制设计


我们在读等待的时候,不能把Buffer的锁加上,这样的话会阻塞写,影响并发性能。如果发现它是prepare的,要等待它,我们首先要解锁Buffer shared锁,允许并发写进来,同时等待xid结束再去加buffer。


这个地方可以保证它还能找到原来的位置进行扫描,这是因为PG的逻辑就是它会有item去指向这些Tuple,Tuple可能会移动进行页面的compact,但是item是不会动的,它可以找到正确的位置,这样的话就可以保证正确性。同时buffer也会引用计数,这样保证buffer不会被删掉或做其它的操作。


基于HLC的分布式事务时钟算法(1)


image.png


我们基于HLC的去中心化的分布式事务时钟来支持分布式事务。


这个 HLC的算法在开源的代码里已经有了,但是协调逻辑分布式的代码还没有开源。我们后面加上分布式协调逻辑的代码以后,就可以支持真正的分布式事务。


我们现在单机上采用HLC来支持单机的事务,就是跑一个单机也能正确地跑,跑分布式的时候,基于HLC可以保证全局一致的事务。HLC的设计是物理和逻辑时钟混合,64位时钟由最低16位为逻辑时钟,中间46位物理时钟(毫秒)和最高两个保留位组成。


这样的话,逻辑时钟主要是用来追踪事务之间的因果先后顺序。物理时钟主要是用NTP或PTP去同步不同节点之间的物理时钟,来保证它们可以读到一个相对很新的快照。


每个节点维护一个max_ts时钟,并周期性持久化,重启后REDO恢复最大值。

我们有三个时钟操作,分别是ClockCurrent,ClockUpdate和ClockAdvance。

ClockCurrentc就是读取当前的Clock,相当于我们用Max_ts和本地的物理时钟local-phys-ts取最大值返回。ClockUpdate就是用一个Timestamp去更新Max_ts,我们取最大值。

ClockAdvance是把max_ts和 local-phys-ts取最大值后再加1返回,整个过程都是加锁来保证原子性。


上述操作中,local-phys-ts是本地机器获取的物理时钟,并取毫秒时间。左移16位与max_ts对其进行运算(max-ts最低16位是逻辑时钟)。


不同机器的物理时钟可以通过NTP或PTP协议进行同步,保证很小的时钟倾斜,保证跨协调节点之间的事务可以获取一个freshness的快照。


基于HLC的分布式事务时钟算法(2)



image.png


我们的时钟算法就是在事务Begin的时候,会在协调节点上为它分配ClockCurrent进行startTS,startTS到了每个DN节点以后,会用startTS去更新本地的Max-ts混合逻辑时钟。事务Prepare的时候会去每个参与节点调用ClockAdvance,获取prepareTS,同时返回给协调节点。协调节点会从所有的prepareTS选最大值作为commitTS,同时更新CN的混合逻辑时钟,并且下发给每个DN去提交事务,并且用commitTS去推动每个参与DN的混合逻辑时钟前进。


版本链提交时间戳递增


image.png



这个特性可以保证在版本链提交时间戳递增。


假设我们在一个DN上有两个事务T2、T3,T2先获得锁先进行提交,那么ClockUpdate就会用T2的commit_ts,使得该节点的max_ts大于等于T2的commit_ts,那T3获得锁再进行提交,决策的T3的commit-ts,就会大于等于DN1的prepare_ts,它就会大于等于 max{max_ts, local_phys_ts}+1,这样就能保证T3.commit_ts > max_ts >= T2.commit_ts,这样的话版本链时间戳是递增的。


Repeatable Read下,T3会被abort,从而避免丢失写问题。


《PolarDB for PostgreSQL源码与应用实战》——PolarDB-PostgreSQL开源核心Feature介绍(4) https://developer.aliyun.com/article/1232753?groupCode=polardbforpg






相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
8天前
|
关系型数据库 分布式数据库 数据库
PolarDB 开源基础教程系列 9 开源社区合作和共建
本文介绍了玩转 PolarDB 开源社区指南:如何搭建 PolarDB 开发环境及参与开源社区。 主要内容: 1. **搭建开发环境**:提供多种 Docker 镜像供开发者选择,支持 x86_64 和 ARM64 架构,适配 CentOS、Debian、Ubuntu 等多个 Linux 发行版。 2. **编译与部署**:通过 Docker 容器克隆 PolarDB 源码并编译安装,支持构建一写多读集群测试 ePQ MPP 优化器功能。 3. **参与开源社区**:介绍个人、生态伙伴和用户如何从社区中获取技能、建立连接、积累战绩并提升影响力。社区活动涵盖公开课、训练营、编程大赛、企业行等。
52 5
|
8天前
|
存储 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 8 数据库生态
PolarDB是一款开源的云原生分布式数据库,源自阿里云商业产品。为降低使用门槛,PolarDB携手伙伴打造了完整的开源生态,涵盖操作系统、芯片、存储、集成管控、监控、审计、开发者工具、数据同步、超融合计算、ISV软件、开源插件、人才培养、社区合作及大型用户合作等领域。通过这些合作伙伴,PolarDB提供了丰富的功能和服务,支持多种硬件和软件环境,满足不同用户的需求。更多信息请访问[PolarDB开源官方网站](https://openpolardb.com/home)。
44 4
|
8天前
|
SQL 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 7.5 应用实践之 TPCH性能优化
PolarDB在复杂查询、大数据量计算与分析场景的测试和优化实践.
36 7
|
8天前
|
人工智能 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 7.4 应用实践之 AI大模型外脑
PolarDB向量数据库插件通过实现通义大模型AI的外脑,解决了通用大模型无法触达私有知识库和产生幻觉的问题。该插件允许用户将新发现的知识和未训练的私有知识分段并转换为向量,存储在向量数据库中,并创建索引以加速相似搜索。当用户提问时,系统将问题向量化并与数据库中的向量进行匹配,找到最相似的内容发送给大模型,从而提高回答的准确性和相关性。此外,PolarDB支持多种编程语言接口,如Python,使数据库具备内置AI能力,极大提升了数据处理和分析的效率。
33 4
|
8天前
|
搜索推荐 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 7.3 应用实践之 精准营销场景
本文介绍了基于用户画像的精准营销技术,重点探讨了如何通过标签组合快速圈选目标人群。实验分为三部分: 1. **传统方法**:使用字符串存储标签并进行模糊查询,但性能较差,每次请求都需要扫描全表。 2. **实验1**:引入`pg_trgm`插件和GIN索引,显著提升了单个模糊查询条件的性能。 3. **实验2**:改用数组类型存储标签,并结合GIN索引加速包含查询,性能进一步提升。 4. **实验3**:利用`smlar`插件实现近似度过滤,支持按标签重合数量或比例筛选。
28 3
|
8天前
|
关系型数据库 分布式数据库 PolarDB
PolarDB 开源基础教程系列 7.2 应用实践之 跨境电商场景
本文介绍了如何在跨境电商场景中快速判断商标或品牌侵权,避免因侵权带来的法律纠纷。通过创建品牌表并使用PostgreSQL的pg_trgm插件和GIN索引,实现了高性能的字符串相似匹配功能。与传统方法相比,PolarDB|PostgreSQL的方法不仅提升了上万倍的查询速度,还解决了传统方法难以处理的相似问题检索。具体实现步骤包括创建品牌表、插入随机品牌名、配置pg_trgm插件及索引,并设置相似度阈值进行高效查询。此外,文章还探讨了字符串相似度计算的原理及应用场景,提供了进一步优化和扩展的方向。
35 11
|
8天前
|
SQL 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 7.1 快速构建“海量逼真”数据
本文介绍了如何使用PostgreSQL和PolarDB快速生成“海量且逼真”的测试数据,以满足不同业务场景的需求。传统数据库测试依赖标准套件(如TPC-C、TPC-H),难以生成符合特定业务特征的复杂数据。通过自定义函数(如`gen_random_int`、`gen_random_string`等)、SRF函数(如`generate_series`)和pgbench工具,可以高效生成大规模、高仿真度的数据,并进行压力测试。文中还提供了多个示例代码展示.
25 7
|
8天前
|
关系型数据库 分布式数据库 数据库
PolarDB 开源基础教程系列 6 开源插件扩展
1、当前环境已安装并支持哪些插件 2、AI外脑插件: vector 3、营销场景目标人群圈选插件: smlar 4、地理信息搜索插件: PostGIS 5、中文分词插件: pg_jieba 6、融合计算插件: duckdb_fdw 7、读写分离工具: pgpool-II
25 3
|
8天前
|
关系型数据库 分布式数据库 数据安全/隐私保护
PolarDB 开源基础教程系列 5 高级特性体验
PolarDB 特性解读与体验涵盖多项关键技术,包括预读/预扩展、Shared Server(建议使用连接池)、闪回表和闪回日志、弹性跨机并行查询(ePQ)及TDE透明数据加密。预读/预扩展通过批量I/O操作显著提升Vacuum、SeqScan等场景性能;Shared Server优化高并发短连接处理;闪回功能可恢复表至指定时间点;ePQ支持跨机并行查询以提高复杂查询效率;TDE确保数据存储层的安全加密。
21 1
|
8天前
|
SQL 存储 关系型数据库
PolarDB 开源基础教程系列 4 日常运维
PolarDB日常运维指南涵盖了多个关键操作,包括读写节点故障切换、增加只读节点、配置WAL日志归档、备份与恢复、创建容灾实例以及排查CPU负载高等。通过详细的步骤和代码示例,本文档帮助用户在本地环境中体验和学习PolarDB的高级功能,如共享存储架构下的集群管理。特别地,文档提供了如何使用`polar_basebackup`工具进行备份和恢复,确保数据安全;并通过`pg_stat_statements`插件定位慢查询,优化数据库性能。此外,还介绍了常见问题的排查方法,如业务量上涨或长时间执行的SQL语句导致的CPU高负载。更多内容和进阶课程可参考提供的GitHub链接和官方文档。
19 1

热门文章

最新文章

相关产品

  • 云原生数据库 PolarDB