如何更新所有 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.conf
在 primary
节点上更新,而不是在 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();
我有一个多节点 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.conf
在 primary
节点上更新,而不是在 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();