几个月之前,以下内容已经合并到了PostgreSQL 12中,简化了故障转移的流程:
提交: 10074651e3355e2405015f6253602be8344bc829作者: Michael Paquier <michael@paquier.xyz>时间: 2018年10月25日,星期四 09:46:00 +0900添加pg_promote函数这个函数可以使用这个新的SQL-callable函数来提升主备。可以将执行权限授予一个非超级用户,这样故障转移工具就可以遵循特权最少的原则。目录版本被切换。作者: Laurenz AlbeReviewed-by: Michael Paquier, Masahiko SawadaDiscussion:https://postgr.es/m/6e7c79b3ec916cf49742fb8849ed17cd87aed620.camel@cybertec.at
Promotion是一个在备用服务器上进行恢复直到结束并且开始读写操作的进程,从而将该备用服务器置于一个新的时间点上。这个操作可以使用几个选项来完成:
pg_ctl promote,默认情况下,在退出之前等待备用服务器完成提升。
在postgresql.conf中定义promote_trigger_file和创建由启动进程检测并在恢复完成时转换的文件(或 recovery.conf中的trigger_file,恢复参数将被合并到V12的postgresql.conf和新的版本中)。
上面提到的是第三种提供触发SQL-callable函数的方法,它与其他两个方法相比具有巨大的优势:不需要连接到备用主机上进行提升,所有事情都可以通过后端会话来完成。但是请注意,这需要一个能够连接并且只接受读操作的备用服务器。
默认情况下,pg_promote()等待升级完成后将结果返回给调用者,等待时间最长为60秒,这与pg_ctl的提升模式相同。然而,可以通过指定参数强制执行等待模式和超时值,第一个参数为布尔值是指定等待模式的,第二个参数为整数(以秒为单位)是指定超时时间。如果等待模式为false,则超时无效,一旦提升信号发送给postmaster,pg_promote立即返回:
-- 最多等待30秒。SELECT pg_promote(true, 30);-- 不等待,立即离开。SELECT pg_promote(false);
注意,默认情况下,此函数的访问权限仅限于超级用户,但它的执行权限可以直接授予非超级用户,从而使用户利用故障转移来进行提升:
=# CREATE ROLE promote_role LOGIN;CREATE ROLE=# GRANT EXECUTE ON FUNCTION pg_promote TO promote_role;GRANT
该函数还以布尔值的形式返回状态,false表示未能将SIGUSR1发送给postmaster,true表示成功完成提升(在非等待模式下,立即返回true),这使得SQL客户机更容易解析和处理状态。注意,在尝试执行以下操作时,也会出现一些失败:
为超时参数定义一个负数。
在服务器未恢复的情况下触发该函数。
创建触发器文件。
该函数还被标记为parallel-safe,因为它不依赖于服务器上进程之间全局共享状态,因此可以在并行执行时触发它,但是,它可能会导致一些调用的错误,这取决于并行进程之间的时间安排。由于这个函数包含在非常简单的SQL中,所以这实际上并不需要担心。
文章翻译自:Postgres 12 highlight - pg_promote
https://paquier.xyz/postgresql-2/postgres-12-promote-function/




