PostgreSQL 14中连接参数target_session_attrs增强

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
              目录
              相关文章
              |
              1月前
              |
              DataWorks Java 关系型数据库
              DataWorks常见问题之将预警信息发送至邮箱
              DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
              35 1
              |
              5月前
              |
              缓存 关系型数据库 数据库
              PostgreSQL技术大讲堂 - 第32讲:数据库参数调整
              从零开始学PostgreSQL技术大讲堂 - 第32讲:数据库参数调整
              450 2
              |
              5月前
              |
              关系型数据库 PostgreSQL
              解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
              解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
              407 0
              |
              4月前
              |
              SQL 关系型数据库 数据库
              postgresql数据库修改参数的方式
              在PostgreSQL数据库中,你可以通过多种方式修改数据库参数,以更改其行为。以下是一些常见的修改数据库参数的方式: 1. **通过配置文件修改(postgresql.conf):** PostgreSQL的配置文件是 `postgresql.conf`。你可以直接编辑该文件,找到要修改的参数,修改其值,然后重新启动PostgreSQL服务以使更改生效。 通常,`postgresql.conf` 文件位于 PostgreSQL 数据目录下。修改完毕后,确保重新启动 PostgreSQL 服务。 2. **使用 ALTER SYSTEM 命令:** PostgreSQL
              106 1
              |
              5月前
              |
              SQL 关系型数据库 数据库
              postgresql中连接两张表更新第三张表(updata)
              如何结合两张表的数据来更新第三张表
              70 0
              |
              1月前
              |
              关系型数据库 MySQL 分布式数据库
              PolarDB for MySQL数据库外网连接解析失败的原因可能有以下几点
              【2月更文挑战第16天】PolarDB for MySQL数据库外网连接解析失败的原因可能有以下几点
              24 1
              |
              2月前
              |
              关系型数据库 MySQL 分布式数据库
              PolarDB for MySQL数据库外网连接解析失败的原因
              【2月更文挑战第5天】PolarDB for MySQL数据库外网连接解析失败的原因
              63 8
              |
              2月前
              |
              关系型数据库 Java 分布式数据库
              PolarDB for PostgreSQL参数问题之参数删除失败如何解决
              PolarDB for PostgreSQL是基于PostgreSQL开发的一款云原生关系型数据库服务,它提供了高性能、高可用性和弹性扩展的特性;本合集将围绕PolarDB(pg)的部署、管理和优化提供指导,以及常见问题的排查和解决办法。
              |
              2月前
              |
              关系型数据库 分布式数据库 数据库
              PolarDB for PostgreSQL报错问题之psql连接数据库报错如何解决
              PolarDB for PostgreSQL是基于PostgreSQL开发的一款云原生关系型数据库服务,它提供了高性能、高可用性和弹性扩展的特性;本合集将围绕PolarDB(pg)的部署、管理和优化提供指导,以及常见问题的排查和解决办法。
              |
              3月前
              |
              关系型数据库 分布式数据库 PolarDB
              在 Flask 中连接 OceanBase 或 PolarDB
              在 Flask 中连接 OceanBase 或 PolarDB【1月更文挑战第12天】【1月更文挑战第59篇】
              97 6