PolarDB存储原理与实践

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
日志服务 SLS,月写入数据量 50GB 1个月
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 在阿里云开源的趋势下,PolarDB已经成功运用到很多企业案例中。

分享人:朱元(圆珠)   阿里云数据库产品事业部

正文:本文从两方面来介绍PolarDB存储原理与实践.

PolarDB存储原理简介

PolarDB存储实践


1、PolarDB存储原理简介


1.1PolarDB: 基于共享存储的分布式数据库


image.pngPolarDB和传统的RDS最大的区别是基于共享存储的部署方案,它们在存储侧的差异有:

成本的差异,传统的关系型数据库的复制数据量存储会double,写量也会double,日志数据分别会在不同的节点上面都写两次。共享型存储器没有这些问题,写量永远只有一次。

由于是分布式的存储,它不需要预分配,可以在存储侧独立的进行动态扩容。存储侧独立的实现,上层解耦分布式架构上常见的难点和问题,比如数据库本身不用考虑存储的可靠性了,由下面的存储成本实现它的可靠性,传统企业的副本技术EC可以去实现,企业级的快照功能可以对上层进行隔离,去提供快照备份。


1.2共享存储架构下的计算层修改:缓存同步

image.png

数据库需要做哪些修改呢?我们其实可以很简单的把它做一个抽象的划分,存储层和计算层,如果存储层使用统一共享的存储计算需要做哪些修改,由于存储已经共享了,计算层涉及的数据对象是缓存,存储层的共享不存在一致性的问题,计算层需要解决缓存同步的问题,缓存同步包括几个部分:

一是内容的同步,在a节点写入的段数据,b节点的缓存和a节点的缓存要一模一样。

二是要看到相同的内容和相同的修改顺序。a节点上依次修改了两份数据,要在b节点上看到这两份数据的修改顺序也是相同的,实际在RW先写日志再写数据的顺序,没有在RO中进行完整一致的问题。在看到日志时没有看到数据,这些都是顺序问题。

存储计算分离架构在计算层需要做的修改是缓存同步,缓存同步也包括内容一致修改和顺序一致。传统的存储数据库存储还有文件系统,它是属于内核态的,也是有缓存的,cache是数据侧的缓存,文件系统有一些源数据,文件名数据的缓存也需要同步。


1.3PolarFS: PolarDB的用户态文件系统

image.png

PolarDB使用的文件系统是PolarFS,传统的文件系统在运行内核态上去做缓存同步会出现一些问题:一是开发难度较大,二是比较难合并上游内核依赖代码的更新。最终选择了一套自研的运行在用户态高性能面向数据库的文件系统,为文件系统提供满足Linux标准的接口,能够提供mkdir、rdaddir文件夹和文件的所有接口,这是HDFS不能完整提供的,最重要的是能够支持在共享快设备上实现一写多读缓存同步。


1.4PolarFS的元数据基本结构

image.png

和传统单机文件系统一样,要有格式化的过程,把整块磁盘分解为数据扇区和原数据扇区,数据扇区用于存储平常文件读写中存储的数据,在元数据扇区会存储原数据文件系统的原数据,主要有:文件的名字、所属文件夹、文件中的块和磁盘的块之间的映射,对应到PolarFS对原数据的处理,它提供了dir存储文件名或者文件夹名,来存储文件块到磁盘块之间的映射,再提供数据结构来完成索引,例如文件夹和文件名之间的观点。


1.5PolarFS的元数据修改的提交和同步

image.png

分布式缓存的同步如何来解决呢?RW节点需要把对原数据的修改进入到Journal的日志,并且也使用类似DB的LSN的版本号的技术,可以让RO在节点上看到RW上修改的先后顺序,RO是何时做的缓存同步呢?

文件系统不像数据库有同步机制,把同步延时到RO文件系统访问API上去,也就是在RO上去做一次读文件的操作时,都会额外的去读Journal日志文件,去查看上一次回放日志后的位置是否有新日志写入。每一个RO在做API调用的时候,一定能看到在RO上RW元数据的修改。

日志本身都有顺序性,对日志内容的回放顺序也和RW上的修改顺序也是一样的。


1.6PolarFS和PolarDB的缓存同步分工

image.png

PolarFS文件系统的数据缓存在实际工作中是没有缺失的,PolarDB在开发过程中,DB和文件系统做了数据缓存和原数据缓存的分工,原数据缓存中文件名的修改、文件块的分配的操作给文件系统做,数据内容的缓存同步给DB来修改,因为DB天生自带WAL日志等功能,DB执行的缓存复制的功能也是分布式同步中必须的。同理,基于已经开源的PolarFS写一个共享存储的数据库,PolarDB可以使用日志来同步,可以使用TCP信道RW让 RO更新缓存。

在数据库中使用DirectIO是非常重要的,如果不使用DirectIO,那么在RO上面缓存的更新就通过API来读,操作系统替代了自带的缓存,缓存同步要控制在逻辑之中,我们整套RO站中必须是做分布式缓存同步的缓存。


2、PolarDB存储实践


2.1PolarFS的部署

2.1.1PolarFS的编译和安装

image.png

对于PolarFS的部署,大家可以直接从上面的链接下载源码,遵照上面的文档,准备好第三方库再进行编译,编译出运行文件系统需要的工具服务等,要格式化文件系统就已经可用了。


2.1.2PolarFS bash工具使用示例

image.png

看下系统中有哪些磁盘可用,比如有1块nvme5n1可以用的时候,可以运行mkfs的命令把磁盘格式化,格式化好后,继续用mkdir的命令操作格式化的磁盘,路径的开始和传统的Linux路径有一些区别。

命令行mkdir或者IS前面加了PFS的工具,它不能直接使用自带的二进制工具,必须在命令前加PFS开始编译生成的工具才能访问文件系统。

它是独立的文件系统没有挂载在系统的根路径上,把路径的第一部分设为要格式化的盘符,区分需要从哪一块设备上去访问PolarFS。


2.1.3 PolarDB postgresql 实际文件示例

image.png

PolarDB的表空间上的文件夹和文件,和开源社区版没有任何区别,访问看到的结果和社区也差不多是一样的。有一些,我们PolarDB在社区版上额外增加功能的额外文件夹,像logo index。在data根目录上面可以看到多出一些PG的这个logo index等文件夹,也可以通过命令去查看PolarDB数据库在文件系统存储中增加的变化。


2.1.4 PolarFS bash工具命令支持一览

image.png

PolarFS对标传统文件系统实现常用的子集,通过/h可以看到帮助手册实现的命令。


2.1.5 PolarFS 部署形态

image.png

必须要通过API的形式去访问文件系统,在PolarDB实际使用中必须要提供API的形式去数据库进行访问, PFS demo服务就是做这件事情的,启动后PolarDB就可以去访问文件系统服务了。 postgresql是主进程子进程的架构,需要主进程调用和PFSdemo服务建立共享内存的连接,folk的子进程通过文件系统的API来访问文件系统服务的共享存储。传统文件系统是通过切入内核态直接调用,这里是通过共享内存的方式转接到用户态的文件系统服务,把它共享文件夹上的共享内存文件来通讯,通信的机制不依赖于内核态的转发形式进行。


2.2.1基于光纤或以太交换网络的SAN

image.png

常见的方法是通过光纤交换网络或者以太交换网络,存储节点上的存储设备通过网络的形式虚拟化成存储单个的虚拟和设备,提供给计算层面的服务器访问。这种架构实现计算存储分离,服务存储在交换网络之外,计算层是在网络上进行访问。


2.2.2SAN on linux 部署

image.png

首先完成上网络的初始化后,在Llinux的操作系统上扫描确保网络上连通的设备能在本地发现。


2.2.3块设备注册与发现完成

image.png

可以看到设备类型第一行是b,可以看到这台主机上发现了非常多的远端存储设备,计算存储分离的rw、ro可以共同访问,刚才的操作,除了在aw主机上执行,在上面也去执行,那两台主机就可以共同去访问相同的存储了。


2.2.4管理存储访问

image.png

传统的SAN存储网络,可以把多块盘合并成一块逻辑盘,类似于read的方式同时利用多块盘的带宽提升数据的访问性能。和传统的交换式网络相比,基于固定的路由访问远端节点不同,可以配置动态的网络访问拓扑,让流量负载均衡从多条路径访问远端的存储节点,避免网络路径产生瓶颈。可以并行的使用多块存储的带宽,也可以并行的使用多台链网络和存储的带宽,以少量的计算节点利用整个网络的性能。


2.2.5存储示例

image.png

这是一个简单的示例,第一块磁盘属于一个设备, 253:21是Linux的描述符,第一部分属于驱动。第二部分是minor设备的标识符,访问设备的时候可以去配置负载均衡的策略,优先级走某些链路访问,较低的优先级去访问另一条链路。


2.2.6扩容流程

image.png

每一个事情上都包含动作和感知两个过程,首先用SAN存储厂商的存储软件,像浪潮的存储提供的软件扩容,或者多个盘合并成一个盘,这些都是扩容。其次在Linux的快设备管理上特定一块盘,比如想对这块逻辑盘进行扩容,Linux就能感知远端的存储扩容结果。因为计算和存储是分离的,计算节点上有多个节点在访问这个存储设备,就需要在每台计算主机上去执行,才能保证每台主机上都能看到远端存储扩容的结果。

这是快设备层面的感知。我们使用的是PolarFS文件系统,它提供了一些命令,可以直接使用它去感知和使用扩容的结果。首先要把扩容的结果格式化,就像第一次使用文件系统那样格式化。其次需要去感知扩容结果,也就是说在每台主机中需要在数据库中去调用特定的API感知扩容的结果,那当你的RW节点也感知到扩容后,RW就利用扩容的分空间进行数据分配,replay是远端修改的。感知是一个从下到上的过程,复制过程和缓存顺序是相反的,先从底层去完才能够避免crash的问题。传统文件系统没有这么复杂,第三步和第二步可以就合并。


2.2.7已有部分用户案例

image.png

这套方案主要是面向线下的企业用户推荐的,他们大多都有SAN存储的网络设备,方便使用已有的基础设施和软件部署,也有国家政府和企事业单位的案例,就不一一介绍了。


2.3 NBD存储的部署


2.3.1NBD的概念

image.png

NFS是基于文件系统的共享,共享本机的路径也就是文件系统中的目录或者子目录,远端修改文件可以在本地上看见和同步。快设备也类似于NFS那样通过tip网络信道进行共享,Linux也提供类似的功能。把dv磁盘映射到远端,让远端通过映射设备访问a节点写入的数据,b节点就可以直接看到。


2.3.2NBD的服务端部署

image.png

不同的操作系统是不同的,服务端只需要启动对应的NBD的服务,把准备分享的快设备描述清楚,以同步的方式去分享,避免系统有crash。


2.3.3NBD的客户端部署(一)

image.png

客户端需要在/dev上模拟本地的磁盘节点。也可以自己编译一下内核的驱动,生效后就可以在dv目录下面看到NBD设备了,根据服务端的配置把远程的设备映射到本地的NBD设备上面。


2.3.4NBD的客户端部署(二)

image.png

我们要把NBD和远程的共享磁盘进行映射,只需要把NBD对应远端的服务端口,映射到本地某一个NBD设备上面,执行成一旦成功,就可以看到本地磁盘块设备中增加的NBD磁盘设备。


2.4基于阿里云共享存储的部署


2.4.1云上共享存储(一):Polarstore

image.png

直接在阿里云官网上购买服务,包括MySQL兼容版本、PG版本,Oracle兼容版本,云上的存储架构和基于SAN存储架构很类似,存储计算分离网络连接是把基于光纤的交换网络换成RDMA的网络机制,来做存储计算之间的高速互联以及存储网络之间高速互联,这套方法是最简洁最方便最稳定可靠的一种方案。


2.4.2云上共享存储(二): ESSD云盘

image.png

NBD共享需要手动部署,未来会提供ESSD云盘原生共享的方案,在ECS主机上购买一块盘,在别的主机上也能配置映射这块盘,不需要自己去配置NBD的模块,一块盘多个主机也能使用这样的功能。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
7月前
|
关系型数据库 分布式数据库 PolarDB
PolarDB 开源基础教程系列 7.2 应用实践之 跨境电商场景
本文介绍了如何在跨境电商场景中快速判断商标或品牌侵权,避免因侵权带来的法律纠纷。通过创建品牌表并使用PostgreSQL的pg_trgm插件和GIN索引,实现了高性能的字符串相似匹配功能。与传统方法相比,PolarDB|PostgreSQL的方法不仅提升了上万倍的查询速度,还解决了传统方法难以处理的相似问题检索。具体实现步骤包括创建品牌表、插入随机品牌名、配置pg_trgm插件及索引,并设置相似度阈值进行高效查询。此外,文章还探讨了字符串相似度计算的原理及应用场景,提供了进一步优化和扩展的方向。
205 11
|
7月前
|
SQL 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 7.5 应用实践之 TPCH性能优化
PolarDB在复杂查询、大数据量计算与分析场景的测试和优化实践.
227 7
|
7月前
|
搜索推荐 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 7.3 应用实践之 精准营销场景
本文介绍了基于用户画像的精准营销技术,重点探讨了如何通过标签组合快速圈选目标人群。实验分为三部分: 1. **传统方法**:使用字符串存储标签并进行模糊查询,但性能较差,每次请求都需要扫描全表。 2. **实验1**:引入`pg_trgm`插件和GIN索引,显著提升了单个模糊查询条件的性能。 3. **实验2**:改用数组类型存储标签,并结合GIN索引加速包含查询,性能进一步提升。 4. **实验3**:利用`smlar`插件实现近似度过滤,支持按标签重合数量或比例筛选。
158 3
|
存储 SQL 安全
应用案例|开源 PolarDB-X 在互联网安全场景的应用实践
中盾集团采用PolarDB-X云原生分布式数据库开源版本,有效解决了大数据量处理、复杂查询以及历史数据维护等难题,实现了业务的高效扩展与优化。
|
7月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课3 共享存储在线扩容
本文继续探讨穷鬼玩PolarDB RAC一写多读集群系列,介绍如何在线扩容共享存储。实验环境依赖《在Docker容器中用loop设备模拟共享存储》搭建。主要步骤包括:1) 扩容虚拟磁盘;2) 刷新loop设备容量;3) 使用PFS工具进行文件系统扩容;4) 更新数据库实例以识别新空间。通过这些步骤,成功将共享存储从20GB扩容至30GB,并确保所有节点都能使用新的存储空间。
151 1
|
7月前
|
人工智能 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 7.4 应用实践之 AI大模型外脑
PolarDB向量数据库插件通过实现通义大模型AI的外脑,解决了通用大模型无法触达私有知识库和产生幻觉的问题。该插件允许用户将新发现的知识和未训练的私有知识分段并转换为向量,存储在向量数据库中,并创建索引以加速相似搜索。当用户提问时,系统将问题向量化并与数据库中的向量进行匹配,找到最相似的内容发送给大模型,从而提高回答的准确性和相关性。此外,PolarDB支持多种编程语言接口,如Python,使数据库具备内置AI能力,极大提升了数据处理和分析的效率。
298 4
|
存储 Cloud Native 关系型数据库
PolarDB 高可用架构设计与实践
【8月更文第27天】 在现代互联网应用中,数据库作为核心的数据存储层,其稳定性和可靠性尤为重要。阿里云的 PolarDB 作为一款云原生的关系型数据库服务,提供了高可用、高性能和自动化的特性,适用于各种规模的应用。本文将详细介绍 PolarDB 的高可用架构设计,并探讨其实现数据安全性和业务连续性的关键技术。
367 0
|
8月前
|
存储 SQL 缓存
PolarDB-X 在 ClickBench 数据集的优化实践
本文介绍了 PolarDB-X 在 ClickBench 数据集上的优化实践,PolarDB-X 通过增加优化器规则、优化执行器层面的 DISTINCT 和自适应两阶段 AGG、MPP 压缩等手段,显著提升了在 ClickBench 上的性能表现,达到了业内领先水平。
|
9月前
|
SQL 关系型数据库 分布式数据库
基于PolarDB的图分析:银行金融领域图分析实践
本文介绍了如何使用阿里云PolarDB PostgreSQL版及其图数据库引擎(兼容Apache AGE,A Graph Extension)进行图数据分析,特别针对金融交易欺诈检测场景。PolarDB PostgreSQL版支持图数据的高效处理和查询,包括Cypher查询语言的使用。文章详细描述了从数据准备、图结构创建到具体查询示例的过程,展示了如何通过图查询发现欺诈交易的关联关系,计算交易间的Jaccard相似度,从而进行欺诈预警。
基于PolarDB的图分析:银行金融领域图分析实践
|
9月前
|
SQL 人工智能 自然语言处理
PolarDB-PG AI最佳实践 1:基础能力实践
Polar_AI 是 PolarDB 数据库的 AI 扩展,集成了先进的人工智能模型和算法,使数据库能够执行机器学习和自然语言处理任务。它支持 PostgreSQL 及 Oracle 兼容版本,通过标准 SQL 轻松调用 AI 模型,具备简单易用、灵活可定制、无缝数据融合、数据安全和高性能等优势。用户可以通过 SQL 快速实现文本转向量、情感分类等功能,并能自定义扩展 AI 模型。

热门文章

最新文章