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

流复备机断档处理

瀚高PG实验室 2025-06-25
133
症状
HGDB流复制环境,备库与主库数据不一致 数据库报错日志如下:
    2024-05-28 14:17:18.707 CST,,,7820,,665576ee.1e8c,1,,2024-05-28 14:17:18 CST,,0,日志,00000,"在时间点: 0/BA000000 (时间安排6)启动日志的流操作",,,,,,,,,""
    2024-05-28 14:17:18.707 CST,,,7820,,665576ee.1e8c,2,,2024-05-28 14:17:18 CST,,0,致命错误,XX000,"无法从WAL流中获得数据: 错误:  所要求的WAL段0000000600000000000000BA已经被删除",,,,,,,,
    (左右滑动查看完整内容)
    问题原因
    数据库备节点所需wal日志已被删除,导致备节点接收不到相应日志,流复制断连
    解决方案

    流复制集群出现主备数据库因断档导致数据不同步的问题,均可使用以下第一种方式解决,此解决方法若是数据量较大的情况下要选择在夜间业务不繁忙时重做备库,因为重做过程可能会对资源占用较大,对数据库运行有一定影响。第二种方法适用于备库所需wal日志已被删除,但归档还在的情况,优先使用此种方式解决,两种方案的具体解决步骤如下所示:

    一、主节点没有归档的情况

    主备断档时间较久,备库需要的wal日志,或者归档日志已经被删除;

    此情况只能选择使用pg_basebackup重做备库,示例步骤如下:

    示例环境:


    IP
    数据目录
    主节点
    x.x.2.49
    /data/highgo/data
    备节点
    x.x.2.50
    /data/highgo/data
    1.停掉备节点数据库
      [root@HGDB-458 highgo]# pg_ctl stop
      2.重命名备节点data目录
        [root@HGDB-458 highgo]# mv /data/highgo/data data/highgo/databak
        (左右滑动查看完整内容)
        3.备节点使用pg_basebackup重新同步数据目录
          [root@HGDB-458 highgo]# pg_basebackup -h x.x.2.49 -p 5866 -U sysdba -D /data/highgo/data -Fp -P -Xs -R -v 
          (左右滑动查看完整内容)
          4.创建复制槽

          创建复制槽可以确保主从数据库之间的数据一致性。主数据库产生的 WAL 日志在从数据库处理之前不会被删除,但若出现备节点异常宕机或断档情况会导使主节点wal日志累积严重会导致磁盘爆满,需要权衡其优缺点,并根据具体情况来选择是否使用,具体配置步骤如下:

          主节点:

            [root@HGDB-458 highgo]# psql highgo sysdba
            highgo=select * from pg_create_physical_replication_slot('node_1');
            highgo=select * from pg_replication_slots;          # 检查是否创建成功
            (左右滑动查看完整内容)

            备节点:

            修改postgresql.auto.conf配置文件,添加复制槽相关配置:

              vim /data/highgo/data/postgresql.auto.conf
              ## 添加以下参数值
              primary_slot_name = 'node_1'
              5.启动备节点数据库,检查流复制状态
                [root@HGDB-458 highgo]# pg_ctl start
                [root@HGDB-458 highgo]# psql -d highgo -U sysdba
                highgo=select * from pg_stat_replication ;
                 pid  | usesysid | usename | application_name | client_addr  | client_hostname | client_port |         backend_start         | backend_xmin |   state   |  sent_lsn  | write_lsn  | fl
                ush_lsn  | replay_lsn |    write_lag    |    flush_lag    |   replay_lag    | sync_priority | sync_state |          reply_time           
                ------+----------+---------+------------------+--------------+-----------------+-------------+-------------------------------+--------------+-----------+------------+------------+---
                ---------+------------+-----------------+-----------------+-----------------+---------------+------------+-------------------------------
                 1651 |     9999 | sysdba  | walreceiver      | x.x.2.50 |                 |       58026 | 2024-05-28 11:08:15.038853+08 |              | streaming | 0/B9000000 | 0/B9000000 | 0/
                B9000000 | 0/B9000000 | 00:00:00.101506 | 00:00:00.101506 | 00:00:00.101506 |             0 | async      | 2024-05-28 11:08:14.512443+08
                (1 行记录)
                (左右滑动查看完整内容)

                二、主节点有归档的情况

                主备流复制断档,由于未配置复制槽,wal已被删除,查询数据库日志,某wal日志文件已被删除,但在主节点归档目录中查询到此wal日志文件

                此情况可通过拷贝归档日志到备节点恢复流复制

                具体示例步骤如下:

                示例环境:


                IP
                数据目录
                归档目录
                主节点
                x.x.2.49
                /data/highgo/data
                /data/highgo/hgdbbak/archive
                备节点
                x.x.2.50
                /data/highgo/data
                /data/highgo/hgdbbak/archive
                1.通过数据库日志查询备节点所需wal日志
                  vim  /data/highgo/data/hgdb_log/highgodb_28.csv
                  ## 相关日志如下所示
                  2024-05-28 14:17:18.707 CST,,,7820,,665576ee.1e8c,1,,2024-05-28 14:17:18 CST,,0,日志,00000,"在时间点: 0/BA000000 (时间安排6)启动日志的流操作",,,,,,,,,""
                  2024-05-28 14:17:18.707 CST,,,7820,,665576ee.1e8c,2,,2024-05-28 14:17:18 CST,,0,致命错误,XX000,"无法从WAL流中获得数据: 错误:  所要求的WAL段0000000600000000000000BA已经被删除",,,,,,,,
                  (左右滑动查看完整内容)
                  2. 在主节点归档目录中找到查询出的wal日志
                    [root@HGDB-458 pg_wal]# cd /data/highgo/hgdbbak/archive
                    [root@HGDB-458 pg_wal]# ls -l 0000000600000000000000BA
                    -rw------- 1 root root 16777216 5月  28 13:30 0000000600000000000000BA
                    (左右滑动查看完整内容)
                    3.将此归档日志及之后的所有归档打包并拷贝到备节点中
                      [root@HGDB-458 archive]# cd /data/highgo/hgdbbak/archive
                      [root@HGDB-458 archive]# find . -type f -newermt '2024-05-28 13:30' -exec tar -zcvf hgdb_archive_bak0528.tar.gz {} +
                      # 将当前目录下修改时间在 '2024-05-28 13:30' 及之后的所有文件打包为hgdb_archive_bak0528.tar.gz
                      [root@HGDB-458 archive]# scp hgdb_archive_bak0528.tar.gz root@x.x.2.50:/data/highgo/
                      # 拷贝到备节点/data/highgo/目录下,也可以用其他方式
                      (左右滑动查看完整内容)
                      4.恢复wal日志(备节点操作)

                      解压归档日志到数据目录pg_wal文件夹下

                        [root@HGDB-458 archive]# tar -zxvf hgdb_archive_bak0528.tar.gz -C /data/highgo/data/pg_wal/

                        (左右滑动查看完整内容)

                        5.检查流复制是否恢复

                        主节点执行

                          [root@HGDB-458 opt]# psql highgo sysdba
                          highgo=# select * from pg_stat_replication ;
                           pid  | usesysid | usename | application_name | client_addr  | client_hostname | client_port |         backend_start         | backend_xmin |   state   |  sent_lsn  | write_lsn  | flush_ls
                          n  | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state |          reply_time           
                          ------+----------+---------+------------------+--------------+-----------------+-------------+-------------------------------+--------------+-----------+------------+------------+---------
                          ---+------------+-----------+-----------+------------+---------------+------------+-------------------------------
                           3716 |     9999 | sysdba  | walreceiver      | x.x.2.50 |                 |       58918 | 2024-05-28 14:17:24.354824+08 |              | streaming | 0/C3000000 | 0/C3000000 | 0/C30000
                          00 | 0/C3000000 |           |           |            |             0 | async      | 2024-05-29 05:22:51.494491+08
                          (1 行记录)
                          # 流复制已恢复正常
                          (左右滑动查看完整内容)
                          6.配置复制槽功能

                          创建复制槽可以确保主从数据库之间的数据一致性。主数据库产生的 WAL 日志在从数据库处理之前不会被删除,但若出现备节点异常宕机或断档情况会导使主节点wal日志累积严重会导致磁盘爆满,需要权衡其优缺点,并根据具体情况来选择是否使用,具体配置步骤如下:

                          主节点:

                            [root@HGDB-458 highgo]# psql highgo sysdba
                            highgo=select * from pg_create_physical_replication_slot('node_1');
                            highgo=select * from pg_replication_slots;          # 检查是否创建成功
                            (左右滑动查看完整内容)

                            备节点:

                            修改postgresql.auto.conf配置文件,添加复制槽相关配置:

                              vim /data/highgo/data/postgresql.auto.conf
                              ## 添加以下参数值
                              primary_slot_name = 'node_1'
                              (左右滑动查看完整内容)

                              配置完成后重启备节点数据库使修改生效

                                [root@HGDB-458 highgo]# pg_ctl restart

                                版权声明:本文由瀚高及PG志愿者翻整理,转载请注明出处,本页面内容均源自PostgreSQL Weekly英文官网,翻译目的在于传递更多信息,并不意味着瀚高赞同其观点或证实其内容的真实性。如果其他媒体、网站或其他任何形式的法律实体和个人使用,必须经过著作权人合法书面授权并自负全部法律责任。不得擅自使用瀚高名义进行转载,或盗用瀚高名义发布信息。否则瀚高将保留追究法律责任的权利

                                文章转载自瀚高PG实验室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                评论