PostgreSQL流复制设置

目前 PostgreSQL 中有两种类型的复制可用:流复制逻辑复制。如果您正在寻找为 PostgreSQL 13 设置流复制,这是您一直在寻找的页面。本教程将向您展示如何配置 PostgreSQL 复制以及如何快速设置数据库服务器。

流复制:https://www.postgresql.org/docs/current/high-availability.html

逻辑复制:https://www.postgresql.org/docs/current/logical-replication.html

PostgreSQL 复制:我们想要实现的目标

在我们开始配置 PostgreSQL 之前,先看看我们想要实现的目标是有意义的。本教程的目标是使用异步复制创建将主服务器数据复制到备用服务器。

以下是所需的设置:

整个设置将使用 CentOS 8.3 完成。RHEL(Redhat Enterprise Linux)上的过程预计是相同的。只需遵循相同的程序。

为了展示设置的工作原理,我们使用了两个具有以下 IP 的虚拟机:

  • 主:10.0.3.200(node1)

  • 备:10.0.3.201(node2)

让我们逐步准备这些系统。

安装 PostgreSQL

一旦你安装了 CentOS / RHEL,你就可以准备 PostgreSQL 本身的安装了。方法是访问PostgreSQL 网站并按照说明进行操作。以下脚本显示了事情是如何工作的。您可以简单地复制/粘贴脚本:

https://www.postgresql.org/download/linux/redhat/

    sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    sudo dnf -qy module disable postgresql
    sudo dnf install -y postgresql13-server

    # can be skipped on the 2nd node
    sudo /usr/pgsql-13/bin/postgresql-13-setup initdb
    sudo systemctl enable postgresql-13

    # can be skipped on the 2nd node
    sudo systemctl start postgresql-13

    让我们检查一下我们现在应该在 node1 上看到什么:

      [root@node1 ~]# ps axf | grep post
      5542 pts/1 S+ 0:00 \_ grep --color=auto post
      5215 ? Ss 0:00 /usr/pgsql-13/bin/postmaster -D /var/lib/pgsql/13/data/
      5217 ? Ss 0:00 \_ postgres: logger
      5219 ? Ss 0:00 \_ postgres: checkpointer
      5220 ? Ss 0:00 \_ postgres: background writer
      5221 ? Ss 0:00 \_ postgres: walwriter
      5222 ? Ss 0:00 \_ postgres: autovacuum launcher
      5223 ? Ss 0:00 \_ postgres: stats collector
      5224 ? Ss 0:00 \_ postgres: logical replication launcher

      在此过程之后,您应该拥有:

      • 已安装的二进制文件

      • 一个完全工作的节点1

        • 系统脚本设置

        • 数据库实例已初始化

      • 准备好的第二个节点(node2)

        • 安装的二进制文件

        • 系统脚本设置

      现在让我们继续下一步:禁用主节点上的防火墙。

        [root@node1 ~]# systemctl disable firewalld
        Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
        Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
        [root@node1 ~]# systemctl stop firewalld

        为什么这是必要的?副本将在端口 5432 上连接到主服务器。如果防火墙仍然处于活动状态,则副本将无法访问端口 5432。在我们的示例中,防火墙将完全禁用以方便连接。在更安全的设置中,您可能希望以更精确的方式执行此操作。

        配置主副本以进行复制

        我们必须在主服务器上做四件事:

        • 在中启用网络(绑定地址) postgresql.conf

        • 创建复制用户(最佳实践,但不是强制性的)

        • 允许远程访问 pg_hba.conf

        • 重启主服务器

        我们可以逐步执行这些操作。

        首先是改变postgresql.conf
        。该文件可以在/var/lib/pgsql/13/data/postgresql.conf
        . 但是,如果您不知道在哪里可以找到postgresql.conf
        您可以要求 PostgreSQL 本身将您指向配置文件。下面是它的工作原理:

          [root@node1 ~]# su - postgres
          [postgres@node1 ~]$ psql postgres
          psql (13.2)
          Type "help" for help.

          postgres=# SHOW config_file;
          config_file
          ----------------------------------------
          /var/lib/pgsql/13/data/postgresql.conf
          (1 row)

          必须更改以下参数postgresql.conf

            listen_addresses = '*'

            是什么listen_addresses
            ?默认情况下,PostgreSQL 只监听 localhost。出于安全原因,默认情况下不允许远程访问。因此,我们也必须教 PostgreSQL 监听远程请求。换句话说:listen_addresses
            定义我们的数据库服务的绑定地址。没有它,远程访问是不可能的(即使您pg_hba.conf
            稍后更改)。

            然后我们已经可以在数据库中创建用户了:

              postgres=# CREATE USER repuser REPLICATION;
              CREATE ROLE

              当然,您也可以设置密码。这里重要的是用户REPLICATION
              设置了标志。基本思想是避免使用超级用户将事务日志从主服务器流式传输到副本服务器。

              接下来我们可以做的是更改pg_hba.conf
              ,它控制谁可以从哪个 IP 连接到 PostgreSQL。请将以下行添加到配置文件中:

                host replication repuser 10.0.3.201/32 trust

                我们希望允许repuser
                来自10.0.3.201
                主服务器的登录和流式传输事务日志。请记住,这10.0.3.200
                是我们设置中的主要内容,并且10.0.3.201
                是副本。

                最后,我们可以重新启动主节点,因为我们已经更改listen_addresses
                postgresql.conf
                . 如果您只更改pg_hba.conf
                重新加载就足够了:

                  [postgres@node1 ~]$ exit
                  logout
                  [root@node1 ~]# systemctl restart postgresql-13

                  您的系统现已准备就绪,我们可以将注意力集中在备上。

                  创建基础备份

                  下一步是创建副本。我们需要做很多事情来完成这项工作。首先要确保副本已停止并且数据目录为空。让我们首先确保服务已停止:

                    [root@node2 ~]# systemctl stop postgresql-13

                    然后,我们需要确保数据目录为空:

                      [root@node2 ~]# cd /var/lib/pgsql/13/data/
                      [root@node2 data]# ls
                      PG_VERSION global pg_dynshmem pg_logical pg_replslot pg_stat pg_tblspc pg_xact postmaster.opts
                      base log pg_hba.conf pg_multixact pg_serial pg_stat_tmp pg_twophase postgresql.auto.conf
                      current_logfiles pg_commit_ts pg_ident.conf pg_notify pg_snapshots pg_subtrans pg_wal postgresql.conf
                      [root@node2 data]# rm -rf *

                      initdb
                      请注意,如果您在安装过程中跳过了此步骤,则无需执行此步骤。但是,如果您想将现有服务器变为副本,则必须这样做。

                        [root@node2 data]# su postgres
                        bash-4.4$ pwd
                        /var/lib/pgsql/13/data
                        bash-4.4$ pg_basebackup -h 10.0.3.200 -U repuser --checkpoint=fast \
                        -D /var/lib/pgsql/13/data/ -R --slot=some_name -C

                        pg_basebackup
                        将连接到主服务器并简单地复制所有数据文件。连接必须为repuser
                        . 为了确保复制过程立即开始,告诉 PostgreSQL 快速检查点是有意义的。该-D
                        标志定义了我们要在副本上存储数据的目标目录。这-R
                        flag 自动配置我们的副本以进行复制。不需要在辅助服务器上进行更多配置。最后,我们创建了一个复制槽。PostgreSQL 中复制槽的用途是什么?基本上,主服务器能够回收 WAL——如果主服务器不再需要它的话。但是如果副本还没有消费呢?在这种情况下,副本将失败,除非有一个复制槽确保主节点只有在副本完全消耗 WAL 时才能回收它。我们 CYBERTEC 建议在最常见的情况下使用复制槽。

                        让我们弄清楚做了什么pg_basebackup

                          bash-4.4$ ls -l
                          total 196
                          -rw-------. 1 postgres postgres 3 Feb 12 09:12 PG_VERSION
                          -rw-------. 1 postgres postgres 224 Feb 12 09:12 backup_label
                          -rw-------. 1 postgres postgres 135413 Feb 12 09:12 backup_manifest
                          drwx------. 5 postgres postgres 41 Feb 12 09:12 base
                          -rw-------. 1 postgres postgres 30 Feb 12 09:12 current_logfiles
                          drwx------. 2 postgres postgres 4096 Feb 12 09:12 global
                          drwx------. 2 postgres postgres 32 Feb 12 09:12 log
                          drwx------. 2 postgres postgres 6 Feb 12 09:12 pg_commit_ts
                          drwx------. 2 postgres postgres 6 Feb 12 09:12 pg_dynshmem
                          -rw-------. 1 postgres postgres 4598 Feb 12 09:12 pg_hba.conf
                          -rw-------. 1 postgres postgres 1636 Feb 12 09:12 pg_ident.conf
                          drwx------. 4 postgres postgres 68 Feb 12 09:12 pg_logical
                          drwx------. 4 postgres postgres 36 Feb 12 09:12 pg_multixact
                          drwx------. 2 postgres postgres 6 Feb 12 09:12 pg_notify
                          drwx------. 2 postgres postgres 6 Feb 12 09:12 pg_replslot
                          drwx------. 2 postgres postgres 6 Feb 12 09:12 pg_serial
                          drwx------. 2 postgres postgres 6 Feb 12 09:12 pg_snapshots
                          drwx------. 2 postgres postgres 6 Feb 12 09:12 pg_stat
                          drwx------. 2 postgres postgres 6 Feb 12 09:12 pg_stat_tmp
                          drwx------. 2 postgres postgres 6 Feb 12 09:12 pg_subtrans
                          drwx------. 2 postgres postgres 6 Feb 12 09:12 pg_tblspc
                          drwx------. 2 postgres postgres 6 Feb 12 09:12 pg_twophase
                          drwx------. 3 postgres postgres 60 Feb 12 09:12 pg_wal
                          drwx------. 2 postgres postgres 18 Feb 12 09:12 pg_xact
                          -rw-------. 1 postgres postgres 335 Feb 12 09:12 postgresql.auto.conf
                          -rw-------. 1 postgres postgres 28014 Feb 12 09:12 postgresql.conf
                          -rw-------. 1 postgres postgres 0 Feb 12 09:12 standby.signal

                          pg_basebackup
                          已经复制了所有内容。然而,还有更多。已经创建了standby.signal 文件,它告诉备它确实是一个副本

                          最后,工具调整了postgresql.auto.conf
                          文件,该文件恰好包含使副本连接到主服务器(node1)上的副本所需的所有配置:

                            bash-4.4$ cat postgresql.auto.conf
                            # Do not edit this file manually!
                            # It will be overwritten by the ALTER SYSTEM command.
                            primary_conninfo = 'user=repuser passfile=''/var/lib/pgsql/.pgpass'' channel_binding=prefer host=10.0.3.200 port=5432 sslmode=prefer sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
                            primary_slot_name = 'some_name'

                            我们完成了,可以继续启动备。

                            启动副本

                            我们已准备好使用以下命令启动备systemctl

                              bash-4.4$ exit
                              exit
                              [root@node2 data]# systemctl start postgresql-13
                              [root@node2 data]# ps axf | grep post
                              36394 pts/1 S+ 0:00 \_ grep --color=auto post
                              36384 ? Ss 0:00 /usr/pgsql-13/bin/postmaster -D /var/lib/pgsql/13/data/
                              36386 ? Ss 0:00 \_ postgres: logger
                              36387 ? Ss 0:00 \_ postgres: startup recovering 000000010000000000000007
                              36388 ? Ss 0:00 \_ postgres: checkpointer
                              36389 ? Ss 0:00 \_ postgres: background writer
                              36390 ? Ss 0:00 \_ postgres: stats collector
                              36391 ? Ss 0:00 \_ postgres: walreceiver streaming 0/7000148

                              检查进程是否确实在运行是个好主意。检查walreceiver
                              进程是否存在尤为重要。walreceiver
                              负责从主节点获取 WAL。如果它不存在,则您的设置失败。还要确保该服务已启用。

                              检查您的 PostgreSQL 复制设置

                              设置完成后,查看监控是有意义的。一般来说,使用pgwatch2 之类的工具来专业地监控您的数据库是有意义的。

                              https://www.cybertec-postgresql.com/en/products/pgwatch/

                              让我们首先检查主节点:

                                [root@node1 ~]# su - postgres
                                [postgres@node1 ~]$ psql postgres
                                psql (13.2)
                                Type "help" for help.

                                postgres=# \x
                                Expanded display is on.
                                postgres=# SELECT * FROM pg_stat_replication ;
                                -[ RECORD 1 ]----+------------------------------
                                pid | 6102
                                usesysid | 16385
                                usename | repuser
                                application_name | walreceiver
                                client_addr | 10.0.3.201
                                client_hostname |
                                client_port | 34002
                                backend_start | 2021-02-12 09:27:59.53724-05
                                backend_xmin |
                                state | streaming
                                sent_lsn | 0/7000148
                                write_lsn | 0/7000148
                                flush_lsn | 0/7000148
                                replay_lsn | 0/7000148
                                write_lag |
                                flush_lag |
                                replay_lag |
                                sync_priority | 0
                                sync_state | async
                                reply_time | 2021-02-12 09:29:49.783076-05

                                pg_stat_replication
                                存在的一行数据告诉我们 WAL 正在从主要流向备。

                                但是,我们也可以对备进行检查:

                                  [root@node2 data]# su - postgres
                                  [postgres@node2 ~]$ psql postgres
                                  psql (13.2)
                                  Type "help" for help.

                                  postgres=# \x
                                  Expanded display is on.
                                  postgres=# SELECT * FROM pg_stat_wal_receiver;
                                  -[ RECORD 1 ]---------+--------------------------------------------
                                  pid | 36391
                                  status | streaming
                                  receive_start_lsn | 0/7000000
                                  receive_start_tli | 1
                                  written_lsn | 0/7000148
                                  flushed_lsn | 0/7000148
                                  received_tli | 1
                                  last_msg_send_time | 2021-02-12 09:29:59.683418-05
                                  last_msg_receipt_time | 2021-02-12 09:29:59.674194-05
                                  latest_end_lsn | 0/7000148
                                  latest_end_time | 2021-02-12 09:27:59.556631-05
                                  slot_name | some_name
                                  sender_host | 10.0.3.200
                                  sender_port | 5432
                                  conninfo | user=repuser
                                  passfile=/var/lib/pgsql/.pgpass
                                  channel_binding=prefer
                                  dbname=replication
                                  host=10.0.3.200
                                  port=5432
                                  fallback_application_name=walreceiver
                                  sslmode=prefer
                                  sslcompression=0
                                  ssl_min_protocol_version=TLSv1.2
                                  gssencmode=prefer
                                  krbsrvname=postgres
                                  target_session_attrs=any

                                  pg_stat_wal_receiver
                                  中一行数据表明 WAL 接收器确实存在,并且数据正在流动。

                                  到此为止!我希望你喜欢这个教程。有关在同步和异步复制之间进行选择的更多信息,请查看此页面。https://www.cybertec-postgresql.com/en/services/postgresql-replication/synchronous-asynchronous-replication/


                                  免责声明:

                                  1、本站资源由自动抓取工具收集整理于网络。

                                  2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。

                                  3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。

                                  4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。

                                  5、如果您喜欢本资源,请您支持作者,购买正版内容。

                                  6、资源失效,请下方留言,欢迎分享资源链接

                                  文章评论

                                  0条评论