服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - PostgreSQL - 基于PostgreSQL/openGauss 的分布式数据库解决方案

基于PostgreSQL/openGauss 的分布式数据库解决方案

2022-01-19 18:08SphereEx PostgreSQL

ShardingSphere-Proxy 作为透明数据库代理,用户无需关心 Proxy 如何协调背后的数据库。今天通过本文给大家介绍基于PostgreSQL/openGauss 的分布式数据库解决方案,感兴趣的朋友跟随小编一起看看吧

在 mysql shardingsphere-proxy 逐渐成熟并被广泛采用的同时,shardingsphere 团队也在 postgresql shardingsphere-proxy 上持续发力。相比前期的 alpha 与 beta,5.0.0 正式版对 postgresql 的协议实现、sql 支持度、权限控制等方面进行了大量的完善,为后续全面对接 postgresql 生态打下基础。shardingsphere-proxy 与 postgresql 的生态对接,让用户能够在 postgresql 数据库的基础上获得如数据分片、读写分离、影子库、数据加密/脱敏、分布式治理等透明化的增量能力。

除了 postgresql 方面,由华为开源的国产数据库 opengauss 的热度持续攀升。opengauss 具备优秀的单机性能,配合 shardingsphere 的能力和生态,能够打造出覆盖更多场景的国产分布式数据库解决方案。

shardingsphere postgresql/opengauss proxy 目前能够支持数据分片、读写分离、影子库、数据加密/脱敏、分布式治理等 apache shardingsphere 生态中大部分能力,在完善程度上逐渐对齐 shardingsphere mysql proxy。

本文将给大家介绍 shardingsphere-proxy 5.0.0 在 postgresql 上所做的提升以及与 opengauss 的生态对接。

作者介绍

吴伟杰

apache shardingsphere committer,sphereex 中间件工程师。目前专注于 apache shardingsphere 及其子项目 elasticjob 的研发。

shardingsphere-proxy 介绍

shardingsphere-proxy 是 shardingsphere 生态中的一个接入端,定位为对客户端透明的数据库代理。shardingsphere proxy 不局限于 java,其实现了 mysql、postgresql 数据库协议,可以使用各种兼容 mysql / postgresql 协议的客户端连接并操作数据。

基于PostgreSQL/openGauss 的分布式数据库解决方案

shardingsphere-jdbc shardingsphere-proxy
数据库 任意 基于 mysql / postgresql 协议的数据库
连接消耗数
异构语言 支持 java 等基于 jvm 语言 任意
性能 损耗低 损耗略高
无中心化
静态入口

在做了分库分表或其他规则的情况下,数据会分散到多个数据库实例上,在管理上难免会有一些不便;或者使用非 java 语言的开发者,需要 shardingsphere 所提供的能力…… 以上这些情况,正是 shardingsphere-proxy 力所能及之处。

shardingsphere-proxy 隐藏了后端实际数据库,对于客户端来说就是在使用一个数据库,不需要关心 shardingsphere 如何协调背后的数据库,对于使用非 java 语言的开发者或 dba 更友好。

在协议方面,shardingsphere postgresql proxy 实现了 simple query 与大部分 extended query 协议,支持异构语言通过 postgresql/opengauss 驱动连接 proxy。shardingsphere opengauss proxy 在复用 postgresql 协议的基础上,还支持 opengauss 特有的批量插入协议。

不过,由于 shardingsphere-proxy 相比 shardingsphere-jdbc 增加了一层网络交互,sql 执行的延时会有所增加,损耗相比 shardingsphere-jdbc 略高。

shardingsphere-proxy 与 postgresql 的生态对接

兼容 postgresql simple query 与 extended query

基于PostgreSQL/openGauss 的分布式数据库解决方案

simple query 与 extended query 是大多数用户在使用 postgresql 时最常用的协议。

比如,使用如下命令行工具 psql 连接 postgresql 数据库进行 crud 操作时,主要使用 simple query 协议与数据库交互。

?
1
2
3
4
5
6
7
8
$ psql -h 127.0.0.1 -u postgres
psql (14.0 (debian 14.0-1.pgdg110+1))
type "help" for help.
postgres=# select id, name from person where age < 35;
 id | name
----+------
  1 | foo
(1 row)

simple query 的协议交互示意图如下:

基于PostgreSQL/openGauss 的分布式数据库解决方案

当用户使用 postgresql jdbc driver 等驱动时,可能会如下代码使用 preparedstatement,默认情况下对应着 extended query 协议。

?
1
2
3
4
string sql = "select id, name from person where age > ?";
preparedstatement ps = connection.preparestatement(sql);
ps.setint(1, 35);
resultset resultset = ps.executequery();

extended query 的协议交互示意图如下:

基于PostgreSQL/openGauss 的分布式数据库解决方案

目前,shardingsphere postgresql proxy 实现了 simple query 与大部分 extended query 协议,不过,因为数据库客户端与驱动已经封装好 api 供用户使用,一般用户并不需要关心数据库协议层面的事情。

shardingsphere-proxy 兼容 postgresql 的 simple query 与 extended query 意味着:用户可以使用常见的 postgresql 客户端或驱动连接 shardingsphere-proxy 进行 crud 操作,利用 shardingsphere 在数据库上层提供的增量能力。

shardingsphere-proxy 与 opengauss 的生态对接

支持 opengauss jdbc driver

opengauss 数据库有对应的 jdbc 驱动,jdbc url 的前缀jdbc:opengauss。虽然用 postgresql 的 jdbc 驱动也能够连接 opengauss 数据库,但这样就无法完全利用 opengauss 特有的批量插入等特性。shardingsphere 增加了 opengauss 数据库类型,能够识别 opengauss jdbc driver,开发者在使用 shardingsphere 的时候可以直接使用 opengauss 的 jdbc 驱动。

支持 opengauss 批量插入协议

举一个例子,当我们 prepare 一个 insert 语句如下

?
1
insert into person (id, name, age) values (?, ?, ?)

以 jdbc 为例,我们可能会使用如下方法执行批量插入:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string sql = "insert into person (id, name, age) values (?, ?, ?)";
preparedstatement ps = connection.preparestatement(sql);
ps.setlong(1, 1);
ps.setstring(2, "foo");
ps.setint(3, 18);
ps.addbatch();
ps.setlong(1, 2);
ps.setstring(2, "bar");
ps.setint(3, 36);
ps.addbatch();
ps.setlong(1, 3);
ps.setstring(2, "tom");
ps.setint(3, 54);
ps.addbatch();
ps.executebatch();

在 postgresql 协议层面,bind 消息每次能够传递一组参数形成 portal,execute 每次能够执行一个 portal。执行批量插入可以通过反复执行 bindexecute 实现。协议交互示意图如下:

基于PostgreSQL/openGauss 的分布式数据库解决方案

batch bind 是 opengauss 特有的消息类型,相比原本的 bindbatch bind 一次能够传递多组参数,使用 batch bind 执行批量插入的协议交互示意如下:

基于PostgreSQL/openGauss 的分布式数据库解决方案

shardingsphere-proxy opengauss 实现了对 batch bind 协议的支持,也就是说,客户端能够直接用 opengauss 的客户端或驱动对 shardingsphere proxy 执行批量插入。

shardingsphere-proxy 后续要做的事情

支持 shardingsphere postgresql proxy 逻辑 metadata 查询

shardingsphere-proxy 作为透明数据库代理,用户无需关心 proxy 如何协调背后的数据库。

以下图为例,在 shardingsphere-proxy 中配置逻辑库 sharding_db 和逻辑表 person,proxy背后实际对应了 2 个数据库共 4 个表。

基于PostgreSQL/openGauss 的分布式数据库解决方案

目前在 shardingsphere mysql proxy 中分别执行 show schemasshow tables 语句,查询的结果能够正常的列出逻辑库 sharding_db 和逻辑表 person

使用 psql 连接 postgresql 时可以通过 \l\d 等命令查询库、表。但与 mysql 不同的是,show tables是 mysql 所支持的语句,而在 psql 中所使用的 \d 实际上对应了一条比较复杂的 sql,目前使用 shardingsphere postgresql proxy 暂时无法查询出逻辑库或逻辑表。

支持 extended query 的 describe prepared statement

postgresql 协议的 describe 消息有两种变体,分别是 describe portal 和 describe prepared statement。目前 shardingsphere proxy 仅支持 describe portal,暂时不支持 describe prepared statement。

describe prepared statement 的实际应用举例:在 preparedstatement 执行之前获取结果集的 metadata。

?
1
2
preparedstatement preparedstatement = connection.preparestatement("select * from t_order limit ?");
resultsetmetadata metadata = preparedstatement.getmetadata();

shardingsphere 与 postgresql/opengauss 生态对接的过程仍在进行,后续需要做的事情还有很多。如果您对我们所做的事情感兴趣,欢迎通过 github 或邮件列表参与 shardingsphere 社区。

github: https://github.com/apache/shardingsphere

参考资料

https://www.postgresql.org/docs/current/protocol.html

https://gitee.com/opengauss/opengauss-connector-jdbc/blob/master/pgjdbc/src/main/java/org/postgresql/core/v3/queryexecutorimpl.java

到此这篇关于打造基于 postgresql/opengauss 的分布式数据库解决方案的文章就介绍到这了,更多相关postgresql分布式数据库内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/sphereex/p/15637679.html

延伸 · 阅读

精彩推荐
  • PostgreSQL分布式 PostgreSQL之Citus 架构

    分布式 PostgreSQL之Citus 架构

    节点 Citus 是一种 PostgreSQL 扩展,它允许数据库服务器(称为节点)在“无共享(shared nothing)”架构中相互协调。这些节点形成一个集群,允许 PostgreSQL 保存比单...

    未知802023-05-07
  • PostgreSQLPostgreSQL标准建表语句分享

    PostgreSQL标准建表语句分享

    这篇文章主要介绍了PostgreSQL标准建表语句分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    码上得天下7962021-02-27
  • PostgreSQLPostgresql开启远程访问的步骤全纪录

    Postgresql开启远程访问的步骤全纪录

    postgre一般默认为本地连接,不支持远程访问,所以如果要开启远程访问,需要更改安装文件的配置。下面这篇文章主要给大家介绍了关于Postgresql开启远程...

    我勒个去6812020-04-30
  • PostgreSQLPostgresql查询效率计算初探

    Postgresql查询效率计算初探

    这篇文章主要给大家介绍了关于Postgresql查询效率计算的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Postgresql具有一定的参考学习价...

    轨迹4622020-05-03
  • PostgreSQLRDS PostgreSQL一键大版本升级技术解密

    RDS PostgreSQL一键大版本升级技术解密

    一、PostgreSQL行业位置 (一)行业位置 在讨论PostgreSQL(下面简称为PG)在整个数据库行业的位置之前,我们先看一下阿里云数据库在全球的数据库行业里的...

    未知1192023-05-07
  • PostgreSQL深入理解PostgreSQL的MVCC并发处理方式

    深入理解PostgreSQL的MVCC并发处理方式

    这篇文章主要介绍了深入理解PostgreSQL的MVCC并发处理方式,文中同时介绍了MVCC的缺点,需要的朋友可以参考下 ...

    PostgreSQL教程网3622020-04-25
  • PostgreSQLpostgresql 中的to_char()常用操作

    postgresql 中的to_char()常用操作

    这篇文章主要介绍了postgresql 中的to_char()常用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    J符离13432021-04-12
  • PostgreSQLpostgresql 数据库中的数据转换

    postgresql 数据库中的数据转换

    postgres8.3以后,字段数据之间的默认转换取消了。如果需要进行数据变换的话,在postgresql数据库中,我们可以用"::"来进行字段数据的类型转换。...

    postgresql教程网12482021-10-08