基于PostgreSQL/openGauss?的分布式數(shù)據(jù)庫(kù)解決方案
在 MySQL ShardingSphere-Proxy 逐漸成熟并被廣泛采用的同時(shí),ShardingSphere 團(tuán)隊(duì)也在 PostgreSQL ShardingSphere-Proxy 上持續(xù)發(fā)力。相比前期的 alpha 與 beta,5.0.0 正式版對(duì) PostgreSQL 的協(xié)議實(shí)現(xiàn)、SQL 支持度、權(quán)限控制等方面進(jìn)行了大量的完善,為后續(xù)全面對(duì)接 PostgreSQL 生態(tài)打下基礎(chǔ)。ShardingSphere-Proxy 與 PostgreSQL 的生態(tài)對(duì)接,讓用戶(hù)能夠在 PostgreSQL 數(shù)據(jù)庫(kù)的基礎(chǔ)上獲得如數(shù)據(jù)分片、讀寫(xiě)分離、影子庫(kù)、數(shù)據(jù)加密/脫敏、分布式治理等透明化的增量能力。
除了 PostgreSQL 方面,由華為開(kāi)源的國(guó)產(chǎn)數(shù)據(jù)庫(kù) openGauss 的熱度持續(xù)攀升。openGauss 具備優(yōu)秀的單機(jī)性能,配合 ShardingSphere 的能力和生態(tài),能夠打造出覆蓋更多場(chǎng)景的國(guó)產(chǎn)分布式數(shù)據(jù)庫(kù)解決方案。
ShardingSphere PostgreSQL/openGauss Proxy 目前能夠支持?jǐn)?shù)據(jù)分片、讀寫(xiě)分離、影子庫(kù)、數(shù)據(jù)加密/脫敏、分布式治理等 Apache ShardingSphere 生態(tài)中大部分能力,在完善程度上逐漸對(duì)齊 ShardingSphere MySQL Proxy。
本文將給大家介紹 ShardingSphere-Proxy 5.0.0 在 PostgreSQL 上所做的提升以及與 openGauss 的生態(tài)對(duì)接。
作者介紹
吳偉杰
Apache ShardingSphere Committer,SphereEx 中間件工程師。目前專(zhuān)注于 Apache ShardingSphere 及其子項(xiàng)目 ElasticJob 的研發(fā)。
ShardingSphere-Proxy 介紹
ShardingSphere-Proxy 是 ShardingSphere 生態(tài)中的一個(gè)接入端,定位為對(duì)客戶(hù)端透明的數(shù)據(jù)庫(kù)代理。ShardingSphere Proxy 不局限于 Java,其實(shí)現(xiàn)了 MySQL、PostgreSQL 數(shù)據(jù)庫(kù)協(xié)議,可以使用各種兼容 MySQL / PostgreSQL 協(xié)議的客戶(hù)端連接并操作數(shù)據(jù)。

| ShardingSphere-JDBC | ShardingSphere-Proxy | |
|---|---|---|
| 數(shù)據(jù)庫(kù) | 任意 | 基于 MySQL / PostgreSQL 協(xié)議的數(shù)據(jù)庫(kù) |
| 連接消耗數(shù) | 高 | 低 |
| 異構(gòu)語(yǔ)言 | 支持 Java 等基于 JVM 語(yǔ)言 | 任意 |
| 性能 | 損耗低 | 損耗略高 |
| 無(wú)中心化 | 是 | 否 |
| 靜態(tài)入口 | 無(wú) | 有 |
在做了分庫(kù)分表或其他規(guī)則的情況下,數(shù)據(jù)會(huì)分散到多個(gè)數(shù)據(jù)庫(kù)實(shí)例上,在管理上難免會(huì)有一些不便;或者使用非 Java 語(yǔ)言的開(kāi)發(fā)者,需要 ShardingSphere 所提供的能力…… 以上這些情況,正是 ShardingSphere-Proxy 力所能及之處。
ShardingSphere-Proxy 隱藏了后端實(shí)際數(shù)據(jù)庫(kù),對(duì)于客戶(hù)端來(lái)說(shuō)就是在使用一個(gè)數(shù)據(jù)庫(kù),不需要關(guān)心 ShardingSphere 如何協(xié)調(diào)背后的數(shù)據(jù)庫(kù),對(duì)于使用非 Java 語(yǔ)言的開(kāi)發(fā)者或 DBA 更友好。
在協(xié)議方面,ShardingSphere PostgreSQL Proxy 實(shí)現(xiàn)了 Simple Query 與大部分 Extended Query 協(xié)議,支持異構(gòu)語(yǔ)言通過(guò) PostgreSQL/openGauss 驅(qū)動(dòng)連接 Proxy。ShardingSphere openGauss Proxy 在復(fù)用 PostgreSQL 協(xié)議的基礎(chǔ)上,還支持 openGauss 特有的批量插入?yún)f(xié)議。
不過(guò),由于 ShardingSphere-Proxy 相比 ShardingSphere-JDBC 增加了一層網(wǎng)絡(luò)交互,SQL 執(zhí)行的延時(shí)會(huì)有所增加,損耗相比 ShardingSphere-JDBC 略高。
ShardingSphere-Proxy 與 PostgreSQL 的生態(tài)對(duì)接
兼容 PostgreSQL Simple Query 與 Extended Query

Simple Query 與 Extended Query 是大多數(shù)用戶(hù)在使用 PostgreSQL 時(shí)最常用的協(xié)議。
比如,使用如下命令行工具 psql 連接 PostgreSQL 數(shù)據(jù)庫(kù)進(jìn)行 CRUD 操作時(shí),主要使用 Simple Query 協(xié)議與數(shù)據(jù)庫(kù)交互。
$ 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 的協(xié)議交互示意圖如下:

當(dāng)用戶(hù)使用 PostgreSQL JDBC Driver 等驅(qū)動(dòng)時(shí),可能會(huì)如下代碼使用 PreparedStatement,默認(rèn)情況下對(duì)應(yīng)著 Extended Query 協(xié)議。
String sql = "select id, name from person where age > ?"; PreparedStatement ps = connection.prepareStatement(sql); ps.setInt(1, 35); ResultSet resultSet = ps.executeQuery();
Extended Query 的協(xié)議交互示意圖如下:

目前,ShardingSphere PostgreSQL Proxy 實(shí)現(xiàn)了 Simple Query 與大部分 Extended Query 協(xié)議,不過(guò),因?yàn)閿?shù)據(jù)庫(kù)客戶(hù)端與驅(qū)動(dòng)已經(jīng)封裝好 API 供用戶(hù)使用,一般用戶(hù)并不需要關(guān)心數(shù)據(jù)庫(kù)協(xié)議層面的事情。
ShardingSphere-Proxy 兼容 PostgreSQL 的 Simple Query 與 Extended Query 意味著:用戶(hù)可以使用常見(jiàn)的 PostgreSQL 客戶(hù)端或驅(qū)動(dòng)連接 ShardingSphere-Proxy 進(jìn)行 CRUD 操作,利用 ShardingSphere 在數(shù)據(jù)庫(kù)上層提供的增量能力。
ShardingSphere-Proxy 與 openGauss 的生態(tài)對(duì)接
支持 openGauss JDBC Driver
openGauss 數(shù)據(jù)庫(kù)有對(duì)應(yīng)的 JDBC 驅(qū)動(dòng),JDBC URL 的前綴jdbc:opengauss。雖然用 PostgreSQL 的 JDBC 驅(qū)動(dòng)也能夠連接 openGauss 數(shù)據(jù)庫(kù),但這樣就無(wú)法完全利用 openGauss 特有的批量插入等特性。ShardingSphere 增加了 openGauss 數(shù)據(jù)庫(kù)類(lèi)型,能夠識(shí)別 openGauss JDBC Driver,開(kāi)發(fā)者在使用 ShardingSphere 的時(shí)候可以直接使用 openGauss 的 JDBC 驅(qū)動(dòng)。
支持 openGauss 批量插入?yún)f(xié)議
舉一個(gè)例子,當(dāng)我們 prepare 一個(gè) insert 語(yǔ)句如下
insert into person (id, name, age) values (?, ?, ?)
以 JDBC 為例,我們可能會(huì)使用如下方法執(zhí)行批量插入:
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 協(xié)議層面,Bind 消息每次能夠傳遞一組參數(shù)形成 Portal,Execute 每次能夠執(zhí)行一個(gè) Portal。執(zhí)行批量插入可以通過(guò)反復(fù)執(zhí)行 Bind 和 Execute 實(shí)現(xiàn)。協(xié)議交互示意圖如下:

Batch Bind 是 openGauss 特有的消息類(lèi)型,相比原本的 Bind,Batch Bind 一次能夠傳遞多組參數(shù),使用 Batch Bind 執(zhí)行批量插入的協(xié)議交互示意如下:

ShardingSphere-Proxy openGauss 實(shí)現(xiàn)了對(duì) Batch Bind 協(xié)議的支持,也就是說(shuō),客戶(hù)端能夠直接用 openGauss 的客戶(hù)端或驅(qū)動(dòng)對(duì) ShardingSphere Proxy 執(zhí)行批量插入。
ShardingSphere-Proxy 后續(xù)要做的事情
支持 ShardingSphere PostgreSQL Proxy 邏輯 MetaData 查詢(xún)
ShardingSphere-Proxy 作為透明數(shù)據(jù)庫(kù)代理,用戶(hù)無(wú)需關(guān)心 Proxy 如何協(xié)調(diào)背后的數(shù)據(jù)庫(kù)。
以下圖為例,在 ShardingSphere-Proxy 中配置邏輯庫(kù) sharding_db 和邏輯表 person,Proxy背后實(shí)際對(duì)應(yīng)了 2 個(gè)數(shù)據(jù)庫(kù)共 4 個(gè)表。

目前在 ShardingSphere MySQL Proxy 中分別執(zhí)行 show schemas、show tables 語(yǔ)句,查詢(xún)的結(jié)果能夠正常的列出邏輯庫(kù) sharding_db 和邏輯表 person。
使用 psql 連接 PostgreSQL 時(shí)可以通過(guò) \l、\d 等命令查詢(xún)庫(kù)、表。但與 MySQL 不同的是,show tables是 MySQL 所支持的語(yǔ)句,而在 psql 中所使用的 \d 實(shí)際上對(duì)應(yīng)了一條比較復(fù)雜的 SQL,目前使用 ShardingSphere PostgreSQL Proxy 暫時(shí)無(wú)法查詢(xún)出邏輯庫(kù)或邏輯表。
支持 Extended Query 的 Describe Prepared Statement
PostgreSQL 協(xié)議的 Describe 消息有兩種變體,分別是 Describe Portal 和 Describe Prepared Statement。目前 ShardingSphere Proxy 僅支持 Describe Portal,暫時(shí)不支持 Describe Prepared Statement。
Describe Prepared Statement 的實(shí)際應(yīng)用舉例:在 PreparedStatement 執(zhí)行之前獲取結(jié)果集的 MetaData。
PreparedStatement preparedStatement = connection.prepareStatement("select * from t_order limit ?");
ResultSetMetaData metaData = preparedStatement.getMetaData();
ShardingSphere 與 PostgreSQL/openGauss 生態(tài)對(duì)接的過(guò)程仍在進(jìn)行,后續(xù)需要做的事情還有很多。如果您對(duì)我們所做的事情感興趣,歡迎通過(guò) GitHub 或郵件列表參與 ShardingSphere 社區(qū)。
GitHub: https://github.com/apache/shardingsphere
參考資料
https://www.postgresql.org/docs/current/protocol.html
到此這篇關(guān)于打造基于 PostgreSQL/openGauss 的分布式數(shù)據(jù)庫(kù)解決方案的文章就介紹到這了,更多相關(guān)PostgreSQL分布式數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python將Dataframe格式的數(shù)據(jù)寫(xiě)入opengauss數(shù)據(jù)庫(kù)并查詢(xún)
- 使用虛擬機(jī)在VirtualBox+openEuler上安裝部署openGauss數(shù)據(jù)庫(kù)
- docker配置openGauss數(shù)據(jù)庫(kù)的方法詳解
- 使用Docker部署openGauss國(guó)產(chǎn)數(shù)據(jù)庫(kù)的操作方法
- MySQL數(shù)據(jù)庫(kù)遷移OpenGauss數(shù)據(jù)庫(kù)解析
- openGauss數(shù)據(jù)庫(kù)共享存儲(chǔ)特性概述
相關(guān)文章
PostgreSQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)公網(wǎng)遠(yuǎn)程連接的操作步驟
PostgreSQL是一個(gè)功能非常強(qiáng)大的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),本文呢將簡(jiǎn)單幾步通過(guò)cpolar 內(nèi)網(wǎng)穿透工具即可現(xiàn)實(shí)本地postgreSQL 遠(yuǎn)程訪問(wèn),需要的朋友可以參考下2023-09-09
PostgreSQL數(shù)據(jù)庫(kù)備份還原全攻略
本文主要介紹邏輯備份和連續(xù)歸檔方式的備份及還原,文件系統(tǒng)級(jí)備份由于比較簡(jiǎn)單,這里不在贅述,以下操作使用的數(shù)據(jù)庫(kù)版本為PostgreSQL 12.5,不同的數(shù)據(jù)庫(kù)版本在進(jìn)行連續(xù)歸檔操作時(shí)會(huì)有細(xì)微差異,需要的朋友可以參考下2024-04-04
pgsql 實(shí)現(xiàn)用戶(hù)自定義表結(jié)構(gòu)信息獲取
這篇文章主要介紹了pgsql 實(shí)現(xiàn)用戶(hù)自定義表結(jié)構(gòu)信息獲取,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
PostgreSQL數(shù)據(jù)庫(kù)中跨庫(kù)訪問(wèn)解決方案
這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫(kù)中跨庫(kù)訪問(wèn)解決方案,需要的朋友可以參考下2017-05-05
PostgreSQL?數(shù)組類(lèi)型操作使用及特點(diǎn)詳解
這篇文章主要為大家介紹了PostgreSQL?數(shù)組類(lèi)型操作使用及特點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
postgresql數(shù)據(jù)庫(kù)如何查看數(shù)據(jù)中表的信息
這篇文章主要給大家介紹了關(guān)于postgresql數(shù)據(jù)庫(kù)如何查看數(shù)據(jù)中表信息的相關(guān)資料,要查詢(xún)數(shù)據(jù)表信息,需要用到 系統(tǒng)表或系統(tǒng)視圖等,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04

