PostgreSQL Frontend/Backend protocol (通信協議)

標簽

PostgreSQL , protocol , proxy , 通信協議


背景

理解PostgreSQL的通信協議可以更好的開發類似SQL代理,SQL中間件,SQL防火墻,連接池等軟件。

學習資料與軟件

《PostgreSQL 讀寫分離代理 - Crunchy Proxy(base on golang)》

Postgres on the wire - A look at the PostgreSQL wire protocol

PG通信協議介紹

https://www.postgresql.org/docs/current/static/protocol.html

https://www.postgresql.org/docs/current/static/protocol-message-formats.html

This section describes the detailed format of each message. Each is marked to indicate that it can be sent by a frontend (F), a backend (B), or both (F & B). Notice that although each message includes a byte count at the beginning, the message format is defined so that the message end can be found without reference to the byte count. This aids validity checking. (The CopyData message is an exception, because it forms part of a data stream; the contents of any individual CopyData message cannot be interpretable on their own.)

通信包格式樣例

Query (F)  
Byte1('Q')  
Identifies the message as a simple query.  Int32  
Length of message contents in bytes, including self.  String  
The query string itself.  CopyData (F & B)  
Byte1('d')  
Identifies the message as COPY data.  Int32  
Length of message contents in bytes, including self.  Byten  
Data that forms part of a COPY data stream.   
Messages sent from the backend will always correspond to single data rows,   
but messages sent by frontends might divide the data stream arbitrarily.  CopyDone (F & B)  
Byte1('c')  
Identifies the message as a COPY-complete indicator.  Int32(4)  
Length of message contents in bytes, including self.  

協議處理代碼樣例

src/interfaces/libpq/fe-protocol3.c

                                case 'C':               /* command complete */  if (pqGets(&conn->workBuffer, conn))  return;  if (conn->result == NULL)  {  conn->result = PQmakeEmptyPGresult(conn,  PGRES_COMMAND_OK);  if (!conn->result)  {  printfPQExpBuffer(&conn->errorMessage,  libpq_gettext("out of memory"));  pqSaveErrorResult(conn);  }  }  if (conn->result)  strlcpy(conn->result->cmdStatus, conn->workBuffer.data,  CMDSTATUS_LEN);  conn->asyncStatus = PGASYNC_READY;  break;  

某 PostgreSQL 代理軟件

https://github.com/CrunchyData/crunchy-proxy

https://github.com/wgliang/pgproxy

某 PostgreSQL 協議測試軟件

https://github.com/tatsuo-ishii/pgproto

http://dalibo.github.io/pgshark/

pgproto的使用簡介

yum install -y automake    
git clone https://github.com/tatsuo-ishii/pgproto    cd pgproto    
touch configure.ac Makefile Makefile.ac    
autoreconf -ivf    export PGPORT=1921    
export PGDATA=/data01/pg/pg_root$PGPORT      
export PGHOME=/usr/pgsql-10     
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH      
export PATH=$PGHOME/bin:$PATH:.      
export MANPATH=$PGHOME/share/man:$MANPATH      
export PGHOST=$PGDATA      
export PGUSER=postgres      
export PGDATABASE=postgres      ./configure --prefix=/var/lib/pgsql/pgp    
make    
make install    
psql    
create table aaa(id int);    
insert into aaa select generate_series(1,100);    
vi test.sql    #    
# Test data example    
#    
'Q'	"SELECT * FROM aaa"    
'Y'    
'P'	"S1"	"BEGIN"	0    
'B'	""	"S1"	0	0	0    
'E'	""	0    
'C'	'S'	"S1"    
'P'	"foo"	"SELECT 1"	0    
'B'	"myportal"	"foo"	0	0	0    
'E'	"myportal"	0    
'P'	"S2"	"COMMIT"	0    
'B'	""	"S2"	0	0	0    
'E'	""	0    
'C'	'S'	"S2"    
'S'    
'Y'    
'X'    
./pgp/bin/pgproto -h $PGDATA -p 1921 -u postgres -d postgres  -f ./test.sql    
FE=> Query(query="SELECT * FROM aaa")    
<= BE RowDescription    
<= BE DataRow    
<= BE DataRow    
<= BE DataRow    
<= BE DataRow    
<= BE DataRow    
<= BE DataRow    
<= BE DataRow    
<= BE DataRow    
<= BE DataRow    
<= BE DataRow    
<= BE DataRow    
.............. 100行    
<= BE CommandComplete(SELECT 1)    
<= BE ReadyForQuery(I)    
FE=> Parse(stmt="S1", query="BEGIN")    
FE=> Bind(stmt="S1", portal="")    
FE=> Execute(portal="")    
FE=> Close(stmt="S1")    
FE=> Parse(stmt="foo", query="SELECT 1")    
FE=> Bind(stmt="foo", portal="myportal")    
FE=> Execute(portal="myportal")    
FE=> Parse(stmt="S2", query="COMMIT")    
FE=> Bind(stmt="S2", portal="")    
FE=> Execute(portal="")    
FE=> Close(stmt="S2")    
FE=> Sync    
<= BE ParseComplete    
<= BE BindComplete    
<= BE CommandComplete(BEGIN)    
<= BE CloseComplete    
<= BE ParseComplete    
<= BE BindComplete    
<= BE DataRow    
<= BE CommandComplete(SELECT 1)    
<= BE ParseComplete    
<= BE BindComplete    
<= BE CommandComplete(COMMIT)    
<= BE CloseComplete    
<= BE ReadyForQuery(I)    
FE=> Terminate    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452829.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452829.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452829.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

啟動FastDFS服務,使用python客戶端對接fastdfs完成上傳測試

1.啟動tracker、storage、nginx服務&#xff1a; 啟動fdfs_trackerd&#xff1a;sudo service fdfs_trackerd start 啟動fdfs_storaged &#xff1a;sudo service fdfs_storaged start 啟動Nginx&#xff1a;sudo /usr/local/nginx/sbin/nginx 注&#xff1a;此處給出重啟服務…

軟件工程方法學

傳統方法學 傳統方法學也稱為生命周期方法學或結構化范型。它采用結構化技術(結構化分析、結構化設計和結構化實現)來完成軟件開發的各項任務&#xff0c;并使用適當的軟件工具或軟件工程環境來支持結構化技術的運用。 面向對象方法學 與傳統方法相反&#xff0c;面向對象方…

我做項目這些年的經驗

1、中國充滿大量非常敬業但不夠職業的項目經理&#xff0c;不了解這一點&#xff0c;就做不好中國的項目。 2、真正的原因往往都隱藏在表面的理由背后。 3、做項目最高境界是和用戶形成長期共生雙贏關系。 4、賣功能&#xff0c;賣利益&#xff0c;賣服務&#xff0c;賣價值…

Python學習-終端字體高亮顯示

1、采用原生轉義字符序列&#xff0c;對Windows有的版本不支持&#xff08;比如win7&#xff09;&#xff0c;完美支持Linux 實現過程&#xff1a; 終端的字符顏色是用轉義序列控制的&#xff0c;是文本模式下的系統顯示功能&#xff0c;和具體的語言無關。 轉義序列是以ESC開頭…

Win32-Application的窗口和對話框

Win32 Application&#xff0c;沒有基于MFC的類庫&#xff0c;而是直接調用C接口來編程。 一、彈出消息窗口 &#xff08;1&#xff09;最簡單的&#xff0c;在當前窗口中彈出新窗口。新窗口只有“YES”按鈕。 int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstan…

Python面試題總結(4)--數據類型(列表)

1. 已知 AList [1,2,3,1,2]&#xff0c;對 AList 列表元素去重&#xff0c;寫出具體過程。 答&#xff1a; AList [1,2,3,1,2] BList set(AList)print(BList) print(list(BList))輸出結果&#xff1a; {1, 2, 3} [1, 2, 3]2. 如何實現 “1,2,3” 變成 [“1”,“2”,“3”…

項目團隊要以十當一

如何建立起一支高效的團隊&#xff0c;并有效的管理團隊&#xff0c;一直是IT項目經理津津樂道的話題。任何一個IT項目經理對此都有自己一番不同的見解&#xff0c;根據自己團隊特點&#xff0c;項目經理正在用自身獨有的管理藝術改變著自己的團隊。項目團隊要以十當一&#xf…

Centos中配置環境變量

以Java的開發環境Jdk為例。 將jdk-9.0.1放置在/usr/local下&#xff08;UNIX規范&#xff09;&#xff0c;然后我們將jdk配置到環境變量中去。 $ mv jdk-9.0.1 /usr/local $ vim /etc/profile 修改 /etc/profile &#xff0c;最底部加入以下內容 export JAVA_HOME/usr/local/jd…

python面試題總結(5)--數據類型(字典)

1. 字典操作中 del 和 pop 有什么區別 答&#xff1a;del 可以根據索引&#xff08;元素所在位置&#xff09;來刪除的&#xff0c;沒有返回值。 pop 可以根據索引彈出一個值&#xff0c;然后可以接收它的返回值。 參考一 參考二 2. 按照字典的內的年齡排序 d1 [ {‘name’…

js下載文件 java_[Java教程]使用js實現點擊按鈕下載文件

[Java教程]使用js實現點擊按鈕下載文件0 2016-11-11 19:02:54有時候我們在網頁上需要增加一個下載按鈕&#xff0c;讓用戶能夠點擊后下載頁面上的資料&#xff0c;那么怎樣才能實現功能呢&#xff1f;這里有兩種方法&#xff1a;現在需要在頁面上添加一個下載按鈕&#xff0c;點…

underscore.js源碼研究(5)

概述 很早就想研究underscore源碼了&#xff0c;雖然underscore.js這個庫有些過時了&#xff0c;但是我還是想學習一下庫的架構&#xff0c;函數式編程以及常用方法的編寫這些方面的內容&#xff0c;又恰好沒什么其它要研究的了&#xff0c;所以就了結研究underscore源碼這一心…

人心散了、項目必然要敗

最近接手一個項目&#xff0c;是從半路上接過來的。按照常理&#xff0c;只要腦子沒被驢踢&#xff0c;是不會接人家的爛攤子的。我之所以接這個項目&#xff0c;一方面是因為這個項目中的開發人員是我部門的人&#xff08;本人是部門主管&#xff09;&#xff0c;另一方面是因…

國家自科委管文科學部認定的國內30種重要期刊

國家自科委管文科學部認定的國內30種重要期刊 A類刊物&#xff08;22種&#xff09; 1、管理科學學報&#xff08;雙月刊&#xff09; 2、系統工程理論與實踐&#xff08;月刊&#xff09; 3、管理世界&#xff08;月刊&#xff09; 4、數量經濟技術經濟研究&#xff08;月刊&a…

面向對象的四個要點

?把對象(object)作為融合了數據及在數據上的操作行為的統一的軟件構件?把所有對象都劃分成類(class)。?按照父類與子類的關系&#xff0c;把若干個相關類組成一個層次結構的系統。?對象彼此間僅能通過發送消息互相聯系。

Django二次開發對接FastDFS

1.自定義文件存儲器類 配置文件settings中加入如下配置 # 設置Django的文件存儲類、&#xff08;名字固定&#xff09; DEFAULT_FILE_STORAGEutils.fdfs.storage.FDFSStorage# 設置fdfs使用的client.conf文件路徑&#xff08;名字自己定義&#xff09; FDFS_CLIENT_CONF./util…

微信支付 java 集成案例_Spring Boot項目中集成微信支付v3

1. 前言最近忙的一批&#xff0c;難得今天有喘氣的機會就趕緊把最近在開發中的一些成果分享出來。前幾日分享了自己寫的一個微信支付V3的開發包payment-spring-boot-starter&#xff0c;就忙里偷閑完善了一波。期間給微信支付提交了6個BUG&#xff0c;跟微信支付的產品溝通了好…

單挑力扣(LeetCode)SQL題:1308. 不同性別每日分數總計

相信很多學習SQL的小伙伴都面臨這樣的困境&#xff0c;學習完書本上的SQL基礎知識后&#xff0c;一方面想測試下自己的水平&#xff1b;另一方面想進一步提升&#xff0c;卻不知道方法。 其實&#xff0c;對于技能型知識&#xff0c;我的觀點一貫都是&#xff1a;多練習、多實…

需求與范圍駕馭深刻反省總結

每天都在講范圍、說需求&#xff0c;真的到了想整理出點什么的時候&#xff0c;卻一下子不知從何說起。也許是熟悉麻痹癥吧。根據我的破經歷&#xff0c;在需求方面有幾個是最搞人的&#xff0c;只要我們方法得當&#xff0c;雖然不一定能夠完全駕馭&#xff0c;但起碼可以改善…

16. vim

vim編輯器是vi的升級版本&#xff0c;帶顏色顯示安裝yum install -y vim-enhanced將passwd文件復制到其他目錄下&#xff0c;vim后沒有顏色 一般模式上下左右方向鍵或kjhl四個鍵移動光標n方向鍵 向特定方向移動n位ctrl b 或 pageup 向上翻頁ctrl f 或 pagedown 向下翻頁0或sh…