数据管理的艺术:PolarDB开源版详评与实战部署策略(二)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
云服务器 ECS,每月免费额度200元 3个月
简介: PolarDB-PG是阿里云的一款云原生关系型数据库,100%兼容PostgreSQL,支持Oracle语法,采用Shared-Storage存储计算分离架构,提供极致弹性、毫秒级延迟的HTAP能力。具备高可用、高可靠和弹性扩展特性,支持单机、存储计算分离和X-Paxos三节点等多种部署形态。通过Docker可快速部署实例,包括单节点、一主一备和HTAP(一主两备)实例。此外,文章还介绍了在ECS上使用ESSD云盘搭建PolarDB-PG的详细步骤,适合开发和测试环境。

前言

在前面一篇文章里,已经初步学习了如何部署PolarDB的开源版本PolarDB-X,这一篇,我想把重点放在PolarDB的另一个开源版本——PolarDB-PG上。重点在于体验PolarDB-PG的高性能处理能力、企业级特性,以及它在复杂查询处理和高可用部署方面的独特优势。

PolarDB-PG

PolarDB PostgreSQL版(下文简称为 PolarDB-PG)是一款阿里云自主研发的云原生关系型数据库产品,100% 兼容 PostgreSQL,高度兼容Oracle语法(公有云版支持Oracle语法);采用基于 Shared-Storage 的存储计算分离架构,具有极致弹性、毫秒级延迟、HTAP 的能力和高可靠、高可用、弹性扩展等企业级数据库特性。同时,PolarDB 具有大规模并行计算能力,可以应对OLTP与OLAP混合负载。

产品特性

  • 极致弹性:存储与计算能力均可独立地横向扩展。

    • 当计算能力不够时,可以单独扩展计算集群,数据无需复制。

    • 当存储容量或 I/O 不够时,可以单独扩展存储集群,而不中断业务。

  • 毫秒级延迟:

    • WAL 日志存储在共享存储上,RW 到所有 RO 之间仅复制 WAL 的元数据。

    • 独创的 LogIndex 技术,实现了 Lazy 回放和 Parallel 回放,理论上最大程度地缩小了 RW 和 RO 节点间的延迟。

  • HTAP 能力:基于 Shared-Storage 的分布式并行执行框架,加速在 OLTP 场景下的 OLAP 查询。一套 OLTP 型的数据,可支持 2 套计算引擎:

    • 单机执行引擎:处理高并发的 TP 型负载。

    • 分布式执行引擎:处理大查询的 AP 型负载。

PolarDB-PG 还支持时空、GIS、图像、向量、搜索、图谱等多模创新特性,应对企业对数据处理日新月异的需求。

PolarDB-PG 支持多种部署形态:单机本地部署存储计算分离部署X-Paxos三节点部署

架构简介

PolarDB for PostgreSQL 采用了基于 Shared-Storage 的存储计算分离架构。数据库由传统的 Shared-Nothing 架构,转变成了 Shared-Storage 架构——由原来的 N 份计算 + N 份存储,转变成了 N 份计算 + 1 份存储;而 PostgreSQL 使用了传统的单体数据库架构,存储和计算耦合在一起。

image.png

为保证所有计算节点能够以相同的可见性视角访问分布式块存储设备,PolarDB 需要使用分布式文件系统 PolarDB File System(PFS) 来访问块设备,其实现原理可参考发表在 2018 年 VLDB 上的论文polarfs-paper;如果所有计算节点都可以本地访问同一个块存储设备,那么也可以不使用 PFS,直接使用本地的单机文件系统(如 ext4)。这是与 PostgreSQL 的不同点之一。

使用Docker直接部署PolarDB for PostgreSQL实例

PolarDB for PostgreSQL的本地安装部署依赖Docker,需要在机器上预装Docker。

执行如下命令,配置Docker的yum软件源。

yum install -y yum-utils
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

image.png
image.png

执行如下命令,安装Docker。

yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

image.png

执行如下命令,启动Docker系统服务。

systemctl start docker

执行如下命令,测试Docker是否安装成功。

docker run hello-world

返回结果如下,表示Docker已经安装成功。

image.png

DockerHub上已有内含PolarDB-PG多形态实例的镜像。直接拉取镜像并运行,即可启动PolarDB实例。

执行如下命令,拉取PolarDB-PG实例镜像。

docker pull polardb/polardb_pg_local_instance

image.png

执行如下命令,创建运行并进入容器。

docker run \
    -it --cap-add=SYS_PTRACE --privileged=true \
    --name polardb_pg_htap \
    polardb/polardb_pg_local_instance \
    bash

执行如下命令,使用psql客户端工具连接PolarDB-PG并执行SQL。

psql -h 127.0.0.1 -c 'select version();'

返回结果如下,表示PolarDB-PG单节点实例连接成功,并且查看到版本号。

image.png

输入exit并回车,退出容器。

使用Docker在开发镜像中源码编译部署PolarDB for PostgreSQL实例

DockerHub上已有包含源码编译PolarDB for PostgreSQL所需所有工具和依赖的开发镜像。拉取镜像并启动容器,克隆代码,然后从源码编译出 PolarDB for PostgreSQL的各种形态的实例。本步骤指导您如何使用Docker在开发镜像中源码编译部署PolarDB for PostgreSQL单节点实例、双节点(一主一备)实例和HTAP 实例(一主两备)。

执行如下命令,拉取PolarDB-PG开发镜像。

docker pull polardb/polardb_pg_devel

image.png

执行如下命令,创建并启动容器。

docker run -it \
    --cap-add=SYS_PTRACE --privileged=true \
    --name polardb_pg \
    polardb/polardb_pg_devel bash

image.png

执行如下命令,从GitHub上克隆PolarDB-PG稳定分支源码。

git clone -b POLARDB_11_STABLE https://github.com/ApsaraDB/PolarDB-for-PostgreSQL.git

image.png

执行如下命令,进入源码目录。

cd PolarDB-for-PostgreSQL/

image.png

部署PolarDB for PostgreSQL单节点实例

./polardb_build.sh

image.png

返回结果如下,表示PolarDB for PostgreSQL单节点实例部署成功。

image.png

执行如下命令,使用psql客户端工具连接单节点并执行SQL语句。

psql -h 127.0.0.1 -p5432 -c 'select version();'

返回结果如下,表示PolarDB for PostgreSQL单节点连接成功,并且查看到版本号。

image.png

部署PolarDB for PostgreSQL双节点(一主一备)实例

执行如下命令,部署PolarDB for PostgreSQL双节点(一主一备)实例。

./polardb_build.sh --withrep --repnum=1

返回结果如下,表示PolarDB for PostgreSQL双节点(一主一备)实例部署成功。

image.png

执行如下命令,分别连接两个节点并执行SQL语句。

psql -h 127.0.0.1 -p5432 -c 'select version();
psql -h 127.0.0.1 -p5433 -c 'select version();'

返回结果如下,表示PolarDB for PostgreSQL双节点连接成功,并且查看到版本号。

image.png

部署PolarDB for PostgreSQL HTAP实例(一主两备)

执行如下命令,部署PolarDB for PostgreSQL HTAP实例(一主两备)。

./polardb_build.sh --initpx

返回结果如下,表示PolarDB for PostgreSQL HTAP实例(一主两备)部署成功。

image.png

执行如下命令,分别连接三个节点并执行SQL语句。

psql -h 127.0.0.1 -p5432 -c 'select version();
'psql -h 127.0.0.1 -p5433 -c 'select version();
'psql -h 127.0.0.1 -p5434 -c 'select version();'

返回结果如下,表示PolarDB for PostgreSQL三节点连接成功,并且查看到版本号。

image.png

以上就是基于docker的快速部署方式。

快速部署只适用于小型项目或原型验证环境。由于其便捷的特性,可以在短时间内快速搭建起开发、测试乃至演示环境。这种方式能够极大地节省时间与资源,使得开发者能够更加专注于业务逻辑的实现,而非环境配置与依赖管理。

然而,快速部署并不总是适用于所有场景,特别是对于大型企业级应用或者对安全性、稳定性有严格要求的生产环境。在这些情况下,通常需要更细致的规划、更复杂的部署流程以及一系列的监控、备份、故障转移等策略来确保服务的高可用性和数据的安全性。

下面就来介绍正式环境下的部署方式及最佳实践:

部署 PolarDB PostgreSQL版需要在以下三个层面上做准备:

  • 块存储设备层:用于提供存储介质。可以是单个物理块存储设备(本地存储),也可以是多个物理块设备构成的分布式块存储。

  • 文件系统层:由于 PostgreSQL 将数据存储在文件中,因此需要在块存储设备上架设文件系统。根据底层块存储设备的不同,可以选用单机文件系统(如 ext4)或分布式文件系统 PolarDB File System(PFS)。

  • 数据库层:PolarDB for PostgreSQL 的编译和部署环境。

以下表格给出了三个层次排列组合出的的不同实践方

image.png

基于阿里云ECS+ESSD云盘共享存储搭建PolarDB for PostgreSQL

最佳实践手册参考如下:https://openpolardb.com/document?type=PolarDB-PG

image.png

首先需要准备两台或以上的 阿里云 ECS。目前,ECS 对支持 ESSD 多重挂载的规格有较多限制,详情请参考 使用限制。仅 部分可用区、部分规格(ecs.g7se、ecs.c7se、ecs.r7se)的 ECS 实例可以支持 ESSD 的多重挂载。如图,请务必选择支持多重挂载的 ECS 规格:

image.png

这里要注意的只有两点:第一,按量付费节约钱第二,特殊型号 ecs.g7se系列

这里我把系统盘缩了一半,再节约一点资源,其他的都不变了。

image.png

选择自定义密码,输入两次密码。

image.png

在同一个可用区下创建两台,如下所示:

image.png

接下来开始准备 ESSD 云盘,在阿里云 ECS 的管理控制台中,选择【存储与快照】下的【云盘】,点击【创建云盘】。在与已经建好的 ECS 所在的相同可用区内,选择建立一个 ESSD 云盘,并勾选 多实例挂载。如果您的 ECS 不符合多实例挂载的限制条件,则该选框不会出现。

image.png
image.png
image.png

购买后如下图所示,显示待挂载:

image.png

点击挂载:

image.png

接下来,把这个云盘分别挂载到两台 ECS 上:

image.png

挂载完毕后,查看该云盘,将会显示该云盘已经挂载的两台 ECS 实例:

Layer 1 copy.png

然后再分别进到两台服务器中去查看,执行如下命令:

lsblk

image.png
image.png

接下来,将在两台 ECS 上分别部署 PolarDB 的主节点和只读节点。作为前提,需要在 ECS 共享的 ESSD 块设备上 格式化并挂载 PFS,并且,还需要完成部署docker

PolarDB File System,简称 PFS 或 PolarFS,是由阿里云自主研发的高性能类 POSIX 的用户态分布式文件系统,服务于阿里云数据库 PolarDB 产品。使用 PFS 对共享存储进行格式化并挂载后,能够保证一个计算节点对共享存储的写入能够立刻对另一个计算节点可见。

推荐使用 DockerHub 上的 PolarDB for PostgreSQL 可执行文件镜像,目前支持 linux/amd64 和 linux/arm64 两种架构,其中已经包含了编译完毕的 PFS 工具,无需手动编译安装。通过以下命令进入容器即可:

docker pull polardb/polardb_pg_binary
docker run -it \
    --cap-add=SYS_PTRACE \
    --privileged=true \
    --name polardb_pg \
    --shm-size=512m \
    polardb/polardb_pg_binary \
    bash

使用任意一台主机,在共享存储块设备上格式化 PFS 分布式文件系统即可:

sudo pfs -C disk mkfs nvme1n1

image.png

分别在两个节点上启动PFS 守护进程,挂载 PFS 文件系统:

sudo /usr/local/polarstore/pfsd/bin/start_pfsd.sh -p nvme1n1 -w 2

image.png

接下来开始准备数据库相关方面。

从 GitHub 上下载 PolarDB for PostgreSQL 的源代码,稳定分支为 POLARDB_11_STABLE。如果因网络原因不能稳定访问 GitHub,则可以访问 Gitee 国内镜像。

git clone -b POLARDB_11_STABLE https://gitee.com/mirrors/PolarDB-for-PostgreSQL

image.png

开始编译部署polarDB。具体使用命令可以参考:

image.png

在主节点上,编译 PolarDB 内核。

./polardb_build.sh --with-pfsd

image.png

上述脚本在编译完成后,会自动部署一个基于 本地文件系统 的实例,运行于5432 端口上。手动键入以下命令停止这个实例,以便 在 PFS 和共享存储上重新部署实例:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/pg_ctl-D $HOME/tmp_master_dir_polardb_pg_1100_bld/ stop

image.png

此时两个节点间还无法识别,所以下来需要进行一些初始化配置。

初始化读写节点的本地数据目录 ~/primary/:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/initdb -D $HOME/primary

image.png

在共享存储的 /nvme1n1/shared_data/ 路径上创建共享数据目录,然后使用 polar-initdb.sh 脚本初始化共享数据目录:

# 使用 pfs 创建共享数据目录
sudo pfs -C disk mkdir /nvme1n1/shared_data
# 初始化 db 的本地和共享数据目录
sudo $HOME/tmp_basedir_polardb_pg_1100_bld/bin/polar-initdb.sh \
    $HOME/primary/ /nvme1n1/shared_data/

image.png

编辑读写节点的配置。打开 ~/primary/postgresql.conf,增加配置项:

port=5432
polar_hostid=1
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'
logging_collector=on
log_line_prefix='%p\t%r\t%u\t%m\t'
log_directory='pg_log'
listen_addresses='*'
max_connections=1000
synchronous_standby_names='replica1'

image.png

编辑读写节点的客户端认证文件 ~/primary/pg_hba.conf,增加以下配置项,允许只读节点进行物理复制:

host    replication    postgres    0.0.0.0/0    trust

image.png

最后,启动读写节点:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/pg_ctl start -D $HOME/primary

检查读写节点能否正常运行:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql \
    -p 5432 \
    -d postgres \
    -c 'SELECT version();'

image.png

在读写节点上,为对应的只读节点创建相应的复制槽,用于只读节点的物理复制:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql \
    -p 5432 \
    -d postgres \
    -c "SELECT pg_create_physical_replication_slot('replica1');"
 pg_create_physical_replication_slot

下面来配置只读节点。

在只读节点本地磁盘的 ~/replica1 路径上创建一个空目录,然后通过 polar-replica-initdb.sh 脚本使用共享存储上的数据目录来初始化只读节点的本地目录。初始化后的本地目录中没有默认配置文件,所以还需要使用 initdb 创建一个临时的本地目录模板,然后将所有的默认配置文件拷贝到只读节点的本地目录下:

mkdir -m 0700 $HOME/replica1
sudo ~/tmp_basedir_polardb_pg_1100_bld/bin/polar-replica-initdb.sh \
    /nvme1n1/shared_data/ $HOME/replica1/

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/initdb -D /tmp/replica1
cp /tmp/replica1/*.conf $HOME/replica1/

image.png

编辑只读节点的配置。打开 ~/replica1/postgresql.conf,增加配置项:

port=5433
polar_hostid=2
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'
logging_collector=on
log_line_prefix='%p\t%r\t%u\t%m\t'
log_directory='pg_log'
listen_addresses='*'
max_connections=1000

image.png

创建只读节点的复制配置文件 ~/replica1/recovery.conf,增加读写节点的连接信息,以及复制槽名称:

polar_replica='on'
recovery_target_timeline='latest'
primary_slot_name='replica1'
primary_conninfo='host=[读写节点所在IP] port=5432 user=postgres dbname=postgres application_name=replica1'

最后,启动只读节点:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/pg_ctl start -D $HOME/replica1

检查只读节点能否正常运行:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql \
    -p 5433 \
    -d postgres \
    -c 'SELECT version();'

image.png

最后开展集群测试。部署完成后,需要进行实例检查和测试,确保读写节点可正常写入数据、只读节点可以正常读取。

登录 读写节点,创建测试表并插入样例数据:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql -q \
    -p 5432 \
    -d postgres \
    -c "CREATE TABLE t (t1 INT PRIMARY KEY, t2 INT); INSERT INTO t VALUES (1, 1),(2, 3),(3, 3);"

image.png

登录 只读节点,查询刚刚插入的样例数据:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql -q \
    -p 5433 \
    -d postgres \
    -c "SELECT * FROM t;"
 t1 | t2

image.png

在读写节点上插入的数据对只读节点可见,这意味着基于共享存储的 PolarDB 计算节点集群搭建成功。

结语

在PolarDB-PG的部署上没有碰见那么多稀奇古怪的问题,花费时间比较多的反而是在datahub上拉镜像,这个过程由于网络因素显得不那么顺畅,建议能把PolarDB-PG的镜像托管到阿里自己的容器服务里面,进一步简化部署与管理流程,让开发者能够更加专注于业务逻辑本身,而不是被基础设施的细节所牵绊。这样的改进无疑将极大提升用户的整体体验,促进PolarDB-PG在开源社区的推广与应用。

image.png

值得表扬的是,我个人认为PG版的文档写的比polar-X要详细一些,不仅覆盖了从基础安装到高级配置的每一个步骤,还包含了丰富的示例和解释,大大降低了入门门槛,使得开发者能够更加专注于技术的探索与应用。当然,要说到最佳实践的话其实也还有很大的进步空间,增加更多实战案例分析、性能调优指南以及与第三方工具和服务的集成教程,让文档不仅仅是操作手册,更成为开发者解决问题、提升技能的宝典。

PolarDB-X和PolarDB-PG,它们各自承载了阿里云在数据库技术领域的深厚积累与创新,分别针对不同的应用场景和用户需求,展示了阿里云在数据库领域的全面布局和技术实力。未来,期待PolarDB系列在不断优化产品功能、强化社区互动与合作中,持续引领数据库技术的前沿发展,开启数据库技术的新篇章。

在此,致谢!

image.png

相关实践学习
基于EBS部署高性能的MySQL服务
如果您通常是通过ECS实例部署MySQL来使用数据库服务,您可以参考本实验操作来搭建高性能的MySQL服务。本实验为您演示如何通过EBS ESSD云盘部署一个高性能的MySQL服务。
相关文章
|
1天前
|
存储 关系型数据库 分布式数据库
【PolarDB开源】深入PolarDB内核:探究存储计算分离架构的设计哲学
【5月更文挑战第20天】PolarDB是阿里巴巴的云原生分布式数据库,以其存储计算分离架构为核心,解决了传统数据库的扩展性和资源灵活性问题。该架构将数据存储和计算处理分开,实现高性能(通过RDMA加速数据传输)、高可用性(多副本冗余保证数据可靠性)和灵活扩展(计算资源独立扩展)。通过动态添加计算节点以应对业务流量变化,PolarDB展示了其在云时代应对复杂业务场景的能力。随着开源项目的进展,PolarDB将持续推动数据库技术发展。
24 6
|
1天前
|
关系型数据库 分布式数据库 PolarDB
【PolarDB开源】PolarDB开源之旅:从零开始搭建分布式数据库集群
【5月更文挑战第20天】PolarDB,阿里云自研的云原生分布式数据库,因其高性能、高可用和易用性备受瞩目。本文指导如何搭建PolarDB集群:准备硬件和软件环境,从GitHub克隆源码,构建Docker镜像,部署控制节点和计算节点,最后验证集群状态。通过开源,PolarDB旨在推动数据库技术进步,邀请用户一同探索其潜力,共创未来。
23 4
|
6天前
|
SQL 容灾 关系型数据库
[版本更新] PolarDB-X V2.4 列存引擎开源正式发布
[版本更新] PolarDB-X V2.4 列存引擎开源正式发布!
[版本更新] PolarDB-X V2.4 列存引擎开源正式发布
|
6天前
|
运维 监控 Java
开源PolarDB-X部署安装评测报告
在部署PolarDB-X时,需先准备符合要求的OS环境和安装JDK等依赖库。遇到的问题包括`protobuf`版本不兼容、`cmake`参数配置错误和启动服务时的配置挑战。文档更新滞后和错误信息不明确增加了安装难度。建议优化文档、提升错误信息引导性、提供自动化安装脚本、加强社区支持和产品功能。尽管安装过程复杂,但产品潜力值得认可,期待改进以提升用户体验。
104 7
|
6天前
|
Web App开发 缓存 数据库
DMS产品常见问题之DMS数据规定失败如何解决
DMS(数据管理服务,Data Management Service)是阿里云提供的一种数据库管理和维护工具,它支持数据的查询、编辑、分析及安全管控;本汇总集中了DMS产品在实际使用中用户常遇到的问题及其相应的解答,目的是为使用者提供快速参考,帮助他们有效地解决在数据管理过程中所面临的挑战。
|
6天前
|
数据管理 数据库 数据安全/隐私保护
数据管理与持久化:深度解析Docker数据卷
Docker 数据卷在容器化应用中扮演着关键角色,它们提供了一种灵活且可持久化的方式来处理应用数据。本文将深入讨论 Docker 数据卷的基本概念、使用方法以及一系列高级应用场景,通过更为丰富和实际的示例代码,帮助大家全面掌握数据卷的使用和管理。
|
4天前
|
JavaScript 前端开发 数据管理
扁平数据转树形结构,让数据管理更清晰
扁平数据转树形结构,让数据管理更清晰
|
6天前
|
运维 数据管理 数据库
数据管理DMS产品使用合集之在阿里云DMS中,想对数据精度进行校验,有什么方法
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
6天前
|
运维 Cloud Native 数据管理
数据管理DMS产品使用合集之数据归档功能可以在 DMS 上自动分批次执行吗
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
6天前
|
NoSQL 数据管理 MongoDB
数据管理DMS产品使用合集之如何通过阿里云的数据管理服务(DMS)导出MongoDB数据
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。