PolarDB开源数据库进阶课3 共享存储在线扩容

简介: 本文继续探讨穷鬼玩PolarDB RAC一写多读集群系列,介绍如何在线扩容共享存储。实验环境依赖《在Docker容器中用loop设备模拟共享存储》搭建。主要步骤包括:1) 扩容虚拟磁盘;2) 刷新loop设备容量;3) 使用PFS工具进行文件系统扩容;4) 更新数据库实例以识别新空间。通过这些步骤,成功将共享存储从20GB扩容至30GB,并确保所有节点都能使用新的存储空间。

背景

继续穷鬼玩PolarDB RAC一写多读集群系列, 上2篇分别介绍了《在Docker容器中用loop设备模拟共享存储》 , 《如何搭建PolarDB容灾(standby)节点》 .

本篇文章介绍一下如何在线扩容共享存储? 实验环境依赖 《在Docker容器中用loop设备模拟共享存储》 , 如果没有环境, 请自行参考以上文章搭建环境.

还需要参考如下文档:

DEMO

b站视频链接

Youtube视频链接

现在虚拟磁盘20GB

-rw-r--r--   1 digoal  staff    20G Dec 18 11:19 VirtualDisk.img

1、宿主机, 扩容虚拟磁盘/data_volumn/VirtualDisk.img , 例如扩容10GB.

cd ~/data_volumn     
dd if=/dev/zero bs=1m count=10240 oflag=direct >> ~/data_volumn/VirtualDisk.img

扩容后变成了30GB

$ ll  ~/data_volumn/VirtualDisk.img  
-rw-r--r--  1 digoal  staff    30G Dec 18 11:30 /Users/digoal/data_volumn/VirtualDisk.img

2、在pb1容器中可以看到虚拟磁盘已经变成了30GB

$ ll -h /data/VirtualDisk.img  
-rw-r--r-- 1 postgres postgres 30G Dec 18 11:30 /data/VirtualDisk.img

3、容器pb1, 扩容loop设备

当前loop1对应的该虚拟磁盘, 显示还是20G

$ losetup -l /dev/loop1  
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE             DIO LOG-SEC  
/dev/loop1         0      0         0  0 /data/VirtualDisk.img   1     512  
  
$ lsblk |grep loop1  
loop1    7:1    0    20G  0 loop

刷新loop1设备容量:

$ sudo losetup -c /dev/loop1

可以看到, loop设备变成30G了

postgres@dad7520e4620:~/primary$ lsblk |grep loop1  
loop1    7:1    0    30G  0 loop

pb2 , pb3 容器都变成了30G, 这个还和macOS docker容器技术有关, 如果你的环境没有变化, 可能需要在PolarDB其他容器内也做相应的刷新操作.

postgres@60d4e0a501f7:~/replica1$ lsblk|grep loop1  
loop1    7:1    0    30G  0 loop

4、文件系统扩容. 使用 PFS 文件系统提供的工具,对块设备上扩大后的物理空间进行格式化,以完成文件系统层面的扩容。

在能够访问共享存储的 任意一台主机上 运行 PFS 的 growfs 命令

$ sudo pfs -C disk growfs -h  
pfs growfs [-o|--oldcknum=n1] [-n|--newcknum=n2] [-f|--force] pbdname  
  -h, --help:             show this help message  
  -o, --oldcknum:         old chunk number(10GB/chunk)  
  -n, --newcknum:         new chunk number  
  -f, --force:            growfs forcedly (default is disabled)

其中:

-o 表示共享存储扩容前的空间(以 10GB 为单位)  
-n 表示共享存储扩容后的空间(以 10GB 为单位)

如果你不知道存储目前有多大, 可以使用dumpfs的结果进行计算:

$ sudo pfs -C disk dumpfs nvme1n1  
pfs tool cmd record:dumpfs nvme1n1   
[PFS_LOG] Dec 18 13:38:14.693399 INF [31813] pfs build version:libpfs_version_("pfsd-build-desc-_-Wed Sep  4 17:22:25 CST 2024")  
[PFS_LOG] Dec 18 13:38:14.693504 INF [31813] pid: 31812, caller: sudo pfs -C disk dumpfs nvme1n1    
[PFS_LOG] Dec 18 13:38:14.693524 INF [31813] pid: 31811, caller: sudo pfs -C disk dumpfs nvme1n1    
[PFS_LOG] Dec 18 13:38:14.693554 INF [31813] pid: 14, caller: bash    
[PFS_LOG] Dec 18 13:38:14.693579 INF [31813] open device cluster disk, devname nvme1n1, flags 0x1  
[PFS_LOG] Dec 18 13:38:14.693588 INF [31813] disk dev path: /dev/nvme1n1  
[PFS_LOG] Dec 18 13:38:14.693603 INF [31813] open local disk: open(/dev/nvme1n1, 0x10000)  
chunk 0:   
    ck_magic   0x504653434a  
    ck_chunksize 10737418240  
    ck_blksize 4194304  
    ck_sectsize 4096  
    ck_number  0  
    ck_nchunk  2  
    ck_checksum 2397668946  
    ck_physet[MT_BLKTAG].ms_nsect 80  
    ck_physet[MT_DIRENTRY].ms_nsect 64  
    ck_physet[MT_INODE].ms_nsect 64  
    ck_physet[MT_BLKTAG].ms_sectbda 0x1000  
    ck_physet[MT_DIRENTRY].ms_sectbda 0x51000  
    ck_physet[MT_INODE].ms_sectbda 0x91000  
chunk 1:   
    ck_magic   0x5046534348  
    ck_chunksize 10737418240  
    ck_blksize 4194304  
    ck_sectsize 4096  
    ck_number  1  
    ck_nchunk  2  
    ck_checksum 86206895  
    ck_physet[MT_BLKTAG].ms_nsect 80  
    ck_physet[MT_DIRENTRY].ms_nsect 64  
    ck_physet[MT_INODE].ms_nsect 64  
    ck_physet[MT_BLKTAG].ms_sectbda 0x280001000  
    ck_physet[MT_DIRENTRY].ms_sectbda 0x280051000  
    ck_physet[MT_INODE].ms_sectbda 0x280091000  
type  free  used  total  
blktag  4861  259 5120  
dentry  4093  3 4096  
inode 4093  3 4096

所有chunk ck_chunksize相加, 或者 ck_blksize 4194304 * blktag total 5120 =

postgres=# select pg_size_pretty(4194304*5120::int8);  
 pg_size_pretty   
----------------  
 20 GB  
(1 row)

本例将共享存储从 20GB 扩容至 30GB:

sudo pfs -C disk growfs -o 2 -n 3 nvme1n1  
  
日志如下:  
  
pfs tool cmd record:growfs -o 2 -n 3 nvme1n1   
[PFS_LOG] Dec 18 13:48:34.705607 INF [31841] pfs build version:libpfs_version_("pfsd-build-desc-_-Wed Sep  4 17:22:25 CST 2024")  
[PFS_LOG] Dec 18 13:48:34.705750 INF [31841] pid: 31840, caller: sudo pfs -C disk growfs -o 2 -n 3 nvme1n1    
[PFS_LOG] Dec 18 13:48:34.705783 INF [31841] pid: 31839, caller: sudo pfs -C disk growfs -o 2 -n 3 nvme1n1    
[PFS_LOG] Dec 18 13:48:34.705799 INF [31841] pid: 14, caller: bash    
Init chunk 2  
    metaset        2/1: sectbda      0x500001000, npage       80, objsize  128, nobj 2560, oid range [    2000,     2a00)  
    metaset        2/2: sectbda      0x500051000, npage       64, objsize  128, nobj 2048, oid range [    1000,     1800)  
    metaset        2/3: sectbda      0x500091000, npage       64, objsize  128, nobj 2048, oid range [    1000,     1800)  
  
pfs growfs succeeds!

查看pfs nvme1n1元数据, 可以看到pfs已扩容成功

$ sudo pfs -C disk dumpfs nvme1n1  
pfs tool cmd record:dumpfs nvme1n1   
[PFS_LOG] Dec 18 13:55:57.320348 INF [31867] pfs build version:libpfs_version_("pfsd-build-desc-_-Wed Sep  4 17:22:25 CST 2024")  
[PFS_LOG] Dec 18 13:55:57.320437 INF [31867] pid: 31866, caller: sudo pfs -C disk dumpfs nvme1n1    
[PFS_LOG] Dec 18 13:55:57.320459 INF [31867] pid: 31865, caller: sudo pfs -C disk dumpfs nvme1n1    
[PFS_LOG] Dec 18 13:55:57.320472 INF [31867] pid: 14, caller: bash    
[PFS_LOG] Dec 18 13:55:57.320503 INF [31867] open device cluster disk, devname nvme1n1, flags 0x1  
[PFS_LOG] Dec 18 13:55:57.320516 INF [31867] disk dev path: /dev/nvme1n1  
[PFS_LOG] Dec 18 13:55:57.320520 INF [31867] open local disk: open(/dev/nvme1n1, 0x10000)  
chunk 0:   
    ck_magic   0x504653434a  
    ck_chunksize 10737418240  
    ck_blksize 4194304  
    ck_sectsize 4096  
    ck_number  0  
    ck_nchunk  3  
    ck_checksum 2262034622  
    ck_physet[MT_BLKTAG].ms_nsect 80  
    ck_physet[MT_DIRENTRY].ms_nsect 64  
    ck_physet[MT_INODE].ms_nsect 64  
    ck_physet[MT_BLKTAG].ms_sectbda 0x1000  
    ck_physet[MT_DIRENTRY].ms_sectbda 0x51000  
    ck_physet[MT_INODE].ms_sectbda 0x91000  
chunk 1:   
    ck_magic   0x5046534348  
    ck_chunksize 10737418240  
    ck_blksize 4194304  
    ck_sectsize 4096  
    ck_number  1  
    ck_nchunk  3  
    ck_checksum 219744067  
    ck_physet[MT_BLKTAG].ms_nsect 80  
    ck_physet[MT_DIRENTRY].ms_nsect 64  
    ck_physet[MT_INODE].ms_nsect 64  
    ck_physet[MT_BLKTAG].ms_sectbda 0x280001000  
    ck_physet[MT_DIRENTRY].ms_sectbda 0x280051000  
    ck_physet[MT_INODE].ms_sectbda 0x280091000  
chunk 2:   
    ck_magic   0x5046534348  
    ck_chunksize 10737418240  
    ck_blksize 4194304  
    ck_sectsize 4096  
    ck_number  2  
    ck_nchunk  3  
    ck_checksum 3123774169  
    ck_physet[MT_BLKTAG].ms_nsect 80  
    ck_physet[MT_DIRENTRY].ms_nsect 64  
    ck_physet[MT_INODE].ms_nsect 64  
    ck_physet[MT_BLKTAG].ms_sectbda 0x500001000  
    ck_physet[MT_DIRENTRY].ms_sectbda 0x500051000  
    ck_physet[MT_INODE].ms_sectbda 0x500091000  
type  free  used  total  
blktag  7420  260 7680  
dentry  6141  3 6144  
inode 6141  3 6144

5、数据库实例层扩容, 所有PolarDB 计算节点共享存储的pfsd守护进程都需要刷新一下, 才能知道新空间已经可以被使用了.

在pb1 primary 节点创建polar_vfs插件:

CREATE EXTENSION IF NOT EXISTS polar_vfs;

在所有replica节点执行以下函数, 函数的参数名为块设备名, 最后在pb1 primary节点执行, 注意先后顺序.

SELECT polar_vfs_disk_expansion('nvme1n1');  
  
返回如下:  
 polar_vfs_disk_expansion   
--------------------------  
 t  
(1 row)

执行完毕后,数据库实例层面的扩容也就完成了。此时,新的存储空间已经能够被数据库使用了。

参考

《穷鬼玩PolarDB RAC一写多读集群系列 | 在Docker容器中用loop设备模拟共享存储》

《穷鬼玩PolarDB RAC一写多读集群系列 | 如何搭建PolarDB容灾(standby)节点》

https://apsaradb.github.io/PolarDB-for-PostgreSQL/zh/operation/grow-storage.html#%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AE%9E%E4%BE%8B%E5%B1%82%E6%89%A9%E5%AE%B9

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
6月前
|
存储 关系型数据库 分布式数据库
喜报|阿里云PolarDB数据库(分布式版)荣获国内首台(套)产品奖项
阿里云PolarDB数据库管理软件(分布式版)荣获「2024年度国内首版次软件」称号,并跻身《2024年度浙江省首台(套)推广应用典型案例》。
|
8月前
|
关系型数据库 MySQL 数据库
MyEMS开源系统安装之数据库
本文详细讲解MyEMS的安装步骤,重点介绍数据库架构与脚本部署。MyEMS支持MySQL 8.0、MariaDB 10.5及SingleStore 7.0等数据库服务器。通过命令行或客户端工具执行SQL脚本完成安装,包括多个数据库(如myems_billing_db、myems_energy_db等)。此外,提供解决常见问题的方法,如“用户拒绝访问”、“COLLATE设置”和“MAX_ALLOWED_PACKET错误”。注意,不建议在生产环境中将数据库安装于Docker容器内。
239 1
|
7月前
|
关系型数据库 分布式数据库 数据库
再获殊荣,阿里云PolarDB数据库蝉联SIGMOD最佳论文奖
内存池化技术新突破,阿里云PolarDB蝉联SIGMOD最佳论文奖
|
4月前
|
Cloud Native 关系型数据库 MySQL
免费体验!高效实现自建 MySQL 数据库平滑迁移至 PolarDB-X
PolarDB-X 是阿里云推出的云原生分布式数据库,支持PB级存储扩展、高并发访问与数据强一致,助力企业实现MySQL平滑迁移。现已开放免费体验,点击即享高效、稳定的数据库升级方案。
免费体验!高效实现自建 MySQL 数据库平滑迁移至 PolarDB-X
|
4月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
8月前
|
Cloud Native 关系型数据库 分布式数据库
阿里云PolarDB与沃趣科技携手打造一体化数据库解决方案,助推国产数据库生态发展
阿里云瑶池数据库与沃趣科技将继续深化合作,共同推动国产数据库技术的持续创新与广泛应用,为行业生态的繁荣注入更强劲的技术动力。
阿里云PolarDB与沃趣科技携手打造一体化数据库解决方案,助推国产数据库生态发展
|
6月前
|
关系型数据库 分布式数据库 数据库
阿里云PolarDB数据库蝉联SIGMOD最佳论文奖
阿里云PolarDB凭借全球首创基于CXL Switch的分布式内存池技术,在SIGMOD 2025上荣获工业赛道“最佳论文奖”,连续两年蝉联该顶会最高奖项。其创新架构PolarCXLMem打破传统RDMA技术瓶颈,性能提升2.1倍,并已落地应用于内存池化场景,推动大模型推理与多模态存储发展,展现CXL Switch在高速互联中的巨大潜力。
阿里云PolarDB数据库蝉联SIGMOD最佳论文奖
|
7月前
|
Cloud Native 关系型数据库 分布式数据库
客户说|知乎基于阿里云PolarDB,实现最大数据库集群云原生升级
近日,知乎最大的风控业务数据库集群,基于阿里云瑶池数据库完成了云原生技术架构的升级。此次升级不仅显著提升了系统的高可用性和性能上限,还大幅降低了底层资源成本。
|
8月前
|
存储 Cloud Native 关系型数据库
PolarDB开源:云原生数据库的架构革命
本文围绕开源核心价值、社区运营实践和技术演进路线展开。首先解读存算分离架构的三大突破,包括基于RDMA的分布式存储、计算节点扩展及存储池扩容机制,并强调与MySQL的高兼容性。其次分享阿里巴巴开源治理模式,涵盖技术决策、版本发布和贡献者成长体系,同时展示企业应用案例。最后展望技术路线图,如3.0版本的多写多读架构、智能调优引擎等特性,以及开发者生态建设举措,推荐使用PolarDB-Operator实现高效部署。
422 4

相关产品

  • 云原生数据库 PolarDB