PolarDB 100 问 | 如何给一个PolarDB实例挂载多个共享盘?
#PolarDB 100问
参考文档点击文末阅读原文打开; 推荐《最好的PostgreSQL学习镜像》;
PolarDB 100 问 | 如何给一个PolarDB实例挂载多个共享盘?
如何给一个PolarDB实例挂载多个共享盘?
为什么有这个问题呢?
因为一块共享盘在“容量、IOPS、吞吐”等指标都有上限, 如果能挂载多块共享盘, 那么可以提升PolarDB单实例的存储空间、IO性能, 突破单盘上限.
例如在阿里云上可以选择支持NVMe协议的ESSD存储, 非易失性存储器标准接口NVMe(Non-Volatile Memory Express)是一种专为固态存储(如基于闪存的SSD)设计的高速接口协议,支持存储设备直接与CPU通信,无需经过传统存储接口和协议(如SATA、SAS)中必需的控制器,从而减少了数据传输过程中的延迟。当ECS实例基于NVMe协议挂载云盘时,允许云盘直接与ECS实例的CPU通信,从而大大减少了数据传输路径,显著降低了I/O访问的延迟时间。
详见: https://help.aliyun.com/zh/ecs/user-guide/nvme-protocol
单块最高规格的ESSD PL3容量最大能到64TB, 100万IOPS, 4GB吞吐.
详见: https://help.aliyun.com/zh/ecs/user-guide/essds
当您将单块云盘同时挂载到多台ECS实例时,所有ECS实例的性能总和不能超过该云盘的性能上限。
详见: https://help.aliyun.com/zh/ecs/user-guide/enable-multi-attach
由于PolarDB是共享存储架构, 一块盘可以挂载给多个计算节点, 一旦跑ePQ多机并行来运行复杂分析查询, 很容易就会达到ESSD盘多吞吐上限. 而对于较繁忙的OLTP实例, 也比较容易达到容量和IOPS上限.
在一个PolarDB实例中支持挂多盘是解决以上瓶颈的不二之选. 但在PolarDB手册中并没有找到支持多盘挂载的说明.
复现方法
按照PolarDB基于共享块设备的部署文档进行尝试如下:
1、块设备重命名
PFS 仅支持访问 以特定字符开头的块设备(详情可见 PolarDB File System 源代码的src/pfs_core/pfs_api.h 文件):
#define PFS_PATH_ISVALID(path) \
(path != NULL && \
((path[0] == '/' && isdigit((path)[1])) || path[0] == '.' \
|| strncmp(path, "/pangu-", 7) == 0 \
|| strncmp(path, "/sd", 3) == 0 \
|| strncmp(path, "/sf", 3) == 0 \
|| strncmp(path, "/vd", 3) == 0 \
|| strncmp(path, "/nvme", 5) == 0 \
|| strncmp(path, "/loop", 5) == 0 \
|| strncmp(path, "/mapper_", 8) ==0))
因此,为了保证能够顺畅完成后续流程,我们建议在所有访问块设备的节点上使用相同的软链接访问共享块设备。例如,在 NBD 服务端主机上,使用新的块设备名/dev/nvme1n1 软链接到共享存储块设备的原有名称/dev/vdb 上:
sudo ln -s /dev/vdb /dev/nvme1n1
在 NBD 客户端主机上,使用同样的块设备名/dev/nvme1n1 软链到共享存储块设备的原有名称/dev/nbd0 上:
sudo ln -s /dev/nbd0 /dev/nvme1n1
这样便可以在服务端和客户端两台主机上使用相同的块设备名/dev/nvme1n1 访问同一个块设备。
2、块设备格式化
使用 任意一台主机,在共享存储块设备上格式化 PFS 分布式文件系统:
sudo pfs -C disk mkfs nvme1n1
3、PFS 文件系统挂载
在能够访问共享存储的 所有主机节点 上分别启动 PFS 守护进程,挂载 PFS 文件系统(-w 4表示pfsd将启动4个工作线程处理IO请求, 越多的话越消耗CPU但是也能处理更大的IOPS和吞吐.):
sudo /usr/local/polarstore/pfsd/bin/start_pfsd.sh -p nvme1n1 -w 4
以上详细参考文档:
https://apsaradb.github.io/PolarDB-for-PostgreSQL/zh/deploying/fs-pfs.html
PFS的更多详细说明请参考:
https://github.com/ApsaraDB/PolarDB-FileSystem/blob/master/docs/PFS_Tools-EN.md https://github.com/ApsaraDB/PolarDB-FileSystem/blob/master/docs/PFS_Tools-CN.md
4、Primary 节点部署
初始化 Primary 节点的本地数据目录~/primary/:
initdb -D $HOME/primary
在共享存储的/nvme1n1/shared_data/ 路径上创建共享数据目录,然后使用polar-initdb.sh 脚本初始化共享数据目录:
# 使用 pfs 创建共享数据目录
sudo pfs -C disk mkdir /nvme1n1/shared_data
# 初始化 db 的本地和共享数据目录
sudo polar-initdb.sh $HOME/primary/ /nvme1n1/shared_data/ primary
编辑 Primary 节点的配置。打开~/primary/postgresql.conf,增加配置项(以下仅展示共享盘相关的配置, 其他配置略):
polar_enable_shared_storage_mode=on
polar_disk_name='nvme1n1'
polar_datadir='/nvme1n1/shared_data/'
polar_vfs.localfs_mode=off
shared_preload_libraries='$libdir/polar_vfs,$libdir/polar_worker'
polar_storage_cluster_name='disk'
以上详见如下文档:
https://apsaradb.github.io/PolarDB-for-PostgreSQL/zh/deploying/db-pfs.html
我在想要么就是pfs可以支持多个共享盘, 要么就是PolarDB可以支持多个共享data目录(通过表空间或内部自动分配存储空间?). 请问该如何解决给一个PolarDB实例挂载多个共享盘的问题呢?
其他解法
可以使用lvm管理多个共享盘, 做成一个大的逻辑卷.
由于需要在多个计算节点上使用一个逻辑卷, 需要依赖集群管理套件.
简化步骤如下:
使用pacemaker管理一个PolarDB实例的所有计算节点, 做成一个集群. 配置并启动lvmlockd (集群lvm锁管理后台进程, 锁、同步变更lvm后的元信息等), 下面是一张比较老的图, 大致意思雷同. pvcreate nvme1n1; pvcreate nvme2n1;创建pv (单个计算节点执行)vgcreate -Ay --shared polardb_vg /dev/nvme1n1 /dev/nvme2n1创建vg. (每个计算节点执行)lvcreate --stripes NumberOfStripes --stripesize StripeSize --size LogicalVolumeSize --name LogicalVolumeName VolumeGroupName创建lv. (单个计算节点执行) 使用条带方式创建lv, 充分利用多盘的能力. 条带介绍请自行搜索.
以上内容更多详细介绍请参考如下文章:
https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_logical_volumes/configuring-lvm-on-shared-storage_configuring-and-managing-logical-volumes#configuring-lvm-on-san-multiple_configuring-lvm-on-shared-storage https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html-single/configuring_and_managing_high_availability_clusters/index?extIdCarryOver=true&sc_cid=701f2000001Css5AAC#proc_configuring-gfs2-for-clustered-samba_adoc-configuring-ha-samba https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html-single/configuring_and_managing_high_availability_clusters/index?extIdCarryOver=true&sc_cid=701f2000001Css5AAC#choosing_ha_lvm_or_shared_volumes https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_logical_volumes/basic-logical-volume-management_configuring-and-managing-logical-volumes#creating-striped-logical-volume_creating-logical-volumes https://blog.csdn.net/dba_waterbin/article/details/8122598 https://blog.51cto.com/evanlinux/1392826
用lvm解决了PolarDB挂载多盘, 好像上一个问题也不存在了, 表空间似乎没有必要了.
《PolarDB 100 问 | 如何解决在PolarDB中使用自定义表空间报错的问题?》
但是使用lvm来支持多盘, 引入了pacemaker集群管理以及lvm, 多了一层依赖, 也多了一层故障点.
pfs/PolarDB能否内置支持多个共享块设备呢?
期待更多解答.
文末彩蛋:国产数据库周边生态
当然一款数据库要流行起来, 除了自己要强大, 还离不开生态. 用好周边生态工具, 管理水平战胜90%老司机!!! 下面简单介绍一下国产数据库周边生态.
1、管控软件
鸣嵩(前阿里云数据库总经理 / 研究员)等大佬们创业创办的云猿生, 核心产品是KubeBlocks. 他们的理念是让管理数据库和搭积木一样简单, 如果你要管理很多套并且种类(OLTP\OLAP\NoSQL\KV\TS\MQ等)很多的数据库产品, 推荐首选.
https://github.com/apecloud/kubeblocks
PG中文社区核心委员唐成老师的公司乘数开源的Clup, 专用管理PostgreSQL和PolarDB的集群管理软件, 如果你要管理很多套数据库, 推荐选择. 并且Clup还提供了企业版、自研的连接池、分布式存储、一体机、备份平台等, 是企业用户推荐之选.
https://www.csudata.com/
若航老司机开源的pigsty, 集成了300多个PG插件的PG集群和PolarDB集群管理软件, 如果你要管理很多套PG或PolarDB数据库, 且对插件有特别多的需求, 推荐选择.
https://pigsty.cc/zh/
2、审计监控诊断优化
翟总(曾经是我背后的男人)到海信聚好看后研发的 DBdoctor, 采用ebpf技术, 在对数据库几乎没有影响的情况下实时监控数据库和服务器的各项指标, 发现和诊断问题根因非常方便.
https://www.dbdoctor.cn/
天舟老哥的核心产品Bytebase 是位于您和数据库之间的中间件。它是数据库 DevOps 的 GitLab/GitHub,专为开发人员、DBA 和平台工程师打造。
https://bytebase.cc/docs/introduction/what-is-bytebase/
PawSQL, SQL优化和诊断产品.
D-Smart, Oracle老前辈白老大出品, 专注企业级市场, 将业界顶级DBA经验的产品化作品, 产品功能包括数据库监控、诊断、优化等.
https://www.modb.pro/db/567140
3、国产数据库IDE
IDE是开发者的必备工具,例如社区有pgAdmin, 国产IDE则可以看看老程序猿达刚老师的DeskUI:
https://www.deskui.com
4、数据同步&迁移&备份恢复
NineData, 老领导出去创业做的产品, 产品涵盖了数据同步、迁移、备份、比对、devops、chatDBA等.
https://www.ninedata.cloud/home
DSG, 非常老牌的数据库同步迁移企业级产品, 支持各种数据库的异构和同构迁移, 用他们的话说, 没有dsg搞不定的迁移, 比goldengate还牛.
https://www.dsgdata.com/
公开课
如果你对PolarDB学习感兴趣可以阅读这个公开课系列:
除了PolarDB还非常值得关注的几款PG栈国产数据库:
HaloDB(基于PG兼容PostgreSQL、Oracle、MySQL. http://www.halodbtech.com/ )、 IvorySQL(基于开源PG兼容PG、Oracle. https://www.ivorysql.org/zh-cn/ )、 ProtonBase(云原生分布式数仓. https://protonbase.com/ )、 成都文武数据库(https://ww-it.cn)
参考文档点击阅读原文获得
感谢关注我的github (https://github.com/digoal/blog) 及视频号: