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


Posted in PostgreSQL onDecember 06, 2021

在 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 协议与数据库交互。

$ 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 协议。

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 语句如下

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

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

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。

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分布式数据库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PostgreSQL 相关文章推荐
PostgreSQL将数据加载到buffer cache中操作方法
Apr 16 PostgreSQL
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
Apr 22 PostgreSQL
postgresql使用filter进行多维度聚合的解决方法
Jul 16 PostgreSQL
基于PostgreSQL/openGauss 的分布式数据库解决方案
Dec 06 PostgreSQL
Rust 连接 PostgreSQL 数据库的详细过程
Jan 22 PostgreSQL
PostgreSQL事务回卷实战案例详析
Mar 25 PostgreSQL
PostgreSQL数据库创建并使用视图以及子查询
Apr 11 PostgreSQL
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
Apr 12 PostgreSQL
PostgreSQL怎么创建分区表详解
Jun 25 PostgreSQL
PostgreSQL常用字符串分割函数整理汇总
Jul 07 PostgreSQL
PostgreSQL之连接失败的问题及解决
May 08 PostgreSQL
postgresql之greenplum字符串去重拼接方式
May 08 PostgreSQL
PostgreSQL自动更新时间戳实例代码
Nov 27 #PostgreSQL
关于PostgreSQL JSONB的匹配和交集问题
Sep 14 #PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 #PostgreSQL
PostgreSQL解析URL的方法
Aug 02 #PostgreSQL
postgresql使用filter进行多维度聚合的解决方法
Jul 16 #PostgreSQL
浅谈PostgreSQL表分区的三种方式
通过Qt连接OpenGauss数据库的详细教程
You might like
BBS(php &amp; mysql)完整版(八)
2006/10/09 PHP
再次研究下cache_lite
2007/02/14 PHP
一个简洁实用的PHP缓存类完整实例
2014/07/26 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
四个常见html网页乱码问题及解决办法
2015/09/08 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
2018/03/24 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
基于axios 解决跨域cookie丢失的问题
2018/09/26 Javascript
教你如何编写Vue.js的单元测试的方法
2018/10/17 Javascript
vue路由跳转传递参数的方式总结
2020/05/10 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
Python深入学习之对象的属性
2014/08/31 Python
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
深入解析Python中的WSGI接口
2015/05/11 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
python使用RNN实现文本分类
2018/05/24 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
信息管理专业学生自荐信格式
2013/09/22 职场文书
公司开业庆典主持词
2014/03/21 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
开发房地产协议书
2014/09/14 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
2016年感恩教师节校园广播稿
2015/12/18 职场文书
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers