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

本文涉及的产品
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 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

相关实践学习
块存储快速入门
块存储是阿里云为云服务器ECS提供的块设备产品。通过体验挂载数据盘、分区格式化数据盘(Linux)、创建云盘快照、重新初始化数据盘、使用快照回滚云盘和卸载数据盘等功能,带您快速入门块存储。
相关文章
|
1月前
|
关系型数据库 分布式数据库 PolarDB
参与有礼|开源PolarDB文档捉虫
2024年9月,开源PolarDB-PG发布兼容PostgreSQL 15版本,为提升用户体验,特举办“开源文档捉虫”活动,邀请您反馈文档问题和优化建议。活动时间为2024年11月1日至2025年2月28日。参与即有机会赢取PolarDB开源社区T恤、新春茶碗及福字版印礼盒等丰富奖品。更多详情及反馈入口请点击链接。
参与有礼|开源PolarDB文档捉虫
|
1月前
|
数据库
|
2月前
|
存储 关系型数据库 分布式数据库
使用开源PolarDB和imgsmlr进行高效的图片存储和相似度搜索
使用开源PolarDB和imgsmlr进行高效的图片存储和相似度搜索
|
2月前
|
SQL JSON 关系型数据库
MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
【10月更文挑战第3天】MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
194 5
|
2月前
|
关系型数据库 分布式数据库 数据库
PolarDB 开源:推动数据库技术新变革
在数字化时代,数据成为核心资产,数据库的性能和可靠性至关重要。阿里云的PolarDB作为新一代云原生数据库,凭借卓越性能和创新技术脱颖而出。其开源不仅让开发者深入了解内部架构,还促进了数据库生态共建,提升了稳定性与可靠性。PolarDB采用云原生架构,支持快速弹性扩展和高并发访问,具备强大的事务处理能力及数据一致性保证,并且与多种应用无缝兼容。开源PolarDB为国内数据库产业注入新活力,打破国外垄断,推动国产数据库崛起,降低企业成本与风险。未来,PolarDB将在生态建设中持续壮大,助力企业数字化转型。
109 2
|
3月前
惊世骇俗!开源 PolarDB-X 部署安装大冒险,全程心跳与惊喜不断!
【9月更文挑战第8天】作为技术爱好者的我,近期成功完成了开源 PolarDB-X 的部署安装。尽管过程中遇到不少挑战,但通过精心准备环境、下载安装包、配置参数及启动服务等步骤,最终顺利实现部署。本文将详细介绍部署全过程及可能遇到的问题,为您的 PolarDB-X 探索之旅提供参考与启发,希望能让大家在技术海洋里畅游得更加顺利!
178 2
|
3月前
|
关系型数据库 MySQL 分布式数据库
PolarDB开源社区动态:最新版本功能亮点与更新解读
【9月更文挑战第6天】随着云计算技术的发展,分布式数据库系统成为企业数据处理的核心。阿里云的云原生数据库PolarDB自开源以来备受关注,近日发布的最新版本在内核稳定性、性能、分布式CDC架构及基于时间点的恢复等方面均有显著提升,并新增了MySQL一键导入功能。本文将解读这些新特性并提供示例代码,帮助企业更好地利用PolarDB处理实时数据同步和离线分析任务,提升数据安全性。未来,PolarDB将继续创新,为企业提供更高效的数据处理服务。
222 3
|
1月前
|
人工智能 关系型数据库 分布式数据库
拥抱Data+AI|“全球第一”雅迪如何实现智能营销?DMS+PolarDB注入数据新活力
针对雅迪“云销通App”的需求与痛点,本文将介绍阿里云瑶池数据库DMS+PolarDB for AI提供的一站式Data+AI解决方案,助力销售人员高效用数,全面提升销售管理效率。
|
4月前
|
物联网 数据管理 Apache
拥抱IoT浪潮,Apache IoTDB如何成为你的智能数据守护者?解锁物联网新纪元的数据管理秘籍!
【8月更文挑战第22天】随着物联网技术的发展,数据量激增对数据库提出新挑战。Apache IoTDB凭借其面向时间序列数据的设计,在IoT领域脱颖而出。相较于传统数据库,IoTDB采用树形数据模型高效管理实时数据,具备轻量级结构与高并发能力,并集成Hadoop/Spark支持复杂分析。在智能城市等场景下,IoTDB能处理如交通流量等数据,为决策提供支持。IoTDB还提供InfluxDB协议适配器简化迁移过程,并支持细致的权限管理确保数据安全。综上所述,IoTDB在IoT数据管理中展现出巨大潜力与竞争力。
121 1
|
5月前
|
SQL NoSQL 数据管理
数据管理DMS使用问题之如何批量导入MongoDB的数据文件
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。