在 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。执行批量插入能够通过重复执行 Bind
和 Execute
实现。协定交互示意图如下:
Batch Bind
是 openGauss 特有的音讯类型,相比本来的 Bind
,Batch 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 schemas
、show 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#L1722
欢送增加社区经理微信(ss_assistant_1),进入微信交换群和更多 ShardingSphere 爱好者一起交换