暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pg的一些小细节(参数(等级)、multiple postmaster等)

原创 Jerome Q 2025-04-11
289

1.备库不同步主库修改的参数

流复制的主备关系:
8个参数可以主备同步:max_connections、max_worker_processes、max_wal_senders、max_prepared_xacts、wal_level、wal_log_hints、track_commit_timestamp
这些GUC参数对于备库来说,至关重要,所以也全都是必须要重启生效 (postmaster)。
max_connections 这类参数要求备库上的这些共享内存结构必须不小于主库上的结构,以确保备库在恢复期间不会耗尽共享内存。

tips:
max_connections ,当比备库小的时候,流复制会暂停,在 14 以前的版本,重启主库,备库会挂掉,因为在 replay 这一条 record 的时候检测到了错误,在 14 进行了优化,仅仅是暂停流复制 (sent_lsn 停滞) 。

2.备库上max_connections比主库大

FATAL:  recovery aborted because of insufficient parameter settings
DETAIL:  max_connections = 99 is a lower setting than on the primary server, where its value was 100.

max_connections
max_wal_senders
max_worker_processes
max_prepared_transactions
max_locks_per_transaction
这五个参数都是postmaster级别,调整后均需要重启才能生效.

举例1:子事物同步过程中,备库要有一定的数据结构来记录标记点;
举例2:max_locks_per_transaction,shared buffers中用于存放锁的buffer是固定大小的(总共max_locks_per_transaction * max_connections个),超过了就会提示out of shared memory。假如,主库的max_connections是100,max_locks_per_transaction是1的话,那么总共锁的数量就是100。一旦备库的max_connections值比主库小,那么备库上锁的区域就不够了,更不用说这个时候备库万一还存在查询等活动,那么很容易就会out of shared memory,复制就中断了。

V14优化:
在14的版本里,针对这种情况还做了一个优化,当主库上修改了上面五个参数,并且比备库上的值更小时,不会再导致备库宕库了,而是改成暂停恢复,当备库参数修改为大于等于主库后便会继续自动恢复。

流复制模式下,不管是procarray还是快照都不能直接与备库共享,备库是从WAL日志中接收并回放所需的所有数据,因此势必会多一些额外的数据结构来做这些工作,为了不让共享内存溢出,便有了这个限制。
另外在14以后的版本,流复制假如遇到延迟了还要考虑到参数的影响,虽然这个场景不容易遇到。

3.multiple postmaster

生产案例 | multiple postmaster
https://mp.weixin.qq.com/s/9_FGJ4ctNlOGAtXc5WsY5A
当有大量连接的时候,PostgreSQL疲于奔命,大量fork连接,连接还处于一个中间态的时候,即还没有脱离postmaster的时候。
此时要关注机器负载和连接数,密码穷举攻击

4.查看pg的参数等级

select distinct context from pg_settings; context ------------------- postmaster superuser-backend user internal backend sighup superuser select * from pg_settings where name like '%max_conn%'; -[ RECORD 1 ]---+----------------------------------------------------- name | max_connections setting | 600 unit | category | Connections and Authentication / Connection Settings short_desc | Sets the maximum number of concurrent connections. extra_desc | context | postmaster vartype | integer source | configuration file min_val | 1 max_val | 262143 enumvals | boot_val | 100 reset_val | 600 sourcefile | /app1/pgsql_18801/data/postgresql.conf sourceline | 802 pending_restart | f internal 这些参数不能直接修改,他们反应了内部确定的值,其中一些可以通过重新initdb来修改,例如block_size,另一些则不能修改,例如server_version(数据库版本) postmaster 这些参数只能在数据库服务启动时应用,因此修改这类参数需要重新启动数据库 sighup 应用这些配置需要向postmaster发送sighup信号,使其重新读取配置文件,所以使其生效需要执行pg_ctl reload或者pg_reload_conf(),并且postmaster还将sighup发送到子进程,让所有子进程都获取参数的新值。 superuser-backend 1.必须是superuser或适当权限才能修改该参数 2.在配置文件中修改后,需要发送SIGHUP使其生效 3.当前会话无法使新参数生效,无法通过set在当前会话中配置新值,只能影响后续启动的会话, 典型参数是log_connections和log_disconnections backend 1. 在配置文件中修改后,需要发送SIGHUP使其生效 2. 当前会话无法使新参数生效,无法通过set在当前会话中配置新值,只能影响后续启动的会话 superuser 必须是superuser或适当权限才能修改该参数 user 1. 普通用户可执行 2. 可按照用户/库进行单独配置

声明:本文的一些灵感来自阅读xiongcc老师的公众号文章~学习cc老师,一起为爱发电

文章转载自Jerome Q,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论