参考文档点击文末阅读原文打开; 推荐《最好的PostgreSQL学习镜像》;
给PolarDB做个马杀鸡,提速10倍
DuckDB是个香饽饽, 很多传统的OLTP数据库在用它来加速分析场景的应用, 例如:
但是分析场景的数据又岂止是来自一个数据库呢, 它可能来自文件、各个业务线的各个数据库. 搞过数仓的兄弟都知道, 数仓就是个大杂烩.
所以除了加速计算, 还需要有个地方存下这个大杂烩, 以及如何把很多数据源的数据写入其中, 还有就是如何管理大杂烩的元数据? 虽然这是个苦力活, 还是有很多产品在干这个.
例如 BemiDB: https://github.com/BemiHQ/BemiDB
BemiDB 是一个针对分析优化的 Postgres 只读副本。它由一个单一的二进制文件组成,可以无缝连接到 Postgres 数据库,将数据以压缩的列式格式进行复制,并允许您使用其兼容 Postgres 的分析型查询引擎运行复杂查询。
特性
性能:执行分析型查询比 PostgreSQL 快最多 2000 倍。 单一二进制文件:由一个单独的二进制文件组成,可以在任何机器上运行。 PostgreSQL 复制:自动同步来自 PostgreSQL 数据库的数据。 压缩数据:使用开放的列式存储格式,表数据可实现 4 倍压缩。 可扩展存储:存储与计算分离,可以原生支持 S3 存储。 查询引擎:内嵌优化的查询引擎,专为分析型负载而设计。 PostgreSQL 兼容:与 PostgreSQL 生态系统中的任何服务和工具集成。 开源:以 OSI 批准的许可证发布。
使用场景
像使用 PostgreSQL 数据库一样运行复杂的分析查询。无需担心性能影响和索引问题。 将数据栈简化为单一二进制文件。无需复杂的配置,无需数据迁移,无需变更数据捕获(CDC)、ETL 过程或数据仓库(DW)。 与 PostgreSQL 兼容的工具和服务集成。使用 BI 工具、数据分析笔记本和对象关系映射(ORM)工具查询和可视化数据。 自动将所有数据同步到您的数据湖仓中。使用 Iceberg 表和基于对象存储的 Parquet 格式数据。
使用 BemiDB 建立PolarDB的只读副本
PolarDB PG的环境部署请参考如下文章:
生成一些测试数据
postgres=# create table test (id int, info text, ts timestamp, c1 int);
CREATE TABLE
postgres=# insert into test select generate_series(1,10000000), md5(random()::text), clock_timestamp(), random()*100;
INSERT 0 10000000复制
简单的统计查询性能:
postgres=# \timing
Timing is on.
postgres=# select count(distinct c1) from test;
count
-------
101
(1 row)
Time: 5453.293 ms (00:05.453)
postgres=# select count(*) from test;
count
----------
10000000
(1 row)
Time: 1058.494 ms (00:01.058)
postgres=# select count(distinct id) from test;
count
----------
10000000
(1 row)
Time: 5224.128 ms (00:05.224)复制
polardb 监听端口
postgres=# show port;
port
-------
37718
(1 row)复制
下载BemiHQ 二进制使用
cd /data
curl -sSL https://raw.githubusercontent.com/BemiHQ/BemiDB/refs/heads/main/scripts/install.sh | bash复制
同步polardb的数据到iceberg中
./bemidb --pg-database-url postgres://postgres@localhost:37718/postgres sync
2024/12/13 11:06:17 [INFO] Syncing "public"."test"...
2024/12/13 11:07:13 [INFO] Sync from PostgreSQL completed successfully.复制
元数据和数据写入了iceberg目录:
cd iceberg/public/test
目录结构是 schema/table_name
U-4G77XXWF-1921:test digoal$ ll
total 0
drwxr-xr-x 4 digoal staff 128B Dec 13 11:06 ..
drwxr-xr-x 3 digoal staff 96B Dec 13 11:06 data
drwxr-xr-x 4 digoal staff 128B Dec 13 11:07 .
drwxr-xr-x 6 digoal staff 192B Dec 13 11:07 metadata
U-4G77XXWF-1921:test digoal$ cd metadata/
U-4G77XXWF-1921:metadata digoal$ ll
total 32
drwxr-xr-x 4 digoal staff 128B Dec 13 11:07 ..
-rw-r--r-- 1 digoal staff 3.6K Dec 13 11:07 31f5ba1f-71c9-4090-b526-584331481b73-m0.avro
-rw-r--r-- 1 digoal staff 1.5K Dec 13 11:07 snap-1734059233725416467-0-31f5ba1f-71c9-4090-b526-584331481b73.avro
-rw-r--r-- 1 digoal staff 2.1K Dec 13 11:07 v1.metadata.json
drwxr-xr-x 6 digoal staff 192B Dec 13 11:07 .
-rw-r--r-- 1 digoal staff 1B Dec 13 11:07 version-hint.text
U-4G77XXWF-1921:metadata digoal$ cd ../data/
U-4G77XXWF-1921:data digoal$ ll
total 524416
drwxr-xr-x 3 digoal staff 96B Dec 13 11:06 .
-rw-r--r-- 1 digoal staff 252M Dec 13 11:07 00000-0-31f5ba1f-71c9-4090-b526-584331481b73.parquet
drwxr-xr-x 4 digoal staff 128B Dec 13 11:07 ..复制
启动bemidb, 可以看到也用到了DuckDB
./bemidb --storage-type LOCAL --storage-path data/iceberg start
2024/12/13 11:08:48 [INFO] BemiDB: Listening on 127.0.0.1:54321
2024/12/13 11:08:51 [INFO] DuckDB: Connected复制
连接到 bemidb
psql postgres://localhost:54321/bemidb
psql (PostgreSQL 15.10 (PolarDB 15.10.2.0 build d4f5477d) on aarch64-linux-gnu, server 17.0)
WARNING: psql major version 15, server major version 17.
Some psql features might not work.
Type "help" for help.
# 可以看到bemidb管理的元数据
bemidb=> \dt
List of relations
Schema | Name | Type | Owner
-------------+-------------------------------+-------+--------
public | test | table | bemidb复制
在bemidb中执行同样的查询
bemidb=> \timing
Timing is on.
bemidb=> select count(*) from test;
count_star()
--------------
10000000
(1 row)
Time: 15.197 ms
bemidb=> select count(distinct id) from test;
count(DISTINCT id)
--------------------
10000000
(1 row)
Time: 543.345 ms
bemidb=> select count(distinct c1) from test;
count(DISTINCT c1)
--------------------
101
(1 row)
Time: 328.205 ms复制
耗时短了很多, 提速 10x 以上.
BemiDB 未来路线图
[ ] 增量数据同步到 Iceberg 表。 [ ] 支持父分区表。 [ ] 使用 CDC 实现从 Postgres 的实时复制。 [ ] 支持直接的 Postgres 兼容写操作。 [ ] Iceberg 表压缩与分区。 [ ] 为频繁访问的数据提供缓存层。 [ ] 物化视图。 [ ] 支持自定义 S3 兼容端点。
配置
本地磁盘存储
默认情况下,BemiDB 将数据存储在本地磁盘上。
以下是使用默认设置运行 BemiDB 并将数据存储在本地iceberg
目录中的示例:
./bemidb \
--storage-type LOCAL \
--storage-path ./iceberg \ # $PWD/iceberg/*
start复制
S3 块存储
BemiDB 原生支持 S3 存储。您可以使用以下标志来指定 S3 设置:
./bemidb \
--storage-type S3 \
--storage-path iceberg \ # s3://[AWS_S3_BUCKET]/iceberg/*
--aws-region [AWS_REGION] \
--aws-s3-bucket [AWS_S3_BUCKET] \
--aws-access-key-id [AWS_ACCESS_KEY_ID] \
--aws-secret-access-key [AWS_SECRET_ACCESS_KEY] \
start复制
以下是 BemiDB 与 S3 配合使用所需的最小 IAM 策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::[AWS_S3_BUCKET]",
"arn:aws:s3:::[AWS_S3_BUCKET]/*"
]
}
]
}复制
定期数据同步
定期从 Postgres 数据库同步数据:
./bemidb \
--pg-sync-interval 1h \
--pg-database-url postgres://postgres:postgres@localhost:5432/dbname \
sync复制
请注意,目前尚不支持增量实时复制(正在开发中)。请参阅未来路线图。
从特定表同步
您可以仅从特定表同步 Postgres 数据库中的数据。要在同步过程中包含特定表:
./bemidb \
--pg-include-tables public.users,public.transactions \
--pg-database-url postgres://postgres:postgres@localhost:5432/dbname \
sync复制
要在同步过程中排除特定表:
./bemidb \
--pg-exclude-tables public.cache,public.logs \
--pg-database-url postgres://postgres:postgres@localhost:5432/dbname \
sync复制
注意:不能同时使用--pg-include-tables
和--pg-exclude-tables
。
从多个 Postgres 数据库同步
BemiDB 支持从多个 Postgres 数据库同步数据到同一个 BemiDB 数据库,并允许对模式进行前缀处理。
例如,如果两个 Postgres 数据库db1
和db2
含有public
模式,您可以按如下方式对它们添加前缀:
./bemidb \
--pg-schema-prefix db1_ \
--pg-database-url postgres://postgres:postgres@localhost:5432/db1 \
sync
./bemidb \
--pg-schema-prefix db2_ \
--pg-database-url postgres://postgres:postgres@localhost:5432/db2 \
sync复制
然后,您可以在同一个 BemiDB 数据库中查询和连接来自两个 Postgres 数据库的表:
./bemidb start
psql postgres://localhost:54321/bemidb -c \
"SELECT * FROM db1_public.[TABLE] JOIN db2_public.[TABLE] ON ..."复制
参考
https://github.com/BemiHQ/BemiDB
https://www.crunchydata.com/blog/crunchy-data-warehouse-postgres-with-iceberg-for-high-performance-analytics
https://www.crunchydata.com/blog/iceberg-ahead-analyzing-shipping-data-in-postgres
文末彩蛋:国产数据库周边生态
当然一款数据库要流行起来, 除了自己要强大, 还离不开生态. 用好周边生态工具, 管理水平战胜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) 及视频号:
复制