PostgreSQL 14中连接参数target_session_attrs增强

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: PostgreSQL 14中连接参数target_session_attrs增强

PostgreSQL 14中连接参数target_session_attrs增强


本文讨论PostgreSQL 14数据库连接参数target_session_attrs增强的功能,并解释该功能背后的历史、如何使用它以及它提供的各种好处。


背景


很多PG客户端程序使用C客户端libpq库访问数据库。libpq提供了一系列函数,允许连接PG后台服务并将查询传送过去,同时还可以接收查询返回的结果。

通过libpq,PG支持一个连接字符串,指定多个host+port。依次尝试每个host+port直到成功建立连接。

PG10中引入指定多个hosts的功能。同时增加了参数target_session_attrs,允许指定连接的后台server类型。

支持下面的参数值:

target_session_attrs值

意义

any(默认值)

可以接受所有连接

read-write

默认情况下,可接受的读写事务中仅可以接受一个连接

PG11开始,Fujitsu提供了额外的参数值,不仅要满足其他连接类型,还要提高内部效率,以验证参数并建立连接。因此与PG社区开始了漫长的审查、咨询、改进的过程。涉及:

多名开发人员;许多补丁版本和补丁集更改;社区许多成员的反馈,有时会有不同意见和想法;一些成员对附加功能的请求;提交者本人的最终改进、调整与简化。

最终libpq增强功能在PG14提交了。


功能概述


PG14中target_session_attrs值如下,高亮显示的是新值:

target_session_attrs值

意义

any(默认值)

可以接受所有连接

read-write

默认情况下,可接受的读写事务中仅可以接受一个连接

read-only

默认情况下,会话不能接受任何读写事务

primary

Server不能是hot standby模式

standby

server必须是hot standby模式

prefer-standby

首先尝试找到一个standby server。但如果hosts列表中没有standby server,那么尝试“any”模式

注意,由于default_transaction_read_only设置成on,PG的server可以是只读但不能是hot standby模式。


支持的客户端


任何使用libpq库的客户端都能够使用target_session_attrs以及此处描述的改进的功能。支持psycopg2(python驱动)、psqlODBC(c 语言接口的驱动)。但是不包括JDBC驱动和NpgSql。JDBC支持targetServerType提供类似的功能,允许的值有primary/secondary/preferSecondary。NpgSql目前没有类似功能。


连接性能的提升


target_session_attrs增加了新值,当连接到PG14或之后的版本时,性能会有所提升。通过使用与会话状态相关的配置变量来实现:

GUC变量

描述

default_transaction_read_only

PG14中可报告的(GUC_REPORT)

in_hot_standby

PG14中新的GUC_REPORT变量


服务器在成功连接时直接向客户端报告这些信息,节省了额外的网络往返时间以确定会话状态。因此连接到旧版本服务时,会发出SHOW和SELECT查询以检测会话只读或热备状态。注意,若服务在会话期间被提升成主,则in_hot_standby也会报告给客户端。


案例


Psql使用libpq,可以无需任何编码测试target_session_attrs。下面显示了尝试连接2个可能的本地服务其中一个服务时,使用不同target_session_attrs值的简单例子。

1、创建本地服务实例testdb1和testdb2(分别运行在端库5432和5433)

    $ pg_ctl -D ./testdb1 initdb
    $ pg_ctl -D ./testdb2 initdb
    $ pg_ctl -D ./testdb1 -o '-p 5432' -l testdb_1.log start
    $ pg_ctl -D ./testdb2 -o '-p 5433' -l testdb_2.log start

    2、尝试连接仅接受只读事务的服务

      $ psql "host=localhost,localhost port=5432,5433 dbname=postgres target_session_attrs=read-only"
      psql: error: connection to server at "localhost" (::1), port 5432 failed: session is not read-only
      connection to server at "localhost" (::1), port 5433 failed: session is not read-only

      连接失败,因为2个实例仅接受读写事务。

      3、改变testdb2使其仅接受只读事务,更改testdb2/postgresql.conf添加default_transaction_read_only=on并重启。


      $ pg_ctl -D ./testdb2 -o '-p 5433' -l testdb_2.log restart

      4、尝试连接到只读server

        $ psql "host=localhost,localhost port=5432,5433 dbname=postgres target_session_attrs=read-only"
        psql (14devel)
        Type "help" for help.
        postgres=# show port;
        port
        ------
        5433
        (1 row)

        5、尝试连接hot standby的server

          $ psql "host=localhost,localhost port=5432,5433 dbname=postgres target_session_attrs=standby"
          psql: error: connection to server at "localhost" (::1), port 5432 failed: server is not in hot standby mode
          connection to server at "localhost" (::1), port 5433 failed: server is not in hot standby mode

          连接失败,因为没有hot standby模式的实例

          6、尝试连接primary server

            $ psql "host=localhost,localhost port=5432,5433 dbname=postgres target_session_attrs=primary"
            psql (14devel)
            Type "help" for help.
            postgres=# show port;
            port
            ------
            5432
            (1 row)

            7、连接到一个server,最好是处于热备模式的

              $ psql "host=localhost,localhost port=5432,5433 dbname=postgres target_session_attrs=prefer-standby"
              psql (14devel)
              Type "help" for help.
              postgres=# show port;
              port 
              ------
              5432
              (1 row)

              总结


              支持的target_session_attrs新值,允许客户端选择需要的目标服务连接时进行更精细的粒度,并协助多主机连接功能。还提供了一种基本的扩展形式,例如允许将只读请求重定向到备服务,以减少主服务的负载。最后新值可以允许多主机连接字符串更好地与某些故障切换解决方案一起公众,以重新连接到可用的服务。


              原文


              https://www.postgresql.fastware.com/blog/enhancement-to-target-session-attrs

              相关实践学习
              使用PolarDB和ECS搭建门户网站
              本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
              阿里云数据库产品家族及特性
              阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
              目录
              相关文章
              |
              关系型数据库 PostgreSQL
              解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
              解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
              1477 0
              |
              20天前
              |
              Oracle 安全 关系型数据库
              【赵渝强老师】PostgreSQL的参数文件
              PostgreSQL数据库的四个主要参数文件包括:`postgresql.conf`(主要配置文件)、`pg_hba.conf`(访问控制文件)、`pg_ident.conf`(用户映射文件)和`postgresql.auto.conf`(自动保存修改后的参数)。视频讲解和详细说明帮助理解各文件的作用。
              87 19
              |
              6月前
              |
              关系型数据库 Shell C#
              PostgreSQL修改最大连接数
              在使用PostgreSQL时,可能遇到“too many clients already”错误,这是由于默认最大连接数(100)不足。要增加此数值,需修改`postgresql.conf`中的`max_connections`参数
              299 5
              |
              3月前
              |
              关系型数据库 数据库 PostgreSQL
              深入理解 PostgreSQL 的 JOIN 连接
              深入理解 PostgreSQL 的 JOIN 连接
              185 4
              |
              6月前
              |
              JavaScript 关系型数据库 API
              Nest.js 实战 (二):如何使用 Prisma 和连接 PostgreSQL 数据库
              这篇文章介绍了什么是Prisma以及如何在Node.js和TypeScript后端应用中使用它。Prisma是一个开源的下一代ORM,包含PrismaClient、PrismaMigrate、PrismaStudio等部分。文章详细叙述了安装PrismaCLI和依赖包、初始化Prisma、连接数据库、定义Prisma模型、创建Prisma模块的过程,并对比了Prisma和Sequelize在Nest.js中的使用体验,认为Prisma更加便捷高效,没有繁琐的配置。
              244 7
              Nest.js 实战 (二):如何使用 Prisma 和连接 PostgreSQL 数据库
              |
              5月前
              |
              SQL 关系型数据库 数据库
              PostgreSQL常用命令,启动连接,pg_dump导入导出
              PostgreSQL常用命令,启动连接,pg_dump导入导出
              |
              5月前
              |
              关系型数据库 MySQL 数据库
              postgresql使用mysql_fdw连接mysql
              通过以上步骤,你可以在PostgreSQL中访问和查询远程MySQL服务器的数据,这对于数据集成和多数据库管理非常有用。
              346 0
              |
              6月前
              |
              分布式计算 DataWorks 关系型数据库
              DataWorks操作报错合集之使用连接串模式新增PostgreSQL数据源时遇到了报错"not support data sync channel, error code: 0001",该怎么办
              DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
              |
              6月前
              |
              SQL 分布式计算 关系型数据库
              实时计算 Flink版产品使用问题之在使用FlinkCDC与PostgreSQL进行集成时,该如何配置参数
              实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
              实时计算 Flink版产品使用问题之在使用FlinkCDC与PostgreSQL进行集成时,该如何配置参数
              |
              5月前
              |
              SQL 关系型数据库 数据库
              EF Core连接PostgreSQL数据库
              EF Core连接PostgreSQL数据库
              70 0