这篇博文是关于理解postgres客户端和postgres服务器之间的网络交互。YugabyteDB在其分布式存储之上实现了postgres服务器,因此其行为与标准postgres相同。
首先要看的是postgres查询处理。使用postgres执行的任何查询都需要经过多个阶段才能返回结果。这些步骤包括:
-
解析(语法):将文本分解为解析树。
-
解析(语义):验证解析树元素的存在等。
-
重写:将解析树转换为查询树。
-
计划:将查询树转换为计划语句节点,以实现最高效的执行。
-
执行:使用计划语句节点执行。
详细讨论这些内容超出了本文的范围,但重要的是,在将表示为文本的SQL作为SQL执行并处理和返回结果之前,postgres服务器必须执行许多步骤[1]。
SQL通过postgres协议发送到postgres服务器。有多个postgres协议版本(2和3)[2]。
一旦建立了连接,它就允许客户端执行许多任务,这些任务由客户端发送的请求控制。为了执行查询并返回结果,根据请求的类型,有两种常见的方法:使用简单查询消息:使用“Q”或查询消息[3],以及使用扩展查询消息,使用“P”、“B”和“E”消息进行解析、绑定和执行[4]。
简单查询协议,顾名思义,非常简单:一条“Q”消息连同查询一起发送到postgres服务器,指示简单查询协议和执行的所有步骤,一条或多条消息被发送回客户端。这意味着客户端上查询的总响应时间是服务器端解析、重写、计划和执行的所有步骤,加上发送查询请求和获取所有响应包的延迟。
扩展查询协议更全面,将查询执行分为3个步骤:
-
作语法分析
-
绑定
-
处决
如您所见,这些步骤与postgres服务器端的解析、重写、计划和执行步骤略有不同。扩展协议查询步骤按以下方式对一些服务器端工作进行分组:
-
扩展查询协议“解析”:服务器端解析语法、解析语义和重写步骤。
-
扩展查询协议“绑定”:服务器端计划步骤。
-
扩展查询协议“执行”:服务器端执行步骤。
对于要执行的给定客户端SQL文本,必须执行每个步骤。但是,一旦使用扩展查询协议解析步骤在服务器端存在查询,绑定和执行步骤就可以多次使用该查询。这通常称为准备好的语句。
需要意识到的另一件重要事情是,解析、绑定和执行的不同步骤不需要postgres服务器执行来自客户端的单个数据包/消息。如果这是真的,使用扩展协议而不是简单查询协议通常不会有任何好处,因为在许多情况下,执行这些步骤的网络延迟会使简单查询协议优于扩展查询协议。
扩展查询协议允许将解析、绑定和执行请求与SQL一起发送到单个数据包中,或者在客户端认为合适的情况下发送到多个数据包上。postgres服务器知道何时执行工作的方式是在一个或多个解析、绑定和执行消息之后看到同步消息[5]。
使用扩展查询协议的灵活性和细粒度控制,postgres客户端可以解析一条准备好的语句,然后绑定并执行多次,从而允许对postgres服务器执行更细粒度的SQL,比使用简单查询协议更有效率。当然,这取决于客户端对扩展查询协议的效率和实现。
postgres客户端几乎不知道服务器端的不同执行步骤。简单查询协议的执行总是不知道的,因为所有步骤都是在响应返回给客户端之前执行的。对于扩展查询协议执行,它取决于解析、绑定和执行消息如何与同步消息一起发送。客户端的一些实现将解析显式地作为已准备语句的定义来执行,从而使解析阶段可测量,但在请求中组合作为执行结果的绑定行和数据行,以及在服务器响应中组合绑定成功的响应和执行返回的数据也是非常常见的。
postgres’psql’和YugabyteDB’ysqlsh’命令行工具始终通过简单查询协议执行。对于其他数据库客户端,协议的使用取决于实现:大多数编程语言允许选择简单或扩展协议通信。
简单查询协议和扩展查询协议执行的服务器端响应时间可以通过设置postgres参数“log_min_duration_statement”或YugabyteDB tablet服务器标志“ysql_log_min_ducation_statement”来查看,并设置为总查询响应时间的阈值(以毫秒为单位)。将它设置为0将记录所有查询,将其设置为-1将禁用记录。作为设置结果的日志行显示简单查询执行的单行,并列出扩展查询协议的解析、绑定和执行的步骤和延迟。扩展查询协议允许将解析、绑定和执行请求与SQL一起发送到单个数据包中,或者在客户端认为合适的情况下发送到多个数据包上。postgres服务器知道何时执行工作的方式是在一个或多个解析、绑定和执行消息之后看到同步消息[5]。
[1]https://www.postgresql.org/docs/11/overview.html
[2]https://www.postgresql.org/docs/11/protocol.html
[3]https://www.postgresql.org/docs/11/protocol-flow.html#id-1.10.5.7.4
[4]https://www.postgresql.org/docs/11/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY
[5]https://beta.pgcon.org/2014/schedule/attachments/330_postgres-for-the-wire.pdf
原文标题:Postgres and YSQL network analysis
原文作者:Frits Hoogland
原文链接:https://dev.to/yugabyte/postgres-and-ysql-network-analysis-32kf




