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

PostgreSQL运维—repmgr基础

原创 李先生 2023-09-12
2842

PostgreSQL运维—repmgr基础


说明:

适用于 PostgreSQL 9.4 - PostgreSQL 15 的repmgr 5.4.1 的基础文档。

repmgr正在不断开发中,我们强烈建议使用最新版本。

1. repmgr概述

1.1. 概念

以下术语在整个repmgr文档中使用。

  • replication cluster(复制集群)

    在repmgr文档中,“复制集群”是指通过流复制连接的 PostgreSQL 服务器网络。

  • node

    节点是复制集群中的单个 PostgreSQL 服务器。

  • upstream node(上游节点)

    备用服务器连接到的节点,以便接收流复制。这是主服务器,或者在级联复制的情况下是另一个备用服务器。

  • failover

    如果主服务器出现故障,并且将合适的备用服务器升级为新的主服务器,则会执行此操作。repmgrd守护程序支持自动故障切换,以最大限度地减少停机时间。

  • switchover

    在某些情况下,例如硬件或操作系统维护,需要使主服务器脱机;在这种情况下,需要进行受控切换,从而提升合适的备用数据库并以受控方式从复制集群中删除现有的主数据库。repmgr命令行客户端提供此功能 。

    在某些情况下,例如硬件或操作系统维护,有必要使主服务器离线;在这种情况下,需要进行受控切换,从而提升合适的备用数据库,并以受控的方式从复制集群中删除现有的主服务器。repmgr命令行客户端提供了此功能。

  • fencing

    在故障切换情况下,在提升新的备用数据库后,之前的主数据库不会意外恢复正常而重新上线,这将导致脑裂情况,这一点很重要。为了防止这种情况,故障的主节点应该与应用程序隔离,即“隔离”。

  • witness

    repmgr提供了设置所谓的“见证服务器”的功能,以帮助确定具有多个备用服务器的故障转移情况下的新主服务器。见证服务器本身不是复制集群的一部分,尽管它确实包含 repmgr 元数据模式的副本。见证服务器的目的是提供“投票”,其中复制集群中的服务器被拆分到多个位置。如果位置之间的连接丢失,见证服务器的存在与否将决定该位置的服务器是否被提升为主服务器;这是为了防止出现“脑裂”情况,在这种情况下,隔离位置将网络中断解释为(远程)主节点故障并促进(本地)备用节点。只有在使用repmgrd 时才需要创建见证服务器 。

1.2. 组件

repmgr是一套开源工具,用于管理PostgreSQL服务器集群中的复制和故障切换。它支持并增强了PostgreSQL内置的流复制,该复制提供了一个读/写主服务器和一个或多个只读备用服务器,其中包含主服务器数据库的近实时副本。它提供了两个主要工具:

repmgr

一种命令行工具,用于执行管理任务,例如:

  • 设置备用服务器

  • 将备用服务器升级为主服务器

  • 切换主服务器和备用服务器

  • 显示复制群集中服务器的状态

repmgrd

主动监视复制群集中的服务器并执行以下任务的守护程序:

  • 监视和记录复制性能

  • 通过检测主服务器的故障并升级最合适的备用服务器来执行故障切换

  • 向用户定义的脚本提供有关群集中事件的通知,该脚本可以执行任务,例如通过电子邮件发送警报

1.3. repmgr用户与元数据

为了有效地管理复制集群,repmgr需要将集群中服务器的信息存储在专用数据库模式中。此架构由repmgr扩展自动创建,该扩展在初始化repmgr管理的集群(repmgr primary register)的第一步期间安装,并包含以下对象:

tables

  • repmgr.events:记录关注的事件
  • repmgr.nodes:复制群集中每个服务器的连接和状态信息
  • repmgr.monitoring_history:repmgrd写入的历史待机监控信息

views

  • repmgr.show_nodes:基于repmgr.nodes表,另外显示服务器上游节点的名称
  • repmgr.replication_status:启用repmgrd的监视时,显示每个备用的当前监视状态。

repmgr元数据模式可以存储在现有数据库中,也可以存储在其自己的专用数据库中。请注意,repmgr元数据架构不能存储在不属于repmgr管理的复制集群的数据库服务器上。

repmgr必须有数据库用户才能访问此数据库并执行必要的更改。该用户不需要是超级用户,但是一些操作(如repmgr扩展的初始安装)将需要超级用户连接(可以在需要时使用命令行选项–superuser指定)。

2. repmgr安装

repmgr可以从二进制包安装、系统包安装,或是源代码编译安装。通常,我们建议使用二进制包。

源代码安装主要是用于跟踪最新的repmgr使用。但如果某些的操作系统还没有软件包,那么也只能选择源代码安装。

2.1. 安装repmgr的要求

repmgr是在Linux和OS X上开发和测试的,但应该在PostgreSQL本身支持的任何类似UNIX的系统上工作。但不支持Windows。
repmgr 5.4.1兼容自9.4以后的所有版本的PostgreSQL。

注意:

我们强烈建议复制群集中的所有节点上都必须安装相同的(最好是最新的)repmgr版本(例如5.4.1.x)以最大限度地降低不兼容的风险。
如果在不同的节点上安装了不同的repmgr版本(例如4.1.x和5.4.1.x),repmgr(特别是repmgrd)将不会运行。甚至,会损坏集群。

2.1.1.repmgr兼容性矩阵

下表概述了repmgr版本与PostgreSQL版本的兼容支持情况:

repmgr兼容性矩阵

repmgr version Supported? Latest release Supported PostgreSQL versions
repmgr 5.4 (dev) 5.4.1 (2023-07-04) 9.4, 9.5, 9.6, 10, 11, 12, 13, 15
repmgr 5.3 YES 5.4.1 (2023-07-04) 9.4, 9.5, 9.6, 10, 11, 12, 13, 15
repmgr 5.2 NO 5.2.1 (2020-12-07) 9.4, 9.5, 9.6, 10, 11, 12, 13
repmgr 5.1 NO 5.1.0 (2020-04-13) 9.3, 9.4, 9.5, 9.6, 10, 11, 12
repmgr 5.0 NO 5.0 (2019-10-15) 9.3, 9.4, 9.5, 9.6, 10, 11, 12
repmgr 4.x NO 4.4 (2019-06-27) 9.3, 9.4, 9.5, 9.6, 10, 11
repmgr 3.x NO 3.3.2 (2017-05-30) 9.3, 9.4, 9.5, 9.6
repmgr 2.x NO 2.0.3 (2015-04-16) 9.0, 9.1, 9.2, 9.3, 9.4

注意:
repmgr 2.x和3.x系列不再得到维护或支持。我们强烈建议升级到最新的repmgr版本。
在repmgr 5.0发布之后,将不再发布repmgr 4.x系列。请注意,repmgr5.x是4.x系列的增量开发,repmgr 4.x用户应该尽快升级到这个版本。

2.1.2.PostgreSQL 9.4支持

一些repmgr功能在PostgreSQL 9.4中不可用

  • 在PostgreSQL 9.4中,pg_rewind不是核心发行版的一部分。pg_rewind需要单独编译才能使用任何利用它的repmgr功能。

警告:
PostgreSQL 9.3的社区支持期已经结束(最终版本为2018年11月的9.3.25),将不再进行安全或错误修复更新。
从repmgr 5.2开始,repmgr不再支持PostgreSQL 9.3。
PostgreSQL 9.4的社区支持期已经结束(最终版本为2020年2月的9.4.26),将不再进行安全或错误修复更新。
我们建议这些版本的用户尽快迁移到支持的PostgreSQL版本。

2.2. rpm安装repmgr

我们建议使用适用于您系统的可用软件包安装repmgr。

2.2.1. RedHat/CentOS/Fedora

RedHat/CentOS和Fedora 的 repmgr RPM软件包可从EDB公共存储库获得;

目前,EDB公共存储库支持RedHat/CentOS 6/7/8 版本。

repmgr 的 RPM 软件包也可通过 Yum 通过 PostgreSQL Global Development Group(PGDG)RPM存储库获得(https://yum.postgresql.org/)。按照其中详述的发行版(RedHat、CentOS、Fedora等)和体系结构的说明进行操作。请注意,新的repmgr包可能需要几天时间才能通过该存储库可用。

repmgr RPM包被设计为与社区提供的PostgreSQL包和EDB的PostgreSQL Extended Server兼容。它们可能无法与特定于供应商的软件包(如RedHat为RHEL客户提供的软件包)一起使用,因为PostgreSQL文件系统布局可能与社区RPM不同。

2.2.1.1. EDB public RPM yum 存储库

EDB为EDB软件(包括repmgr)提供专用的yum公共存储库。我们建议在所有未来的repmgr版本中使用此选项。

使用此存储库的一般说明可以在其主页上找到。安装repmgr的具体说明如下。

安装

  • 从以下列表中找到PostgreSQL版本的存储库RPM:https://dl.enterprisedb.com/

  • 为您的发行版和PostgreSQL版本安装存储库定义(这使EDB存储库成为repmgr包的源)。

​ 例如,对于Rocky Linux 8上的PostgreSQL 14,执行:

	curl https://dl.enterprisedb.com/default/release/get/14/rpm | sudo bash

​ 验证存储库是否安装了:

	sudo dnf repolist

​ 输出应包含如下两个条目:

	2ndquadrant-dl-default-release-pg14                  2ndQuadrant packages (PG14) for 8 - x86_64
	2ndquadrant-dl-default-release-pg14-debug            2ndQuadrant packages (PG14) for 8 - x86_64 - Debug
  • 安装适用于PostgreSQL版本的repmgr版本(例如repmgr14):

    sudo dnf install repmgr14
    

要确定可用包的名称,请执行:

dnf search repmgr

在CentOS 7和更早版本中,使用yum而不是dnf。

与PGDG存储库的兼容性

EDB repmgr yum存储库包使用与主PGDG存储库相同的定义和文件系统布局。

通常,yum将使用最新的repmgr版本对存储库进行优先级排序。一旦更新了PGDG存储库,安装程序包的存储库并不重要。

为了确保EDB存储库始终具有优先级,须在存储库配置文件中相应地设置优先级选项(例如/etc/yum.repos.d/2ndquadrant-dl-default-release-pg14.repo)。

对于CentOS 7和更早版本,必须安装包yum插件优先级才能设置存储库优先级。

安装特定的软件包版本

要安装特定的软件包版本,请为有问题的软件包执行dnf–showduplicates列表:

[root@localhost ~]# dnf --showduplicates list repmgr10
Last metadata expiration check: 0:09:15 ago on Fri 11 Mar 2022 01:09:19 AM UTC.
Installed Packages
repmgr10.x86_64                            5.3.1-1.el8                              @2ndquadrant-dl-default-release-pg10
Available Packages
repmgr10.x86_64                            5.0.0-1.rhel8                            pgdg10
repmgr10.x86_64                            5.1.0-1.el8                              2ndquadrant-dl-default-release-pg10
repmgr10.x86_64                            5.1.0-1.rhel8                            pgdg10
repmgr10.x86_64                            5.1.0-2.el8                              2ndquadrant-dl-default-release-pg10
repmgr10.x86_64                            5.2.0-1.el8                              2ndquadrant-dl-default-release-pg10
repmgr10.x86_64                            5.2.0-1.rhel8                            pgdg10
repmgr10.x86_64                            5.2.1-1.el8                              2ndquadrant-dl-default-release-pg10
repmgr10.x86_64                            5.3.0-1.el8                              2ndquadrant-dl-default-release-pg10
repmgr10.x86_64                            5.3.1-1.el8                              2ndquadrant-dl-default-release-pg10

然后用连字符将适当的版本号附加到包名称,例如:

[root@localhost ~]# dnf install repmgr10-5.3.0-1.el8

2.2.2.Debian/Ubuntu

repmgr的.deb包可以从PostgreSQL社区APT存储库中获得(https://apt.postgresql.org/)。说明可以在PostgreSQL Wiki的APT部分中找到(https://wiki.postgresql.org/wiki/Apt)。

有关软件包内容的更多信息,包括安装路径和相关服务命令的详细信息,请参阅附录部分Debian/Ubuntu软件包。

2.2.2.1.Debian/Ubuntu的EDB公共apt存储库

EDB为EDB软件(包括repmgr)提供了一个公共apt存储库。使用此存储库的一般说明可以在其主页上找到。

安装repmgr的具体说明如下。

安装

  • 通过执行以下操作,为您的发行版和PostgreSQL版本安装存储库定义(这将使EDB存储库成为repmgr包的源):
      curl https://dl.enterprisedb.com/default/release/get/deb | sudo bash

这将自动安装以下附加软件包(如果尚未提供):

  • lsb-release
  • apt-transport-https
  • 安装适用于PostgreSQL版本的repmgr版本(例如repmgr11):
      sudo apt-get install postgresql-11-repmgr

对于PostgreSQL 9.6和更早版本的软件包,软件包名称包括主版本号和次版本号之间的点,例如PostgreSQL-9.6-repmgr。

2.3. 源码安装repmgr

2.3.1.从源安装的前提条件

要安装repmgr的前提条件是必须安装编译PostgreSQL。大多数主流Linux发行版和其他UNIX变体提供了从软件包安装前提条件的简单方法。

  • Debian和Ubuntu:如果尚未将apt.postgresql.org存储库添加到sources.list中,请确保启用了源存储库。

提示:

如果未配置,则可以通过在存储库文件中包含deb src行作为现有deb行的副本来添加源存储库,该文件通常为/etc/apt/sources.list.d/pgdg.list,例如:

deb https://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main
deb-src https://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main

然后安装构建PostgreSQL的前提条件,例如:

       sudo apt-get update
       sudo apt-get build-dep postgresql-9.6

安装

为目标repmgr版本选择适当的PostgreSQL版本。

注意

如果无法使用“apt-get build-dep”,则可能需要手动安装以下软件包:

  • flex
  • libedit-dev
  • libkrb5-dev
  • libpam0g-dev
  • libreadline-dev
  • libselinux1-dev
  • libssl-dev
  • libxml2-dev
  • libxslt1-dev
  • RHEL或CentOS 6.x或7.x:从yum.postgresql.org为您的系统安装适当的存储库RPM。然后使用以下命令安装构建postgresql的前提条件:
       sudo yum check-update
       sudo yum groupinstall "Development Tools"
       sudo yum install yum-utils openjade docbook-dtds docbook-style-dsssl docbook-style-xsl
       sudo yum-builddep postgresql96

安装

为目标repmgr版本选择适当的PostgreSQL版本。

注意

如果无法使用yum-builddep,则可能需要手动安装以下软件包:

  • flex
  • libselinux-devel
  • libxml2-devel
  • libxslt-devel
  • openssl-devel
  • pam-devel
  • readline-devel

提示

如果根据配置了–with-llvm选项(PGDG提供的包就是这种情况)的PostgreSQL 11或更高版本进行构建,则还需要安装llvm-toolset-7-clang包。这可以通过软件集合(SCL)存储库获得。

2.3.2.获取repmgr源代码

有两种方法可以获得repmgr源代码:使用git,或者通过下载发布版本的tarballs。

2.3.2.1.使用git获取repmgr源

如果熟悉git、希望经常更新,希望跟踪开发,或者希望将更改贡献给repmgr,建议使用git。

repmgr的源代码维护在https://github.com/EnterpriseDB/repmgr.
每个repmgr版本也有标签,例如v4.4.0。
使用git克隆源代码:

     git clone https://github.com/EnterpriseDB/repmgr

2.3.2.2.下载发布源tarballs

官方发行版源代码作为tarballs上传到repmgr网站,以及tarball校验和和匹配的GnuPG签名。请参见http://repmgr.org/下载信息。

您需要下载repmgr源,例如repmgr-4.0.tar.gz。您可以选择验证.md5文件中的包校验和和/或根据验证数字签名验证GnuPG签名。

使用tar xf 解压缩源代码归档文件后,安装过程与从git克隆安装相同。

2.3.3.从源头安装repmgr

要从源安装repmgr,只需执行:

    ./configure && make install

确保目标PostgreSQL版本的pg_config位于$PATH中。

2.3.4.建立repmgr文档

repmgr文档(与主PostgreSQL项目一样)是以DocBook XML格式编写的。要在本地将其构建为HTML,您需要按照PostgreSQL文档中的描述安装所需的包。
用于构建repmgr文档的最低PostgreSQL版本是PostgreSQL 9.5。

注意

在repmgr 4.3及更早版本中,文档只能根据PostgreSQL 9.6或更早版本构建。

要将文档构建为HTML,请执行:

    ./configure && make doc

生成的HTML文件将放在源代码树的doc/HTML子目录中。
要将文档构建为单个HTML文件,请在如上所述配置和构建主repmgr源之后,执行:

     ./configure && make doc-repmgr.html

要将文档构建为PDF文件,请在如上所述配置和构建主repmgr源之后,执行:

     ./configure && make doc-repmgr-A4.pdf

3. repmgr配置

3.1. 使用repmgr设置基本复制集群的先决条件

环境描述:

节点 hostname IP addr 端口(双向互通)
primary server node1 192.168.60.191 5432
standby server node2 192.168.60.192 5432

两台服务器上都必须安装以下软件:

  • PostgreSQL
  • repmgr —— 匹配已安装的PostgreSQL主版本
  • 在网络级别,PostgreSQL端口(默认:5432)之间的连接必须可以双向进行。
  • 如果您希望repmgr复制位于PostgreSQL数据目录之外的配置文件,或测试切换功能,则还需要两个服务器之间的无密码SSH连接,并且应安装rsync。

为了测试repmgr,可以使用在同一台计算机上的不同端口上运行的多个PostgreSQL实例,并启用对localhost的无密码SSH访问。

3.2. PostgreSQL 配置

在主服务器上,必须初始化并运行PostgreSQL实例。可能需要调整以下复制设置:

    # Enable replication connections; set this value to at least one more
    # than the number of standbys which will connect to this server
    # (note that repmgr will execute "pg_basebackup" in WAL streaming mode,
    # which requires two free WAL senders).
    #
    # See: https://www.postgresql.org/docs/current/runtime-config-replication.html#GUC-MAX-WAL-SENDERS

    max_wal_senders = 10

    # If using replication slots, set this value to at least one more
    # than the number of standbys which will connect to this server.
    # Note that repmgr will only make use of replication slots if
    # "use_replication_slots" is set to "true" in "repmgr.conf".
    # (If you are not intending to use replication slots, this value
    # can be set to "0").
    #
    # See: https://www.postgresql.org/docs/current/runtime-config-replication.html#GUC-MAX-REPLICATION-SLOTS

    max_replication_slots = 10

    # Ensure WAL files contain enough information to enable read-only queries
    # on the standby.
    #
    #  PostgreSQL 9.5 and earlier: one of 'hot_standby' or 'logical'
    #  PostgreSQL 9.6 and later: one of 'replica' or 'logical'
    #    ('hot_standby' will still be accepted as an alias for 'replica')
    #
    # See: https://www.postgresql.org/docs/current/runtime-config-wal.html#GUC-WAL-LEVEL

    wal_level = 'hot_standby'

    # Enable read-only queries on a standby
    # (Note: this will be ignored on a primary but we recommend including
    # it anyway, in case the primary later becomes a standby)
    #
    # See: https://www.postgresql.org/docs/current/runtime-config-replication.html#GUC-HOT-STANDBY

    hot_standby = on

    # Enable WAL file archiving
    #
    # See: https://www.postgresql.org/docs/current/runtime-config-wal.html#GUC-ARCHIVE-MODE

    archive_mode = on

    # Set archive command to a dummy command; this can later be changed without
    # needing to restart the PostgreSQL instance.
    #
    # See: https://www.postgresql.org/docs/current/runtime-config-wal.html#GUC-ARCHIVE-COMMAND

    archive_command = '/bin/true'
  

不要在默认的postgresql.conf文件中编辑这些设置,而是创建一个单独的文件,如postgresql.replication.conf,并从主配置文件的末尾将其包含为:

include “postgressql.replication.conf”。

此外,如果您打算使用pg_rewind,并且集群不是使用数据校验和初始化的,则可能需要考虑启用wal_log_hints。

3.3. 创建repmgr用户和数据库

为repmgr元数据创建专用的PostgreSQL超级用户帐户和数据库,例如。

   createuser -s repmgr
   createdb repmgr -O repmgr

对于本文档中的示例,名称repmgr将同时用于用户和数据库,但可以使用任何名称。

注意:

为了简单起见,repmgr用户被创建为超级用户。如果需要,可以将repmgr用户创建为普通用户。然而,对于某些操作,需要超级用户权限;在这种情况下,可以提供命令行选项–superuser来指定超级用户。
还假设repmgr用户将用于建立从备用到主的复制连接;同样,这可以通过在注册每个节点时指定单独的复制用户来覆盖。

提示:

repmgr将安装repmgr扩展,该扩展创建一个repmgr模式,其中包含repmgr的元数据表以及其他函数和视图。我们还建议您将repmgr用户的搜索路径设置为包括该模式名称,例如。

    ALTER USER repmgr SET search_path TO repmgr, "$user", public;

3.4. 在 pg_hba.conf 中配置身份验证

确保repmgr用户在pg_hba.conf中具有适当的权限,并且可以以复制模式连接;pg_hba.conf应包含类似于以下内容的条目:

    local   replication   repmgr                              trust
    host    replication   repmgr      127.0.0.1/32            trust
    host    replication   repmgr      192.168.1.0/24          trust

    local   repmgr        repmgr                              trust
    host    repmgr        repmgr      127.0.0.1/32            trust
    host    repmgr        repmgr      192.168.1.0/24          trust
  

请注意,这些是用于测试的简单设置。根据您的网络环境和身份验证要求进行调整。

3.5. 准备standby

在备用服务器上,不要创建PostgreSQL实例(即,不要执行initdb或包提供的任何数据库创建脚本),但请确保目标数据目录(以及希望PostgreSQL使用的任何其他目录)存在,并且归postgres系统用户所有。权限必须设置为0700(drwx-------)。

提示:

repmgr将在该目录中放置主数据库文件的副本。然而,如果已经在那里创建了PostgreSQL实例,它将拒绝运行。

使用psql检查主数据库是否可以从备用数据库访问:

    psql 'host=node1 user=repmgr dbname=repmgr connect_timeout=2'

注意:

repmgr始终将连接信息存储为libpq连接字符串。本文档将它们称为conninfo字符串;另一个名称是DSN(数据源名称)。我们将使用这些语法来代替-h主机名-d数据库名-U用户名语法。

3.6. repmgr 配置文件

在主服务器上创建repmgr.conf文件。文件必须至少包含以下参数:

    node_id=1
    node_name='node1'
    conninfo='host=node1 user=repmgr dbname=repmgr connect_timeout=2'
    data_directory='/var/lib/postgresql/data'
  

repmgr.conf不应存储在PostgreSQL数据目录中,因为在设置或重新初始化PostgreSQLServer时,它可能会被覆盖。有关repmgr.conf的更多详细信息,请参阅配置和配置文件部分。

注意:

repmgr仅在直接执行PostgreSQL二进制文件时使用pg_binder。
对于用户定义的脚本,如promote_command和各种service_*_commands,必须始终显式提供要执行的二进制文件或脚本的完整路径,即使它是repmgr本身。
这是因为这些选项可以在任意位置包含用户定义的脚本,因此在前面添加pg_binder可能会破坏它们。

提示:

对于基于Debian的发行版,我们建议将pg_bindir显式设置为pg_ctl和其他不在标准路径中的二进制文件所在的目录。对于PostgreSQL 9.6,这将是/usr/lib/PostgreSQL/9.6/bin/。

如果您的发行版将repmgr二进制文件放在PostgreSQL安装目录以外的位置,请使用repmgr_bindir指定该位置,以使repmgr能够在其他节点上执行操作(例如,repmgr集群交叉检查)。

3.7. 注册primary 服务器

要使repmgr支持复制集群,必须向repmgr注册主节点。这将安装repmgr扩展和元数据对象,并为主服务器添加元数据记录:

    $ repmgr -f /etc/repmgr.conf primary register
    INFO: connecting to primary database...
    NOTICE: attempting to install extension "repmgr"
    NOTICE: "repmgr" extension successfully installed
    NOTICE: primary node record (id: 1) registered

如下所示验证集群的状态:

   $ repmgr -f /etc/repmgr.conf cluster show
     ID | Name  | Role    | Status    | Upstream | Connection string
    ----+-------+---------+-----------+----------+--------------------------------------------------------
     1  | node1 | primary | * running |          | host=node1 dbname=repmgr user=repmgr connect_timeout=2
  

repmgr元数据表中的记录如下所示:

    repmgr=# SELECT * FROM repmgr.nodes;
    -[ RECORD 1 ]----+-------------------------------------------------------
    node_id          | 1
    upstream_node_id |
    active           | t
    node_name        | node1
    type             | primary
    location         | default
    priority         | 100
    conninfo         | host=node1 dbname=repmgr user=repmgr connect_timeout=2
    repluser         | repmgr
    slot_name        |
    config_file      | /etc/repmgr.conf

复制群集中的每个服务器都有自己的记录。如果正在使用repmgrd,则当节点的状态或角色更改时,字段upstream_node_id、active和type将更新。

3.8. 克隆standby服务器

在备用服务器上创建repmgr.conf文件。它必须至少包含与主服务器的repmgr.conf相同的参数,但必须相应调整强制值node、node_name、conninfo(可能还有data_directory),例如:

    node_id=2
    node_name='node2'
    conninfo='host=node2 user=repmgr dbname=repmgr connect_timeout=2'
    data_directory='/var/lib/postgresql/data'

使用–dry run选项检查是否可以克隆备用:

    $ repmgr -h node1 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone --dry-run
    NOTICE: using provided configuration file "/etc/repmgr.conf"
    NOTICE: destination directory "/var/lib/postgresql/data" provided
    INFO: connecting to source node
    NOTICE: checking for available walsenders on source node (2 required)
    INFO: sufficient walsenders available on source node (2 required)
    NOTICE: standby will attach to upstream node 1
    HINT: consider using the -c/--fast-checkpoint option
    INFO: all prerequisites for "standby clone" are met

如果没有报告问题,则可以使用以下命令克隆备用:

    $ repmgr -h node1 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone

    NOTICE: using configuration file "/etc/repmgr.conf"
    NOTICE: destination directory "/var/lib/postgresql/data" provided
    INFO: connecting to source node
    NOTICE: checking for available walsenders on source node (2 required)
    INFO: sufficient walsenders available on source node (2 required)
    INFO: creating directory "/var/lib/postgresql/data"...
    NOTICE: starting backup (using pg_basebackup)...
    HINT: this may take some time; consider using the -c/--fast-checkpoint option
    INFO: executing:
      pg_basebackup -l "repmgr base backup" -D /var/lib/postgresql/data -h node1 -U repmgr -X stream
    NOTICE: standby clone (using pg_basebackup) complete
    NOTICE: you can now start your PostgreSQL server
    HINT: for example: pg_ctl -D /var/lib/postgresql/data start
  

这已经使用PostgreSQL的pg_basebackup实用程序从主节点1克隆了PostgreSQLdata目录文件。包含用于从此主服务器开始流式处理的正确参数的复制配置将自动附加到postgresql.auto.conf.(在postgresql 11和更早版本中,将创建文件recovery.conf)。

注意:

默认情况下,主数据目录中的任何配置文件都将复制到备用目录。通常,它们是postgresql.conf、postgresql.auto.conf、pg_hba.conf和pg_ident.conf。这些可能需要在启动备用之前进行修改。

现在对备用服务器的PostgreSQL配置文件进行任何调整,然后启动服务器。

3.9. 验证复制是否正常运行

连接到主服务器并执行:

    repmgr=# SELECT * FROM pg_stat_replication;
    -[ RECORD 1 ]----+------------------------------
    pid              | 19111
    usesysid         | 16384
    usename          | repmgr
    application_name | node2
    client_addr      | 192.168.60.192
    client_hostname  |
    client_port      | 50378
    backend_start    | 2017-08-28 15:14:19.851581+09
    backend_xmin     |
    state            | streaming
    sent_location    | 0/7000318
    write_location   | 0/7000318
    flush_location   | 0/7000318
    replay_location  | 0/7000318
    sync_priority    | 0
    sync_state       | async

这表明以前克隆的备用(字段application_name中显示的节点2)已从IP地址192.168.60.192连接到主节点。
在PostgreSQL 9.6中,还可以使用视图pg_stat_wal_receiver检查备用服务器的复制状态。

    repmgr=# SELECT * FROM pg_stat_wal_receiver;
    Expanded display is on.
    -[ RECORD 1 ]---------+--------------------------------------------------------------------------------
    pid                   | 18236
    status                | streaming
    receive_start_lsn     | 0/3000000
    receive_start_tli     | 1
    received_lsn          | 0/7000538
    received_tli          | 1
    last_msg_send_time    | 2017-08-28 15:21:26.465728+09
    last_msg_receipt_time | 2017-08-28 15:21:26.465774+09
    latest_end_lsn        | 0/7000538
    latest_end_time       | 2017-08-28 15:20:56.418735+09
    slot_name             |
    sender_host           | node1
    sender_port           | 5432
    conninfo              | user=repmgr dbname=replication host=node1 application_name=node2

请注意,conninfo值是在postgresql.auto.conf(postgresql 11和更早版本:recovery.conf)中生成的,与repmgr.conf中设置的主节点的conninfo-除其他外,它将包含连接节点的名称application_name。

3.10. 注册standby

将备用服务器注册到:

    $ repmgr -f /etc/repmgr.conf standby register
    NOTICE: standby node "node2" (ID: 2) successfully registered

通过在备用服务器上执行repmgr cluster show来检查节点是否已注册:

      $ repmgr -f /etc/repmgr.conf cluster show

     ID | Name  | Role    | Status    | Upstream | Location | Priority | Timeline | Connection string
    ----+-------+---------+-----------+----------+----------+----------+----------+--------------------------------------
     1  | node1 | primary | * running |          | default  | 100      | 1        | host=node1 dbname=repmgr user=repmgr
     2  | node2 | standby |   running | node1    | default  | 100      | 1        | host=node2 dbname=repmgr user=repmgr

这两个节点现在都已向repmgr注册,并且记录已复制到备用服务器。

参考文档

参考:https://www.repmgr.org/docs/current/index.html

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论