Description
如何给一个PolarDB实例挂载多个共享盘?
为什么有这个问题呢?
因为一块共享盘在“容量、IOPS、吞吐”等指标都有上限, 如果能挂载多块共享盘, 那么可以提升PolarDB单实例的存储空间、IO性能, 突破单盘上限.
例如在阿里云上可以选择支持NVMe协议的ESSD存储, 非易失性存储器标准接口NVMe(Non-Volatile Memory Express)是一种专为固态存储(如基于闪存的SSD)设计的高速接口协议,支持存储设备直接与CPU通信,无需经过传统存储接口和协议(如SATA、SAS)中必需的控制器,从而减少了数据传输过程中的延迟。当ECS实例基于NVMe协议挂载云盘时,允许云盘直接与ECS实例的CPU通信,从而大大减少了数据传输路径,显著降低了I/O访问的延迟时间。
单块最高规格的ESSD PL3容量最大能到64TB, 100万IOPS, 4GB吞吐.
当您将单块云盘同时挂载到多台ECS实例时,所有ECS实例的性能总和不能超过该云盘的性能上限。
由于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
以上详细参考文档:
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'
以上详见如下文档:
要么就是pfs可以支持多个共享盘, 要么就是PolarDB可以支持多个共享data目录(通过表空间或内部自动分配存储空间?).
请问该如何解决给一个PolarDB实例挂载多个共享盘的问题呢?