维护

内部管理视图

  • mx_stream 存储流的基本信息
  • mx_stream_info 保存流和slot的对应关系及其他信息
  • pg_class 新增两个字段,relisstream 标识是否是流表,relhasdownstream 标识是否存在下游流表

配置产生管理

  • mx_max_number_streams 最⼤允许创建 8 个 stream,修改需要重启数据库。
  • max_replication_slots 控制 segment 节点上的复制槽的数量,一个流对应一个复制槽。
  • mx_stream_message_level 打印额外的 stream 相关⽇志,默认为 DEBUG4,可以在会话级别修改,当开发者调试故障时可以设为 LOG。
  • mxstream.debug_planmxstream.debug_plan_verbose 若打开,则在创建流时,可以打印出额外的执⾏计划信息,可以作为性能问题排查的依据,可以在会话级别打开或关闭。
  • set mx_stream_message_level to notice,打印更详细的建流执行日志输出
  • mxstream.debug_tuple_decoding 默认关闭,打开会在⽇志⾥打印巨量调试信息,仅作为开发和故障分析临时使⽤。
  • mxstream.simple_one.skip_check 默认关闭,打开则允许创建任何流,仅限开发者使⽤。
  • mx_stream_internal_modify 允许对流里的数据直接进行 DML 操作【危险参数,谨慎调整】
  • mxstream.domino_join_skip_index_check 允许双流创建时不存在索引
  • mxstream.scan_tuples_limitmxstream.scan_xlog_size_limit
  • scan_xlog_size_limit 是控制每个流表进程扫过的 xlog 日志,不是有效日志大小;
  • scan_tuples_limit 是控制流表单次处理的有效记录数;
  • 建议 scan_xlog_size_limit 设置为 0,scan_tuples_limit 根据实际需要进行控制流的单次处理大小.

常见管理操作

  • 查看当前有哪些流
=# select /*streamoid,*/streamrelid::regclass,dbid,provider,plugin,querytext from mx_stream;
 streamoid | streamrelid | dbid  | provider |   plugin   | querytext 
-----------+-------------+-------+----------+------------+-----------
     23184 | s8          | 19789 | mxstream | simple_one | 
     23195 | s1          | 19789 | mxstream | domino_agg | 
     23222 | s61         | 19789 | mxstream | simple_one | 
     23230 | s62         | 19789 | mxstream | simple_one | 
     23244 | s51         | 19789 | mxstream | simple_one | 
     23252 | s52         | 19789 | mxstream | simple_one | 
     23266 | s3          | 19789 | mxstream | simple_one | 
     23280 | s4          | 19789 | mxstream | simple_one | 
(8 rows)
  • 删除流
=# drop stream s8;
DROP STREAM
  • 调整库内流的数量上限
gpconfig -c max_replication_slots -v 100
gpconfig -c mx_max_number_streams -v 100

注:调整完上述操作后需要重启数据库
注:增加上限会使 postgres 进程申请额外的共享内存,因此不是越大越好
  • 查看有哪些对象存在下游流表
=# select relname,relkind,relisstream,relhasdownstream  from pg_class where relname ='t8';
 relname | relkind | relisstream | relhasdownstream 
---------+---------+-------------+------------------
 t8      | r       | f           | t
(1 row)

=# select relname,relkind,relisstream,relhasdownstream  from pg_class where relname ='s8';
 relname | relkind | relisstream | relhasdownstream 
---------+---------+-------------+------------------
 s8      | r       | t           | f
(1 row)
  • 查看流表定义

    • psql 客户端
      \dS+ s8
                                      TABLE "public.s1"
       Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description
      --------+---------+-----------+----------+---------+---------+--------------+-------------
       id     | integer |           |          |         | plain   |              |
       v1     | integer |           |          |         | plain   |              |
       v2     | integer |           |          |         | plain   |              |
      STREAM definition:
       SELECT t1.id,
          t1.v1,
          t2.v2
         FROM STREAMING t1
           JOIN STREAMING t2 ON t1.id = t2.id;
      DISTRIBUTED BY: (id)
      Access method: heap
    
    • 其他 SQL 终端
      SELECT pg_catalog.pg_get_viewdef('s1');
    
                      pg_get_viewdef
      -----------------------------------------------
        SELECT t1.id,                               +
           t1.v1,                                   +
           t2.v2                                    +
          FROM (STREAMING t1                        +
            JOIN STREAMING t2 ON ((t1.id = t2.id)));
  • 通过master节点日志,查阅每个流表的数据处理效率

cat  gpdb-2024-08-26_121305.csv|grep -iE "77748"|grep -iE -A1 "process"|awk -F',' '{print $1"-"$19}'|grep -v  '^-'|sed -n '{N;s/\n/\t/p}'|sed 's/processed.*execution took//g' >/tmp/stream1_77748.log
  • 通过segment节点,查阅每个流表复制槽的处理进度
select slot_name,restart_lsn,pg_wal_lsn_diff(pg_current_wal_lsn(),confirmed_flush_lsn)/8/1024 as currentlsn_diff  from pg_replication_slots;\watch 1
  • 流表检查(各个segment一致)
for i in {20000..20010};  
do
   PGOPTIONS='-c gp_role=utility' psql -d yonyou_ap -U ap_test -h 127.0.0.1 -p $i  -c "select count(*) from pg_replication_slots;"; 
done

for i in {20000..20010}; 
do  
  PGOPTIONS='-c gp_role=utility' psql -d yonyou_ap -U ap_test -h 127.0.0.1 -p $i  -c "select pg_drop_replication_slot('stream_slot_27534');"; 
done

for i in {20000..20010};  
do
   PGOPTIONS='-c gp_role=utility' psql -d yonyou_ap -U ap_test -h 127.0.0.1 -p $i  -c "select count(*) from  pg_class where relisstream is true;"; 
done