在MySQLShardingSphere-Proxy逐渐成熟并被广泛采用的同时,ShardingSphere团队也在继续致力于PostgreSQLShardingSphere-Proxy。5.0.0正式版相比之前的alpha和beta,在PostgreSQL的协议实现、SQL支持、权限控制等方面做了很多改进,为后续全面整合PostgreSQL生态奠定了基础。ShardingSphere-Proxy与PostgreSQL的生态连接,使用户能够获得基于PostgreSQL数据库的数据分片、读写分离、影子数据库、数据加密/脱敏、分布式治理等透明增量能力。除了PostgreSQL,华为开源的国产数据库openGauss的热度也在持续走高。openGauss单机性能优异,配合ShardingSphere的能力和生态,可以打造覆盖更多场景的国产分布式数据库解决方案。ShardingSpherePostgreSQL/openGaussProxy目前可以支持ApacheShardingSphere生态中的大部分能力,如数据分片、读写分离、影子数据库、数据加密/脱敏、分布式治理等,并逐步向ShardingSphereMySQLProxy靠齐完善。本文将介绍ShardingSphere-Proxy5.0.0对PostgreSQL所做的改进以及与openGauss的生态对接。作者介绍吴伟杰,ApacheShardingSphereCommitter,SphereEx中间件工程师。目前专注于ApacheShardingSphere及其子项目ElasticJob的开发。ShardingSphere-Proxy简介ShardingSphere-Proxy是ShardingSphere生态中的接入终端,定位为对客户端透明的数据库代理。ShardingSphereProxy不局限于Java,它实现了MySQL和PostgreSQL数据库协议,可以使用各种兼容MySQL/PostgreSQL协议的客户端连接和操作数据。ShardingSphere-JDBCShardingSphere-Proxy数据库任意基于MySQL/PostgreSQL协议的数据库连接消耗高低异构语言支持Java等基于JVM的语言性能损耗低损耗略高无中心化无静态入口?在其他规则的情况下,数据会被分布到多个数据库实例中,难免会造成一些管理上的不便;或者使用非Java语言的开发者需要ShardingSphere提供的能力...以上的情况恰恰是ShardingSphere-Proxy可以做到的地方。ShardingSphere-Proxy隐藏了实际的后端数据库。对于客户端,它正在使用数据库。它不需要关心ShardingSphere如何协调它背后的数据库。对于使用非Java语言的开发人员或DBA更友好。在协议方面,ShardingSpherePostgreSQLProxy实现了SimpleQuery和大部分ExtendedQuery协议,支持异构语言通过PostgreSQL/openGauss驱动连接Proxy。ShardingSphereopenGaussProxy在复用PostgreSQL协议的基础上,还支持openGauss独有的批量插入协议。但由于ShardingSphere-Proxy相比ShardingSphere-JDBC增加了一层网络交互,SQL执行的延迟会增加,损失略高于ShardingSphere-JDBC。ShardingSphere-Proxy兼容PostgreSQL的生态对接PostgreSQLSimpleQuery和ExtendedQuerySimpleQuery和ExtendedQuery是大多数用户在使用PostgreSQL时最常用的协议。例如,在使用如下命令行工具psql连接PostgreSQL数据库进行CRUD操作时,主要使用SimpleQuery协议与数据库进行交互。$psql-h127.0.0.1-Upostgrespsql(14.0(Debian14.0-1.pgdg110+1))键入“help”获取帮助。postgres=#选择id,姓名来自年龄<35的人;编号|名称----+------1|Foo(1row)SimpleQuery的协议交互图如下:当用户使用PostgreSQLJDBCDriver等驱动时,以下代码可能会使用PreparedStatement,默认对应ExtendedQuery协议。Stringsql="selectid,namefrompersonwhereage>?";PreparedStatementps=connection.prepareStatement(sql);ps.setInt(1,35);ResultSetresultSet=ps.executeQuery();ExtendedQuery协议交互图As如下:目前,ShardingSpherePostgreSQLProxy实现了SimpleQuery和大部分ExtendedQuery协议。但是由于数据库客户端和驱动已经封装了API供用户使用,一般用户不需要关心数据库协议层面。ShardingSphere-Proxy兼容PostgreSQL的SimpleQuery和ExtendedQuery,这意味着用户可以使用普通的PostgreSQL客户端或驱动连接到ShardingSphere-Proxy进行CRUD操作,并利用ShardingSphere在上层提供的增量能力数据库。ShardingSphere-Proxy与openGauss的生态对接支持openGaussJDBCDriveropenGauss数据库有对应的JDBC驱动,JDBCURL前缀为jdbc:opengauss。虽然PostgreSQL的JDBC驱动也可以用来连接openGauss数据库,但是不能充分利用openGauss特有的批量插入特性。ShardingSphere新增openGauss数据库类型,可以识别openGaussJDBCDriver,开发者在使用ShardingSphere时可以直接使用openGaussJDBCdriver。支持openGauss批量插入协议举个例子,当我们准备如下插入语句insertintoperson(id,name,age)values(?,?,?)以JDBC为例,我们可能使用如下方法执行批量插入:Stringsql="insertintoperson(id,name,age)values(?,?,?)";PreparedStatementps=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,"汤姆");ps.setInt(3,54);ps.addBatch();ps.executeBatch();在PostgreSQL协议层面,BindMessages可以每次传递一组参数,形成一个Portal,而Execute可以每次执行一个Portal。执行批量插入可以通过重复执行Bind和Execute来实现。协议交互示意图如下:BatchBind是openGauss特有的消息类型。与原来的Bind相比,BatchBind可以一次传输多组参数。使用BatchBind进行批量插入的协议交互图如下:ShardingSphere-ProxyopenGauss实现Protocol支持,即客户端可以直接使用openGauss客户端或驱动在ShardingSphereProxy上进行批量插入。ShardingSphere-Proxy接下来要做的是支持ShardingSpherePostgreSQLProxy逻辑MetaData查询,ShardingSphere-Proxy作为一个透明的数据库代理,用户无需关心Proxy如何协调背后的数据库。以下图为例。在ShardingSphere-Proxy中配置逻辑库sharding_db和逻辑表person。Proxy后面实际上有2个数据库中的4张表。目前showschemas和showtables语句分别在ShardingSphereMySQLProxy中执行,查询结果可以正常列出逻辑库sharding_db和逻辑表person。使用psql连接PostgreSQL时,可以使用\l、\d等命令查询库和表。但与MySQL不同的是,showtables是MySQL支持的语句,而psql中使用的\d其实对应的是更复杂的SQL。目前,ShardingSpherePostgreSQLProxy暂时无法查询逻辑库或逻辑表。支持ExtendedQuery的DescribePreparedStatementPostgreSQL协议的Describe消息有两种变体,DescribePortal和DescribePreparedStatement。目前ShardingSphereProxy只支持DescribePortal,不支持DescribePreparedStatement。DescribePreparedStatement实际应用示例:在PreparedStatement执行前获取结果集的MetaData。PreparedStatementpreparedStatement=connection.prepareStatement("select*fromt_orderlimit?");ResultSetMetaDatametaData=preparedStatement.getMetaData();ShardingSphere与PostgreSQL/openGauss生态对接的进程还在进行中,未来还有很多事情要做。如果您对我们的工作感兴趣,欢迎通过GitHub或邮件列表加入ShardingSphere社区。GitHub:https://github.com/apache/shardingsphere参考https://www.postgresql.org/docs/current/protocol.htmlhttps://gitee.com/opengauss/openGauss-connector-jdbc/blob/master/pgjdbc/src/main/java/org/postgresql/core/v3/QueryExecutorImpl.java#L1722欢迎添加社区管理员微信(ss_assistant_1),进入微信交流群,与更多ShardingSphere爱好者交流
