ProtoBuf vs JSON
参考文档点击文末阅读原文打开; 推荐《最好的PostgreSQL学习镜像》;
小众话题 | ProtoBuf vs JSON
这篇文档提到了protobuf的好处:
《PostgreSQL 数据传输&存储 数据的序列化和反序列化 (serialization/deserialization)》
下面在PolarDB中使用protobuf做个简单的测试, PolarDB PG的环境部署请参考如下文章:
《PolarDB PG 15 编译安装 & pg_duckdb 插件 + OSS 试用》
postgres_protobuf这个插件使用了ruby生成测试集, 相关的代码如下:
env PROTOC=third_party/protobuf/src/protoc ./generate_test_cases.rb sql
env PROTOC=third_party/protobuf/src/protoc ./generate_test_cases.rb expected-output
进入容器后, 先下载ruby包
sudo apt update
sudo apt-get install -y ruby
另外这个插件的编译过程依赖网络环境, 会自动下载protobuf-c的代码并安装
编译postgres-protobuf
cd /data
git clone --depth 1 https://github.com/mpartel/postgres-protobuf
cd postgres-protobuf/
USE_PGXS=1 make install
测试 postgres_protobuf
psql -c "create extension postgres_protobuf;"
psql -f ./sql/postgres_protobuf.sql
可以看到这个插件的函数如下, 功能请参考postgres_protobuf的readme.
postgres=# \df
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+----------------------------+------------------+---------------------+------
public | protobuf_extension_version | bigint | | func
public | protobuf_from_json_text | bytea | text, text | func
public | protobuf_query | text | text, bytea | func
public | protobuf_query_array | text[] | text, bytea | func
public | protobuf_query_multi | SETOF text | text, bytea | func
public | protobuf_to_json_text | text | text, bytea | func
(6 rows)
描述内容写入如下表, 在解析protobuf-binary数据时需要用到描述文件的内容. 类似pg的wal decoder可以从wal解析出逻辑数据, 但是需要依赖catalog一样, 需要表结构才能解释出wal里面的原始数据.
postgres=# \dt
List of relations
Schema | Name | Type | Owner
--------+-------------------------------+-------+----------
public | protobuf_file_descriptor_sets | table | postgres
(1 row)
截取./sql/postgres_protobuf.sql的几条测试语句
postgres=# SELECT protobuf_query_multi(
'pgpb.test.ExampleMessage:1.3',
'\x0a02187b'::BYTEA
) AS result;
SELECT protobuf_query_multi(
'pgpb.test.ExampleMessage:scalars.int32_field',
'\x0a02187b'::BYTEA
) AS result; result
--------
123
(1 row)
result
--------
123
(1 row)
postgres=# SELECT protobuf_query_multi(
'pgpb.test.ExampleMessage:scalars.int64_field',
'\x0a0a20ffffffffffffffff7f'::BYTEA
) AS result;
result
---------------------
9223372036854775807
(1 row)
postgres=# SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[*].repeated_inner[*].inner_repeated[0]', '\x2a1c1a0a120361626312036465661a0512036161611a001a051203626262'::BYTEA) AS result;
result
--------
abc
(1 row)
protobuf vs json in PolarDB PG
json 可以创建gin索引, 在数据库中的检索效率更高 protobuf 只能使用表达式索引 , 使用相对来说更繁琐 json 存储的空间消耗比protobuf更大, 因为每个json都需要schema, 而ptorobuf的结构只需要将其存储在描述表里一次 json 的解析开销比protobuf更高 json有 in/out recv/send接口, 目前protobuf借用了bytea类型,解析依赖插件提供的接口函数,使用不够丝滑。
protobuf 如果能补齐短板, 在PG数据库内部的使用可能会更广泛.
文末彩蛋:国产数据库周边生态
当然一款数据库要流行起来, 除了自己要强大, 还离不开生态. 用好周边生态工具, 管理水平战胜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) 及视频号: