0

我尝试使用 pglogical 在 2 个 PG 服务器之间复制数据,在此过程中发现巨大的磁盘占用。这是详细信息

环境:

  • 来源 PG:

    • 服务器名称:pg-publisher。
    • IP地址:10.0.0.1
    • 整盘空间:3.5T
    • PG数据文件夹大小:2.2T
    • 最大桌子尺寸:
      • 表名 -> my_schema.logs
      • pg_table_size('logs') = 1.4T
    • PG正在运行,新数据不断进入并插入到包括表在内的logs表中。
  • 目的地PG:

    • 服务器名称:pg-subscriber
    • IP地址:10.0.0.2
    • 整盘空间:3T

我是如何设置复制的:

  • 在 pg-publisher 上

    • 创建节点:

      SELECT pglogical.create_node(
      node_name := 'publisher',
      dsn := 'host=10.0.0.1 port=5432 dbname=mydb user=pguser password=pgpassword'
      );
      
    • 创建复制集

      SELECT pglogical.create_replication_set('my_replication_set');
      SELECT pglogical.replication_set_add_all_tables('my_replication_set', ARRAY['my_schema']);
      
  • 在 pg 订阅者上

    • 创建节点

      SELECT pglogical.create_node(
      node_name := 'subscriber',
      dsn := 'host=10.0.0.2 port=5432 dbname=mydb user=pguser password=pgpassword'
      );
      
    • 创建订阅

      SELECT pglogical.create_subscription(
      subscription_name := 'pg_subscriber',
      provider_dsn := 'host=10.0.0.1 port=5432 dbname=mydb user=pguser password=pgpassword',
      replication_sets := ARRAY['my_replication_set'],
      synchronize_structure := false,
      synchronize_data := true
      

); ```

确认

经过上述操作。我检查了两台服务器上的状态:

  • 在 pg 订阅者上。pglogical 复制处于initializing状态(来自pglogical.show_subscription_status()
  • 在 pg-publisher 上。复制槽已创建且未处于活动状态。这是意料之中的,因为有很多数据需要初始化。在达到状态之前它不会处于活动replicating状态

我的困惑

所有操作似乎都按预期工作。但 4 天后,我收到警报,发现可用磁盘空间pg-publisher减少了很多(减少了 20% 以上)。然后这是我发现的:

  • pglogical复制仍处于initializing状态 on pg-subscriber。在 pg-publisher 上,我检查了pg_stat_activity它,发现pglogical事件正在使用COPY命令复制最大的表my_schema.logs

  • PG数据的文件夹大小pg-publisher从2.2T增加到2.7T

我知道发布服务器会在达到replicating状态之前保留复制所需的 WAL 文件,这将占用磁盘空间。但我检查了pg_wal文件夹大小pg-publisher,发现它只有不到 20GB。但base文件夹增加到2.7T。我可以知道为什么会这样。命令是否COPY占用磁盘空间(我不这么认为,因为我发现它会复制到标准输出)还是有其他事情会导致它?

4

0 回答 0