1 配置文件
1.1 配置文件格式
repmgr.conf
是一个纯文本文件,每行包含一个参数/值组合。
空格是无关紧要的(除了在带引号的参数值内),并且空行将被忽略。#
将该行的其余部分指定为注释。不是简单标识符或数字的参数值应该用单引号引起来。
要在参数值中嵌入单引号,请写入两个引号(首选)或反斜杠引号。
有效文件示例repmgr.conf
:
bash
# repmgr.conf
node_id=1
node_name= node1
conninfo ='host=node1 dbname=repmgr user=repmgr connect_timeout=2'
data_directory = '/var/lib/pgsql/12/data'
1.2 配置文件的包含指令
从repmgr 5.2 开始,配置文件可以包含以下 include 指令:
include
:包含指定的文件,可以是绝对路径,也可以是相对于当前文件的路径include_if_exists
: 包含指定的文件。该文件被指定为绝对路径或相对于当前文件的路径。但是,如果不存在,则不会引发错误。include_dir
:包含指定目录中后缀为.conf
. 目录指定为绝对路径或相对于当前文件的路径
它们的行为方式与 PostgreSQL 配置文件处理完全相同;有关更多详细信息,请参阅PostgreSQL 文档 。
1.3 配置文件位置
将在以下位置搜索配置文件:
-
-f/--config-file
由命令行选项指定的配置文件 -
由软件包维护者指定的位置(如果 从软件包安装 repmgr并且软件包维护者已指定配置文件位置)
-
repmgr.conf
在本地目录中 -
/etc/repmgr.conf
-
pg_config --sysconfdir报告的目录
请注意,如果使用 显式指定文件-f/--config-file
,则如果未找到该文件或该文件不可读,则会引发错误,并且不会尝试检查默认位置;这是为了防止repmgr意外读取错误的配置文件
1.4 配置文件项
以下部分记录了配置文件的一些部分:
1.4 .1 必须的配置文件
每个repmgr.conf
文件必须包含以下参数:
node_id
( int
)
标识节点的大于零的唯一整数。
node_name
( string
)
任意(但唯一)字符串;我们建议使用服务器的主机名或与服务器明确关联的其他标识符以避免混淆。避免选择反映节点当前角色的名称,例如,primary
或者standby1
因为角色可以更改,并且如果您最终得到调用当前主节点的解决方案standby1
(例如),至少可以说事情会很混乱。
该字符串的最大长度为 63 个字符,并且应仅包含可打印的 ASCII 字符。
conninfo
( string
)
作为 conninfo 字符串的数据库连接信息。集群中的所有服务器都必须能够使用此字符串连接到本地节点。
有关 conninfo 字符串的详细信息,请参阅 PosgreSQL 文档中的 连接字符串部分。
如果正在使用repmgrd,请考虑 connect_timeout
在conninfo
字符串中显式设置以确定放弃网络连接尝试之前经过的时间长度;有关详细信息,请参阅PostgreSQL 文档。
data_directory
( string
)
节点的数据目录。当 PostgreSQL 实例未运行且没有其他方法确定数据目录时,repmgr 需要执行此操作。
1.4 .2 可选的配置文件
config_directory
( string
)
postgresql.conf
如果 PostgreSQL 配置文件位于数据目录之外,请指定主文件所在 目录 。
这允许显式提供外部配置文件目录,如果设置该目录,则该目录将pg_ctl
作为 -D
参数传递。否则pg_ctl
将默认使用数据目录,如果配置文件不存在,这将导致某些操作失败。
replication_user
( string
)
与之建立复制连接的 PostgreSQL 用户。如果为设置默认值,则为conninfo中定义的用户
replication_type
( string
)
必须是physical
(默认)。
location
( string
)
定义节点位置的任意字符串;这在故障转移期间用于检查当前主节点的可见性。
use_replication_slots
( boolean
)
是否使用物理复制槽。
ssh_options
( string
)
由repmgrssh
执行时 附加到命令的选项。
我们建议添加-q
以抑制任何多余的 SSH 聊天(例如登录横幅)以及显式 ConnectTimeout
值,例如:
bash
ssh_options='-q -o ConnectTimeout=10'
pg_bindir
( string
)
PostgreSQL 二进制目录的路径(pg_ctl、 pg_basebackup等的位置)。仅当系统中没有这些时才需要PATH
。
1.5 日志设置
默认情况下,repmgr和repmgrd将日志输出写入 STDERR
. 可以指定替代日志目标(文件或syslog
)。
log_level
( string
)
日志输出的级别,默认为INFO
. 可选值:
DEBUG
, INFO
, NOTICE
, WARNING
, ERROR
, ALERT
, CRIT
, EMERG
.
请注意,这DEBUG
将产生大量日志输出,在正常使用中不应启用。
log_facility
( string
)
日志记录工具: 可选的值有 STDERR(默认),或对于syslog的话,可选的值有 : LOCAL0
, LOCAL1
, ...
, LOCAL7
, USER
.
log_file
( string
)
如果log_facility
设置为STDERR
,则可以将日志输出重定向到指定文件。
有关配置日志轮换的信息, 请参阅第 13.4 节。
log_status_interval
( integer
)
此设置导致repmgrd以指定的时间间隔(以秒为单位,默认300
)发出状态日志行,描述repmgrd的当前状态,例如:
bash
[2018-07-12 00:47:32] [INFO] monitoring connection to upstream node "node1" (ID: 1)
bash
log_level=info
log_facility=STDERR
log_file='/home/storage/repmgr/repmgr.log'
log_status_interval=600
1.6 服务器命令参数
在某些情况下,repmgr(和repmgrd)需要能够停止、启动或重新启动 PostgreSQL。repmgr的命令repmgr standby follow, repmgr standby switchover and repmgr node rejoin.需要用到上面的命令
默认情况下,repmgr将使用 PostgreSQL 的pg_ctl
程序来控制 PostgreSQL 服务器。然而,这可能会导致各种问题,特别是当从软件包安装 PostgreSQL 时,尤其是在使用 systemd时。
特别注意:
如果使用 systemd,请确保您已 RemoveIPC
设置为 off
。有关详细信息, 请参阅 PostgreSQL 文档部分 systemd RemoveIPC 以及 PostgreSQL wiki 中的 systemd条目。
相关参数
bash
service_start_command='pg_ctl -D /home/storage/pgsql/data -l /home/storage/pgsql/data/server.log start'
service_stop_command='pg_ctl -D /home/storage/pgsql/data -l /home/storage/pgsql/data/server.log stop'
service_restart_command='pg_ctl -D /home/storage/pgsql/data -l /home/storage/pgsql/data/server.log restart'
service_reload_command='pg_ctl -D /home/storage/pgsql/data -l /home/storage/pgsql/data/server.log reload'
可以用以下命令查看真实的PG的命令
repmgr -f /etc/repmgr.conf node service --list-actions --action=stop
repmgr -f /etc/repmgr.conf node service --list-actions --action=start
repmgr -f /etc/repmgr.conf node service --list-actions --action=restart
repmgr -f /etc/repmgr.conf node service --list-actions --action=reload
1.7 用户权限
如果用户是superuser权限,则无需再授予其他权限
如果使用费superuser ,则需要以下权限:
1.7.1 Replication role
repmgr需要一个具有REPLICATION角色的用户来 创建复制连接以及管理复制slots
1.7.2. Database roles
非superuser的用户还需要是以下预定义觉角色的成员
pg_read_all_stats
(查询pg_stat_replication以及执行
executepg_database_size()
在所有的数据库上)pg_read_all_settings
(to access thedata_directory
setting)
1.7.3. Extension creation
1.7.4. Function permissions
1.7.5. repmgr actions requiring a superuser
1.7.6. repmgr commands with --superuser option
1.8 密码管理
PostgreSQL 提供三种提供密码的方式:
- 在字符串
conninfo
中包含密码(例如"host=node1 dbname=repmgr user=repmgr password=foo
") - 将密码导出为环境变量 (
PGPASSWORD
) - 将密码存储在专用密码文件中
我们强烈建议不要在字符串conninfo
中包含密码,因为这将导致数据库密码在各个地方暴露,包括文件 repmgr.conf
、repmgr.nodes
表、由repmgr生成的列出节点conninfo
字符串的任何输出(例如 repmgr cluster show)和在repmgr日志文件中,特别是在log_level=DEBUG
.
将密码导出为环境变量 ( PGPASSWORD
) 被认为不太不安全,但 PostgreSQL 文档明确建议不要这样做:
管理密码最安全的选择是使用专用密码文件
存储密码的最安全方法是存储在密码文件中,默认情况下为**~/.pgpass
.** 该文件只能由拥有该文件的系统用户读取,并且 PostgreSQL 将拒绝使用该文件,除非将读/写权限限制为文件所有者。文件中包含的密码将不会被 repmgr(或任何其他基于 libpq 的客户端软件,例如psql)直接访问。
有关完整详细信息,请参阅 PostgreSQL 密码文件文档。
为了与repmgr 一起使用,~/.pgpass
复制集群中的每个节点必须有两个条目:一个用于访问repmgr元数据库的repmgr用户,另一个用于复制连接(无论是否使用专用复制用户)。该文件必须存在于复制集群中的每个节点上。
被repmgr管理的3节点的PG集群 文件示例 :
bash
node1:5432:repmgr:repmgr:foo
node1:5432:replication:repmgr:foo
node2:5432:repmgr:repmgr:foo
node2:5432:replication:repmgr:foo
node3:5432:repmgr:repmgr:foo
node3:5432:replication:repmgr:foo
1.6 完整的配置文件
https://raw.githubusercontent.com/EnterpriseDB/repmgr/master/repmgr.conf.sample