您好,登錄后才能下訂單哦!
本篇內容介紹了“基于PostgreSQL/openGauss的分布式數據庫怎么解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
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 略高。
兼容 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 在數據庫上層提供的增量能力。
支持 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 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 暫時無法查詢出邏輯庫或邏輯表。
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();
“基于PostgreSQL/openGauss的分布式數據庫怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。