在 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 协议的客户端连接并操作数据。

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

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 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 的协议交互示意图如下:

目前,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 实现。协议交互示意图如下:

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

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 个表。

目前在 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


参考资料

欢迎添加社区经理微信(ss_assistant_1),进入微信交流群和更多 ShardingSphere 爱好者一同交流

打造基于 PostgreSQL/openGauss 的分布式数据库解决方案的更多相关文章

  1. TiDB:支持 MySQL 协议的分布式数据库解决方案

    [编者按]TiDB 是国内 PingCAP 团队开发的一个分布式 SQL 数据库.其灵感来自于 Google 的 F1,TiDB 支持包括传统 RDBMS 和 NoSQL 的特性.在国内 ITOM 管 ...

  2. 分享 : 警惕MySQL运维陷阱:基于MyCat的伪分布式架构

    分布式数据库已经进入了全面快速发展阶段.这种发展是与时俱进的,与人的需求分不开,因为现在信息时代的高速发展,导致数据量和交易量越来越大.这种现象首先导致的就是存储瓶颈,因为MySQL数据库实质上还是一 ...

  3. 转:三思!大规模MySQL运维陷阱之基于MyCat的伪分布式架构

    在微信公众号看到一篇关于mycat的文章,觉得分析的很不错,给大家分享一下 三思!大规模MySQL运维陷阱之基于MyCat的伪分布式架构 原文链接:https://mp.weixin.qq.com/s ...

  4. [转帖]Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇)

    Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇) https://www.infoq.cn/article/3IJ7L8HVR2MXhqaqI2RA 学长的文章.. ...

  5. 基于Sql Server 2008的分布式数据库的实践(终结)

    学习.操作心得 以前在做网站程序的时候一直用的是MYSQL,但是网上搜到MYSQL不支持分布式操作,然后便开始查询MSSQL的分布式数据库的设计与操作,后来在网上找到了<基于SQL SERVER ...

  6. Cobar分布式数据库的应用与实践

    最新文章:看我如何快速学习.Net(高可用数据采集平台).高并发数据采集的架构应用(Redis的应用) 问题点: 随着项目的增长,数据和数据表也成倍的增长,普通的单点数据库已经无法满足日常的增长的需要 ...

  7. GreenPlum:基于PostgreSQL的分布式关系型数据库

    GreenPlum是一个底层是多台PostgreSQL分表分库的分布式数据库,它有如下特点 支持标准SQL,几乎所有PostgreSQL支持的SQL,greenplum都支持 支持ACID.分布式事务 ...

  8. [转帖]Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(下篇)

    Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(下篇) http://www.postgres.cn/v2/news/viewone/1/454 原作者:姚延栋 创作时间:201 ...

  9. ElasticJob 3.0.0:打造面向互联网生态和海量任务的分布式调度解决方案

    ElasticJob 于 2020 年 5 月 28 日重启并成为 Apache ShardingSphere 子项目.新版本借鉴了 ShardingSphere 可拔插架构的设计理念,对内核进行了大 ...

随机推荐

  1. 2021.10.11考试总结[NOIP模拟74]

    T1 自然数 发现\(mex\)是单调不降的,很自然地想到用线段树维护区间端点的贡献. 枚举左端点,用线段树维护每个右端点形成区间的\(mex\)值.每次左端点右移相当于删去一个数. 记\(a_i\) ...

  2. 2021.8.4考试总结[NOIP模拟30]

    T1 毛衣衬 将合法子集分为两个和相等的集合. 暴力枚举每个元素是否被选,放在哪种集合,复杂度$O(3^n)$.考虑$\textit{meet in the middle}$. 将全集等分分为两部分分 ...

  3. 电脑cmd命令快速查看连接过的WIFI密码信息

    只是突然发现,好奇心作怪,试了一下,妈妈再也不用担心我忘记家里的wifi密码了 1.直接打开"运行"(win键+R) 2.输入CMD 确定 3.输入下面cmd命令.鼠标粘贴 for ...

  4. 洛谷 P4587 [FJOI2016]神秘数

    大鸽子 llmmkk 正在补8.3号咕掉的题 时隔两个月,再看到这道题,我又是一脸懵,这种思维的培养太重要了 链接: P4587 题意: 给出 \(n\) 个点的序列,\(m\) 次询问区间神秘数. ...

  5. 第01课 OpenGL窗口(2)

    下一段包括了所有的绘图代码.任何您所想在屏幕上显示的东东都将在此段代码中出现.以后的每个教程中我都会在例程的此处增加新的代码.如果您对OpenGL已经有所了解的话,您可以在 glLoadIdentit ...

  6. vue路由监听和参数监听

    1.路由携带数据跳转 routerAction(hideDisplays, data) { switch (hideDisplays) { case "pubAccountMenu" ...

  7. docker 简单总结

    一.docker 安装 yum 方式在centos和rhce上的安装条件: 要安装Docker引擎,你需要一个维护版本的CentOS 7或8.不支持或测试存档版本.必须启用centos-extras存 ...

  8. exec系统调用 && 进程的加载过程

    exec系统调用会从指定的文件中读取并加载指令,并替代当前调用进程的指令.从某种程度上来说,这样相当于丢弃了调用进程的内存,并开始执行新加载的指令. exec系统调用会保留当前的文件描述符表单.所以任 ...

  9. C++11 多线程同步 互斥锁 条件变量

    在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,Linux下常见的线程同步的方法有下面几种: 互斥锁 条件变量 信号量 这篇博客只介绍互斥量和条件变量的使用. 互斥锁和条 ...

  10. shiro session返回问题

    /** * 3.会话管理器 */ public DefaultWebSessionManager sessionManager() { CustomSessionManager sessionMana ...