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.mzph.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…