DuckDB是真火!PolarDB都跑来蹭热度了
参考文档点击文末 阅读原文 打开; 推荐 《最好的PostgreSQL学习镜像 》 ;
PolarDB开源版也,吃上鸭子肉了
最近各个数据库厂都在吃鸭子,MySQL已经吃上性能提升 1000x : 《MySQL气数已尽?靠DuckDB能续命吗?》 今天终于轮到PolarDB了,性能提升 20 x+ 。PolarDB for PostgreSQL 15版本已开源, 支持table access method接口, 可以接入PG的更多高级插件. 例如利用pg_duckdb插件实现灵活的冷热分离存储和OLAP请求加速.
本文将简单介绍PolarDB PG 15 编译安装 & pg_duckdb 插件 + OSS 试用.
PolarDB PG 15 编译安装
macOS为例
1、测试环境安装, docker desktop 略
2、在macOS宿主机创建volumn目录
mkdir ~/data_volumn
cd ~/data_volumn
PWD=`pwd`
3、拉取PolarDB开发环境镜像
docker pull registry.cn-hangzhou.aliyuncs.com/polardb_pg/polardb_pg_devel:ubuntu22.04
4、启动容器
docker run -d -it -v $PWD:/data -P --shm-size=1g --cap-add=SYS_PTRACE --cap-add SYS_ADMIN --privileged=true --name polardb registry.cn-hangzhou.aliyuncs.com/polardb_pg/polardb_pg_devel:ubuntu22.04 bash
5、编译安装PolarDB PG 15 稳定分支
# 进入容器
docker exec -ti polardb bash
# 进入容器内的卷目录
cd /data
# 克隆PolarDB 15 稳定分支代码
git clone --depth 1 -b POLARDB_15_STABLE https://github.com/ApsaraDB/PolarDB-for-PostgreSQL
# 编译安装PolarDB 15
cd /data/PolarDB-for-PostgreSQL
./build.sh --prefix=/data/polardb --jobs=4 --debug=off --ws=0 --wr=1
# 按提示配置环境变量
-- Following command can be used to connect to PolarDB:
-- export PATH=/data/polardb/tmp_polardb_pg_15_base/bin:$PATH
-- psql -h127.0.0.1 -p37749 postgres #primary
-- psql -h127.0.0.1 -p34509 postgres #replica1
echo "export PATH=/data/polardb/tmp_polardb_pg_15_base/bin:$PATH" >> ~/.bash_profile
echo "export PGDATA=/data/polardb/tmp_polardb_pg_15_primary" >> ~/.bash_profile
# 应用环境变量
. ~/.bash_profile
6、容器内 验证PolarDB-PG已成功部署
psql
postgres=# SELECT version();
version
------------------------------------------------------------------------
PostgreSQL 15.8 (PolarDB 15.8.2.0 build 891d33b9) on aarch64-linux-gnu
(1 row)
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 17519
usesysid | 10
usename | postgres
application_name | replica1
client_addr | 127.0.0.1
client_hostname |
client_port | 57648
backend_start | 2024-11-11 10:56:04.949852+08
backend_xmin |
state | streaming
sent_lsn | 0/40B7DB28
write_lsn | 0/40B7DB28
flush_lsn | 0/40B7DB28
replay_lsn | 0/40B7DB28
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async
reply_time | 2024-11-11 10:59:41.052145+08
# 查看PolarDB的编译选项
pg_config
在PolarDB开源版本中 试用 pg_duckdb 插件
参考: https://github.com/duckdb/pg_duckdb/blob/main/docs/compilation.md
1、在容器内安装pg_duckdb
cd /data
git clone --depth 1 https://github.com/duckdb/pg_duckdb
cd /data/pg_duckdb
sudo apt-get install ninja-build
make install
2、配置 shared_preload_libraries
# 查询 shared_preload_libraries 当前配置
psql
psql (PostgreSQL 15.8 (PolarDB 15.8.2.0 build 891d33b9) on aarch64-linux-gnu)
Type "help" for help.
postgres=# show shared_preload_libraries ;
shared_preload_libraries
--------------------------------------------------------------------------------------------
$libdir/polar_vfs,$libdir/polar_io_stat,$libdir/polar_monitor_preload,$libdir/polar_worker
(1 row)
配置 shared_preload_libraries
echo "shared_preload_libraries = '\$libdir/polar_vfs,\$libdir/polar_io_stat,\$libdir/polar_monitor_preload,\$libdir/polar_worker,\$libdir/pg_duckdb'" >> /data/polardb/tmp_polardb_pg_15_replica1/postgresql.auto.conf
echo "shared_preload_libraries = '\$libdir/polar_vfs,\$libdir/polar_io_stat,\$libdir/polar_monitor_preload,\$libdir/polar_worker,\$libdir/pg_duckdb'" >> /data/polardb/tmp_polardb_pg_15_primary/postgresql.auto.conf
3、重启PolarDB数据库
pg_ctl stop -m fast -D /data/polardb/tmp_polardb_pg_15_replica1
pg_ctl stop -m fast -D /data/polardb/tmp_polardb_pg_15_primary
pg_ctl start -D /data/polardb/tmp_polardb_pg_15_primary
pg_ctl start -D /data/polardb/tmp_polardb_pg_15_replica1
4、创建pg_duckdb插件
psql
psql (PostgreSQL 15.8 (PolarDB 15.8.2.0 build 891d33b9) on aarch64-linux-gnu)
Type "help" for help.
postgres=# create extension pg_duckdb ;
CREATE EXTENSION
postgres=# show duckdb.
duckdb.allow_unsigned_extensions duckdb.force_execution duckdb.memory_limit duckdb.motherduck_token duckdb.worker_threads
duckdb.disabled_filesystems duckdb.max_memory duckdb.motherduck_enabled duckdb.postgres_role
duckdb.enable_external_access duckdb.max_threads_per_postgres_scan duckdb.motherduck_postgres_database duckdb.threads
5、创建duckdb临时表(目前pg_duckdb 还是要带货motherduck云服务的. 不过代码都开源了, 未来支持本地存储持久化duckdb表应该也不是问题.)
postgres=# create table t(id int, c1 int, c2 float8, c3 text, c4 timestamp) using duckdb;
ERROR: Only TEMP tables are supported in DuckDB if MotherDuck support is not enabled
postgres=# create temp table t(id int, c1 int, c2 float8, c3 text, c4 timestamp) using duckdb;
CREATE TABLE
插入1000万数据
postgres=# insert into t select id::int,random()*100, random()*1000,md5(random()::text),now() from generate_series(1,10000000) t(id);
postgres=# \d+ t
Table "pg_temp_14.t"
Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
--------+-----------------------------+-----------+----------+---------+----------+-------------+--------------+-------------
id | integer | | | | plain | | |
c1 | integer | | | | plain | | |
c2 | double precision | | | | plain | | |
c3 | text | | | | extended | | |
c4 | timestamp without time zone | | | | plain | | |
Access method: duckdb
简单的测试一下耗时
postgres=# \timing
Timing is on.
postgres=# select count(*) from t;
count
----------
10000000
(1 row)
Time: 8.246 ms
postgres=# select count(distinct id) from t;
count
----------
10000000
(1 row)
Time: 224.928 ms
6、简单对比PostgreSQL本地表
更复杂的对比可以参考:
-
《PG被DuckDB碾压,该反省哪些方面? DuckDB v0.10.3 在Macmini 2023款上的tpch性能表现如何? PostgreSQL使用duckdb_fdw 的tpch加速性能表现如何?》
创建本地表
postgres=# create table t_pg (like t);
CREATE TABLE
Time: 40.752 ms
postgres=# \d+ t_pg
Table "public.t_pg"
Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
--------+-----------------------------+-----------+----------+---------+----------+-------------+--------------+-------------
id | integer | | | | plain | | |
c1 | integer | | | | plain | | |
c2 | double precision | | | | plain | | |
c3 | text | | | | extended | | |
c4 | timestamp without time zone | | | | plain | | |
Access method: heap
目前不支持从duckdb写入本地表, 未来可能会支持
postgres=# insert into t_pg select * from t;
ERROR: DuckDB does not support modififying Postgres tables
Time: 1.887 ms
写入1000万数据
postgres=# insert into t_pg select id::int,random()*100, random()*1000,md5(random()::text),now() from generate_series(1,10000000) t(id);
INSERT 0 10000000
本地表相比duckdb还是有很大差距的, 20倍以上吧.
postgres=# select count(*) from t_pg;
count
----------
10000000
(1 row)
Time: 303.805 ms
postgres=# select count(distinct id) from t_pg;
count
----------
10000000
(1 row)
Time: 4685.524 ms (00:04.686)
oss + pg_duckdb
duckdb的优势除了AP性能强, 另外就是对接对象存储非常方便, 容易实现数据湖架构, 共享多个实例的数据、冷热分离存储等.
手册中的例子
-- Session Token is Optional
INSERT INTO duckdb.secrets
(type, key_id, secret, session_token, region)
VALUES ('S3', 'access_key_id', 'secret_access_key', 'session_token', 'us-east-1');
COPY (SELECT user_id, item_id, price, purchased_at FROM purchases)
TO 's3://your-bucket/purchases.parquet;
SELECT SUM(price) AS total, item_id
FROM read_parquet('s3://your-bucket/purchases.parquet')
AS (price float, item_id int)
GROUP BY item_id
ORDER BY total DESC
LIMIT 100;
使用阿里云OSS的配置例子, duckdb secret语法:
D CREATE SECRET my_secret (
TYPE S3,
KEY_ID 'xxx',
SECRET 'xxx',
endpoint 's3.oss-cn-shanghai.aliyuncs.com'
);
┌─────────┐
│ Success │
│ boolean │
├─────────┤
│ true │
└─────────┘
D create table a(id int, info text);
D insert into a select range, md5(random()::text) from range(1,1000000);
D copy a to 's3://otpawu20240715105432/a.parquet';
session token: https://help.aliyun.com/zh/oss/developer-reference/use-temporary-access-credentials-provided-by-sts-to-access-oss
参考
《开源PolarDB|PostgreSQL 应用开发者&DBA 公开课 - 5.9 PolarDB开源版本必学特性 - 玩转 PolarDB 开源社区》
https://apsaradb.github.io/PolarDB-for-PostgreSQL/zh/development/dev-on-docker.html
《体验MotherDuck读写阿里云OSS》
《DuckDB 新版本 0.10.0 介绍》
《PostgreSQL白嫖DuckDB实现湖仓一体功能》
《PolarDB-PG | PostgreSQL + duckdb_fdw + 阿里云OSS 实现高效低价的海量数据冷热存储分离》
《DuckDB DataLake 场景使用举例 - aliyun OSS对象存储parquet》
《DuckDB 读写 Parquet 文件 - 同时支持远程s3, oss, http等parquet文件读写》
https://github.com/duckdb/pg_duckdb
https://github.com/duckdb/pg_duckdb/tree/main/docs
《PG被DuckDB碾压,该反省哪些方面? DuckDB v0.10.3 在Macmini 2023款上的tpch性能表现如何? PostgreSQL使用duckdb_fdw 的tpch加速性能表现如何?》
https://help.aliyun.com/zh/oss/developer-reference/use-temporary-access-credentials-provided-by-sts-to-access-oss
今日荐书
彩蛋: 国产数据库周边生态
当然一款数据库要流行起来, 除了自己要强大, 还离不开生态. 用好周边生态工具, 管理水平战胜90%老司机!!! 下面简单介绍一下国产数据库周边生态.
1、管控软件
鸣嵩 (前阿里云数据库总经理 / 研究员)等大佬们创业创办的云猿生, 核心产品是 KubeBlocks . 他们的理念是让管理数据库和搭积木一样简单, 如果你要管理很多套并且种类(OLTP\OLAP\NoSQL\KV\TS\MQ等)很多的数据库产品, 推荐首选.-
https://github.com/apecloud/kubeblocks
-
https://www.csudata.com/
-
https://pigsty.cc/zh/
2、审计监控诊断优化
翟总 (曾经是我背后的男人)到海信聚好看后研发的 DBdoctor , 采用ebpf技术, 在对数据库几乎没有影响的情况下实时监控数据库和服务器的各项指标, 发现和诊断问题根因非常方便.-
https://www.dbdoctor.cn/
-
https://bytebase.cc/docs/introduction/what-is-bytebase/
-
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
-
https://www.dsgdata.com/
公开课
如果你对PolarDB学习感兴趣可以阅读这个公开课系列:
- 国庆拿下这个国产信创数据库
-
国产数据库PolarDB公开课-1 架构解读
-
国产数据库PolarDB公开课-2 快速体验
-
国产数据库PolarDB公开课-3 安装部署
- 国产数据库PolarDB公开课-4 日常运维
-
国产数据库PolarDB公开课-5 特性解读与体验
-
国产数据库PolarDB公开课-6 使用PostgreSQL开源工具/插件
-
国产数据库PolarDB公开课-7 应用场景与实践
-
国产数据库PolarDB公开课-7.1 TPCH测试
-
国产数据库PolarDB公开课-8 生态
-
国产数据库PolarDB公开课-9 参与开源社区
除了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) 及视频号: