PgSQL技术内幕 - psql与服务端连接与交互机制

PgSQL技术内幕 - 客户端psql与服务端连接与交互机制

简单来说,PgSQL的psql客户端向服务端发起连接请求,服务端接收到请求后,fork出一个子进程,之后由该子进程和客户端进行交互,处理客户端的SQL等,并将结果返回给客户端。那么,他是如何做到客户端和服务端子进程进行交互呢?服务端怎么做到和多个客户端交互呢?

1、客户端如何连接

psql客户端连接及发送SQL命令过程如下图所示:

fb85abfa1c737ffb5e4e8ed7824efeea.png

1)通过parse_psql_options函数解析出psql连接时指定的端口号、用户名、database名等

2)然后将这些参数以keywors[]和values[]数组保存,并作为入参带入PQconnectdbParams函数连接服务端

(1)PQconnectdbParams连接主要由PQconnectPoll完成,可以看到它仅通过socket函数创建套接字后,就直接调用connect连接服务端。由于没有通过bind函数绑定一个端口,所以在客户端会自动分配一个随机端口。

3)连接成功后,后面在MainLoop函数中接收psql端的输入,接收到命令后通过SendQuery函数将其在上面的套接字上将其发送给服务端。

举例:在windows版本上通过psql连接postgres后端口情况:

504c9ff0e011ee3da5266c266514d150.png

psql的进程ID为14856:

62a0c6621f691af5a015f9ee8bf05c04.png

通过netstat命令可以看到客户端随机分配了端口53761。服务端10900为postgres主进程,他绑定在5432端口上:

3ded34d3b9ec7edd69e42998f786eb7c.png

2、服务端如何构建连接

52b36d006350d57548199cce7c0f5a27.png

1)Postgres进程启动的时候就会绑定配置项port设置的端口,由函数StreamServerPort函数完成。上图所示,StreamServerPort完成socket、bind、listen的操作。

2)然后,进入ServerLoop函数中,通过select等待客户发来连接请求。一旦接收到后,就通过ConnCreate函数调用accept与客户端构建连接,返回对应的socket。

3)接着,通过BackendStartup函数调用fork_process函数fork出子进程,子进程会继承父进程上一步构建好连接的socket。

4)子进程不使用监听socket,所以需要将从父进程继承而来的监听socket关闭掉。

5)子进程进入BackendRun->PostgresMain中,初始化一系列内容,并通过recv函数在2)中的socket上接收客户端发来的命令,然后判断命令类型,比如简单查询,就会exec_simple_query去执行

6)父进程由于不需要执行客户端命令,所以fork出子进程后,通过StreamClose将2)中的socket关闭掉,这样就做到了在主进程中不接收客户端命令。

相关推荐

  1. MySQLPgSQL的优缺点对比

    2024-06-10 07:32:03       33 阅读
  2. 开启gitlab中远程连接pgsql

    2024-06-10 07:32:03       28 阅读
  3. PgSQL高级

    2024-06-10 07:32:03       39 阅读
  4. PythonHTTP服务交互

    2024-06-10 07:32:03       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-10 07:32:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-10 07:32:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-10 07:32:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-10 07:32:03       20 阅读

热门阅读

  1. 设备安装施工的一点总结

    2024-06-10 07:32:03       6 阅读
  2. conda常见命令

    2024-06-10 07:32:03       7 阅读
  3. Elasticsearch 详细介绍和经典应用

    2024-06-10 07:32:03       9 阅读
  4. 【数据结构】队列的应用(详解)

    2024-06-10 07:32:03       10 阅读
  5. 使用Spring Boot实现Redis多数据库缓存

    2024-06-10 07:32:03       12 阅读
  6. 小米测开面经

    2024-06-10 07:32:03       11 阅读
  7. 正态分布公式

    2024-06-10 07:32:03       8 阅读