如何更新所有 postgres 节点上的本地文件

How to update local files on all the postgres nodes

我有一个多节点 Postgres 集群 运行,处于高可用性模式,遵循 primary-standby 架构。

postgres-0                                               5/5     Running            0          111s
postgres-1                                               5/5     Running            0          3m4s
postgres-monitor-0                                       4/4     Running            0          13m

其中一个 pod 是 primary,另一个 pod 处于 standby 模式,它以 synchronous 的方式从 primary 复制,而备用保持在read-only模式。

我正在运行以下CRUD命令更新本地文件:

-- Update pg_config to allow access to the users
create table hba ( lines text );
copy hba from '/pgsql/data/pg_hba.conf';

insert into hba (lines) values ('host     all              all       0.0.0.0/0    md5');
insert into hba (lines) values ('host     all              all       ::/0         md5');

copy hba to '/pgsql/data/pg_hba.conf';

-- reload the config
select pg_reload_conf();

问题是,文件 /pgsql/data/pg_hba.confprimary 节点上更新,而不是在 standby 节点上更新(因为所有查询都转到 master),这意味着当primary 节点关闭并且 standby 成为新节点 primary 配置更改将丢失。

我必须补充一点,这种方法对我来说看起来不太安全。

您不能在备用服务器上使用表(即使是临时表)。 我认为解决这个问题的最简单方法是编写 PL/PerlU or PL/PythonU 来进行必要的文件修改。您还必须调用函数 pg_reload_comf() 来激活修改。

copy命令可以在所有Postgres节点上执行:

psql -U postgres -h postgres-0.postgres-agent.default -c "copy hba to '/pgsql/data/pg_hba.conf'"
psql -U postgres -h postgres-1.postgres-agent.default -c "copy hba to '/pgsql/data/pg_hba.conf'"

copy 命令可以在 standby 节点上执行,即使它处于 ready-only 模式。


下面是验证所有节点都已加入集群并且复制已开始后的完整步骤序列:

第1步:(在主节点上执行,这将被复制到所有备用节点)

-- Update pg_config to allow access to the users
create table hba ( lines text );
copy hba from '/pgsql/data/pg_hba.conf';

insert into hba (lines)
    select 'host     <database>              all       0.0.0.0/0    scram-sha-256'
        where not exists (
            select 1 from hba where lines = 'host     <database>              all       0.0.0.0/0    scram-sha-256'
            );

insert into hba (lines)
    select 'host     <database>              all       ::/0         scram-sha-256'
        where not exists (
            select 1 from hba where lines = 'host     <database>              all       ::/0         scram-sha-256'
            );

第2步:(取决于副本数)

psql -U postgres -h postgres-0.postgres-agent.default -c "copy hba to '/pgsql/data/pg_hba.conf'"
psql -U postgres -h postgres-1.postgres-agent.default -c "copy hba to '/pgsql/data/pg_hba.conf'"

第 3 步:

-- reload the config
select pg_reload_conf();