首页 > 其他分享 >Polardb 核心存储 polarfs 是怎么进行数据存储的之核心构造(2)--译

Polardb 核心存储 polarfs 是怎么进行数据存储的之核心构造(2)--译

时间:2023-06-22 13:03:21浏览次数:34  
标签:存储 chunkserver -- polarfs 文件系统 数据库 节点 chunk


接上期,

Polardb  核心存储 polarfs 是怎么进行数据存储的之核心构造(2)--译_java

PolarFS 主要由两层组成,一层是存储管理层,上面一层是文件系统元数据和提供文件系统API层,存储层负责所有节点的磁盘资源,并为每个数据库实例提供数据库卷。文件系统层在此基础上提供文件管理,负责文件系统元数据并发访问的互斥。

下图为展示POLARFS 集群中的主要组件,libpfs是一个用户控件文件系统实现的连接库,具有一组类似的posix文件系统API,连接到POLARDB进程,Polarswitch驻留在计算节点上,用于将将应用程序的I/O请求重定向到chunkserver ,chunkserver部署在存储节点上用于,处理I/O请求,POLARCTRL是控制面板,包括一组在微服务中实现的主节点,以及部署在所有计算和存储节点上的代理,Polarctrol使用mysql 事例作为元数据存储库。

Polardb  核心存储 polarfs 是怎么进行数据存储的之核心构造(2)--译_大数据_02

3.1 文件系统层

文件系统层提供了一个共享和并行的文件系统,用来同时访问多个数据库节点,举例假设POLARDB 中的主节点正在创建表,此时就会在POLARFS上创建一个新的文件。执行select 语句在只读节点访问文件,因此因此需要去同步修改文件系统的元数据到从节点,保证数据的一致性避免元数据被损坏。

Polardb  核心存储 polarfs 是怎么进行数据存储的之核心构造(2)--译_数据库_03

上图是libpfs 接口部分代码

3.1.1 libpfs

libpfs 是完全运行在用户空间的轻量级文件系统,上图中提供了一组类似posix 文件系统的API,所以将数据库移植到PolarFS之上是非常容易的。

当数据库启动开始,pfs_mount 加载到卷初始化文件系统的状态,卷标的名字是全局卷标识符,并将其分配给polardb 的实例,同时主机的ID也是供磁盘paxos卷逻辑的唯一标志数据库节点,在加载的过程中,libpfs 从卷标中加载文件系统元数据并且构造相关的数据结构,在主存中存储对表文件进行文件进行文件迎神和块映射表。

在数据库销毁的过程中,pfs_mount会卸载卷相关的资源,在卷空间增长中,pfs_mount_growfs 会分配可用的块文件给数据库进行扩展,Rest 函数等价于posix中的API 的功能。 

3.2 存储层

存储层提供管理和访问文件系统的文件系统的作用,卷被分配给每一个数据库实例,并且挂载这chunks。卷的容量在10GB到100TB之间可以满足巨量数据库的使用的需求,并可以添加卷满足扩展需求。卷能够被随机访问读或写在512B,和传统的存储设备一致,在同一个chunk中修改的数据的操作是原子性的。

Chunk

一个卷中的chunks 被拆分到chunkServer中,一个chunk是分布式数据最小的单元。单个chunk是不会跨盘存储的,并且他会复制到三个不同的chunkserver 上,同时chunks 可以合并但需要在没有热点存在的基础上。

在POLARFS 中chunk 被设置为10GB这比其他系统中的单元要大的多,64MB chunk通常被用于GFS,这样的方式降低了元数据管理的压力,举例100TB 的卷消耗了10000条记录在元数据库中,因此所有的元数据能够在POLARSWITCH 的主存中被cache. 因此避免了额外的元数据访问的造成的额外的I/O 路径访问。

这样的设计本身也有一些问题,热点 chuck是无法被分割的,但基于数据块可以合并和数据块和数据库实例之间的比例(1000:1),POLARFS 可以达到整体系统性能得平衡。

Block 

一个 chunk 被进一步划分通过blocks在chunkserver中,并且每一个block 被设置成 64KB,一个10GB 的chunk 包含163840 数据blocks,逻辑块地址范围在0到10GB,这些被存储在chunk server中,每个磁盘上空闲块的位图。单个chunk的映射表占用640kb内存,这样的存储容量可以缓存在ChunkServer的内存中。

3.2.1 polarswitch

PolarSwitch是一个部署在数据库服务器上的守护进程,同一个或多个数据库实例一起部署。在每个数据库进程中,libpfs将I/O请求转发到
PolarSwitch守护进程。每个请求都包含寻址信息,如卷标识符、偏移量和长度,可以来识别相关的块。I/O请求可能跨越多个块,在这种情况下,请求分成多个子请求。最后,一个元素请求被发送到chunk的leader所在的ChunkServer分成多个子请求。最后,一个元素请求被发送到chunk的leader所在的ChunkServer。

通过查找本地元数据缓存(与PolarCtrl同步),PolarSwitch找到属于一个块的所有副本的位置。一个块的副本形成一个共识组,一个是leader,其他的是follower。只有leader可以回答I/O请求。共识组中的领导变化也会同步并缓存在PolarSwitch的本地缓存中。如果发生响应超时,在检测leader选举是否发生时,PolarSwitch不断重新尝试,发生问题则切换到新的leader并立即重传。

3.2.3 chunkServer

chunkServer 部署在存储服务器上,多个chunckserver进程运行在存储服务器上,每个存储服务器有自己的标准的NVMe SSD ,并且他绑定到标准的CPU,两个chunkserver 是不对资源进行共享使用的,chunkserver 负责存储块并随机访问chunk,每个chunk包含一个write ahone log  (WAL)日志,为了保证数据的在chunk中改变后的原子性和持久性。chunkserver 采用一块固定尺寸的3D xpoint ssd 作为wal 日志的缓存。如果数据写满后,将回收空间,如果还没有足够的空间日志将写到NVMe SSD 作为替代。

chunkserver 中使用并行协议,相互复制IO数据形成一个组,一个chunkserver如果因为各种问题脱离了组,基于网络或者临时的问题引起的错误,或者网络临时不可达,或者服务器升级或重启,在针对这些情况下,最好的方式是等待失联的chunkserver 在此回归重新加入到组中。在其他的事例中如果是长期的失败,将会引发chunkserver 迁移到其他的服务器上,并且需要满足足够数量的副本。

断开连接的chunkserver 会尽量尝试在加入到原有的组,如果时间超过预先的设定,则polarctrl 会做出其他的措施,其中会对比出现问题之前的chunkserver 的列表,并标注 chunckserver 永久性故障,但这个问题在某些时候,难以做出决定。举例,一个 chunkserver中存在一个慢速的磁盘,有很长的延迟,但是却一直能进行响应,所以基于关键部件的机器学习对解决这个问题有很大的帮助。

Polardb  核心存储 polarfs 是怎么进行数据存储的之核心构造(2)--译_python_04

标签:存储,chunkserver,--,polarfs,文件系统,数据库,节点,chunk
From: https://blog.51cto.com/u_14150796/6534686

相关文章

  • POSTGRESQL 15 pg_basebackup 新功能,LOCAL backup 与 数据强力压缩
    与MYSQL不一样,开源XTRABACKUP的备份软件无法跟上MYSQL版本的更迭,PG这点做的是一贯的好。从来没有让人失望过。所以POSTGRESQL数据的备份一直就不是一个问题,众多的工具以及pg_basebackup良好的功能,让POSTGRESQL备份起来速度与硬件有关。但基于POSTGRESQL本身的原理,数据库表......
  • Polardb 核心存储 polarfs 是怎么进行数据存储的(1)--译
    POLARDB数据库中有一个核心是他重新设计的存储系统,polarfs,polarfs是怎么设计的架构是怎样的,下面根据官方的一篇详细的英文文档作为翻译的目标https://www.vldb.org/pvldb/vol11/p1849-cao.pdf译PolarFS是专门为polardb设计的分布式文件系统,他具有低延迟,高可用的特点并且这款存......
  • POSTGRESQL 提高POSTGRESQL性能的一些习惯 (1)
    PostgreSQL是一个很有意思的数据库,在使用中有一些习惯可以在同等的硬件下,更加有效的使用硬件提供的资源,让管理和使用POSTGRESQL获得更多的性能。下面就说说一些使用POSTGRESQL的习惯。1 是否需要降低文件的数量POSTGRESQL的文件很多,这里指的文件的数量,主要指两方面的的文件,数......
  • POSTGRESQL VS MYSQL 到底那个数据库 RDS 技术含量高 ?
    以下内容纯属个人看法云数据库的RDS产品,在传统开源的系列里面大致可以选择的是POSTGRESQL和MYSQL两种,诚然在RDS的里面大部分产品最终的选择还是MYSQL,今天不想讨论产品的量,而是想讨论以下产品的难度,RDS产品在POSTGRESQL和MYSQL两种产品的难度问题。先说结果,POSTGRESQL......
  • Postgresql 如何降低 wal 占用磁盘空间,降低磁盘存储成本
    POSTGRESQLWAL的存储一直是一个值得讨论的问题,到底一个POSTGRESQL在极端的情况下,可以用多少的空间来存储WAL日志。这里不是要讨论逻辑复制槽,也不是讨论ARCHIVE,这里要讨论是一种极端的方法,尝试将POSTGRESQLWAL占用的磁盘空间最小化。这里主要针对的对象是,单机的POSTGRESQL,不......
  • MYSQL 8 UNDO 表空间 你了解多少
    UNDOLOG的主要目的是完成事务回滚和MVCC多版本控制中的读取过去事务的问题。UNLOG这里有三个层次的问题 1  undolog存在于undo log 的日志段中2 undolog的日志段存在于undolog的回滚段中3  unloglog的回滚段存在于undo 表空间和全局临时表空间中这里提到为......
  • POSTGRESQL 存储过程--如何写出新版本PG的存储过程的小案例
    随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是POSTGRESQL,MYSQL,MONGODB,POLARDB,REDIS,SQLSERVER等,期待你的加入,最近在开始研究POSTGRESQL的存储过程,主要的原因有以下几个1因为要开发适合目前公司中......
  • MYSQL performance_schema 不显示信息 和调整 performance_schema 的配置
    随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是POSTGRESQL,MYSQL,MONGODB,POLARDB,REDIS等,最近在某云使用了MYSQLRDS产品,说实话不怎么满意,和他家的其他产品比较我到时更原因使用PG的产品和云原生产品......
  • MYSQL POLARDB 学习系列之 拆解 POLARDB 7 (终结) 失败恢复与可靠性
    随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是POSTGRESQL,MYSQL,MONGODB,POLARDB,REDIS,SQLSERVER等,期待你的加入,学习POLARDB已经有3-4个月的时间了,当然大部分还是在理论方面,实际上POLARDB在实际的操......
  • POSTGRESQL 提高POSTGRESQL性能的一些习惯 (3)
    随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是POSTGRESQL,MYSQL,MONGODB,POLARDB,REDIS,SQLSERVER等,期待你的加入这个系列写到第三期了,实际上POSTGRESQL的优化和一个核心之一,这就是VACUUM,一个弄不清vac......