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

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
简介: 本文继续探讨穷鬼玩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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
2月前
|
Cloud Native 关系型数据库 分布式数据库
世界第一!阿里云PolarDB刷新全球数据库性能及性价比记录
世界第一!阿里云PolarDB刷新全球数据库性能及性价比记录
|
2月前
|
关系型数据库 分布式数据库 数据库
喜报|PolarDB开源社区荣获“2024数据库国内活跃开源项目”奖
喜报|PolarDB开源社区荣获“2024数据库国内活跃开源项目”奖
|
2月前
|
关系型数据库 分布式数据库 数据库
首届全国大学生计算机系统能力大赛PolarDB数据库创新设计赛(天池杯)圆满收官
首届全国大学生计算机系统能力大赛PolarDB数据库创新设计赛(天池杯)圆满收官
|
2月前
|
Cloud Native 关系型数据库 分布式数据库
世界第一!阿里云PolarDB刷新全球数据库性能及性价比记录
世界第一!阿里云PolarDB刷新全球数据库性能及性价比记录
|
2月前
|
存储 NoSQL 关系型数据库
PolarDB开源数据库进阶课17 集成数据湖功能
本文介绍了如何在PolarDB数据库中接入pg_duckdb、pg_mooncake插件以支持数据湖功能, 可以读写对象存储的远程数据, 支持csv, parquet等格式, 支持delta等框架, 并显著提升OLAP性能。
118 1
|
2月前
|
存储 容灾 关系型数据库
PolarDB开源数据库进阶课11 激活容灾(Standby)节点
本文介绍了如何激活PolarDB容灾(Standby)节点,实验环境依赖于Docker容器中用loop设备模拟共享存储。通过`pg_ctl promote`命令可以将Standby节点提升为主节点,使其能够接收读写请求。激活后,原Standby节点不能再成为PolarDB集群的Standby节点。建议删除对应的复制槽位以避免WAL文件堆积。相关操作和配置请参考系列文章及视频教程。
65 1
|
2月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课5 在线备份
本文介绍了如何在PolarDB RAC一写多读集群中进行在线备份,特别针对共享存储模式。通过使用`polar_basebackup`工具,可以将实例的本地数据和共享数据备份到本地盘中。实验环境依赖于Docker容器中用loop设备模拟的共享存储。
64 1
|
2月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课15 集成DeepSeek等大模型
本文介绍了如何在PolarDB数据库中接入私有化大模型服务,以实现多种应用场景。实验环境依赖于Docker容器中的loop设备模拟共享存储,具体搭建方法可参考相关系列文章。文中详细描述了部署ollama服务、编译并安装http和openai插件的过程,并通过示例展示了如何使用这些插件调用大模型API进行文本分析和情感分类等任务。此外,还探讨了如何设计表结构及触发器函数自动处理客户反馈数据,以及生成满足需求的SQL查询语句。最后对比了不同模型的回答效果,展示了deepseek-r1模型的优势。
156 0
|
2月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课14 纯享单机版
PolarDB不仅支持基于“共享存储+多计算节点”的集群版,还提供类似开源PostgreSQL的单机版。单机版部署简单,适合大多数应用场景,并可直接使用PostgreSQL生态插件。通过Docker容器、Git克隆代码、编译软件等步骤,即可完成PolarDB单机版的安装与配置。具体操作包括启动容器、进入容器、克隆代码、编译软件、初始化实例、配置参数及启动数据库。此外,还有多个相关教程和视频链接供参考,帮助用户更好地理解和使用PolarDB单机版。
103 0
|
2月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课13 单机版转换为集群版
本文介绍如何将“本地存储实例”转换为“共享存储实例”,依赖于先前搭建的实验环境。主要步骤包括:准备PFS二进制文件、格式化共享盘为pfs文件系统、启动pfsd服务、停库并拷贝数据到pfs内、修改配置文件,最后启动实例。通过这些操作,成功实现了从本地存储到共享存储的转换,并验证了新实例的功能。相关系列文章和视频链接提供了更多背景信息和技术细节。
52 0

相关产品

  • 云原生数据库 PolarDB
  • 下一篇
    oss创建bucket