DuckDB是真火!PolarDB都跑来蹭热度了

文摘   2024-11-15 12:44   北京  

参考文档点击文末阅读原文打开; 推荐《最好的PostgreSQL学习镜像;


PolarDB开源版也,吃上鸭子肉了

最近各个数据库厂都在吃鸭子,MySQL已经吃上性能提升1000x《MySQL气数已尽?靠DuckDB能续命吗?》今天终于轮到PolarDB了,性能提升20x+

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语法:

CREATE SECRET my_secret (    
      TYPE S3,    
      KEY_ID 'xxx',    
      SECRET 'xxx',    
      endpoint 's3.oss-cn-shanghai.aliyuncs.com'    
  );    
┌─────────┐    
│ Success │    
│ boolean │    
├─────────┤    
│ true    │    
└─────────┘    
    
create table a(id int, info text);      
insert into a select rangemd5(random()::textfrom 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

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) 及视频号:


数据库杂记
数据库技术专家,PostgreSQL ACE,SAP HANA,Sybase ASE/ASA,Oracle,MySQL,SQLite各类数据库, SAP BTP云计算技术, 以及陈式太极拳教学倾情分享。出版过三本技术图书,武术6段。
 最新文章