AntDB屬性丟失問題分析

2021-08-20 18:50:06 字數 4824 閱讀 9430

背景

[zgy@intel175 pgbench]$ coord1

psql (pgxc 1.2devel, based on pg 9.3.13)

type "help" for help.

postgres=# select count(*) from test1000;

error:catalog is missing 1 attribute(s) for relid 46954523

在資料庫執行過程中,偶然出現屬性丟失的現象。

測試場景

由於最近幾次偶現的屬性丟失的都是系統表,使用者自建的表屬性都很穩定。本次測試重點放在系統表的變更上。採用postgresql自帶的pgbench測試工具。併發隨機對1萬張表進行寫操作,同時併發對這批表進行ddl屬性更新。最後逐個對這個表進行查詢,來驗證是否出現表屬性丟失的現象。

測試集群架構如下(2c2d,一主一從架構):

coord1和db1,db2均開啟xlog日誌歸檔:

[zgy@intel175 pgbench]$ adbmgr

psql (pgxc 1.2devel, based on pg 9.3.13)

type "help" for help.

postgres=# set datanode all (archive_mode='on',archive_command = 'test ! -f /data/zgy/archive_xlog/%f && cp %p/data/zgy/archive_xlog/%f');

notice: parameter "archive_mode" cannot be changed without restarting the server

set param

archive_mode相關的設定,需要重啟服務才能生效。另外如果一台伺服器部署多個節點,需要注意歸檔目錄不要出現交集。

猜測屬性丟失,可能跟autovacuum有關係,設定觸發autovacuum的間隔為30秒(檢測間隔):

[zgy@intel175 pgbench]$ adbmgr

psql (pgxc 1.2devel, based on pg 9.3.13)

type "help" for help.

postgres=# set datanode all (autovacuum_naptime='30s',autovacuum_vacuum_threshold=10,autovacuum_vacuum_scale_factor=0);

set param

postgres=# set coordinator all (autovacuum_naptime='30s',autovacuum_vacuum_threshold=10,autovacuum_vacuum_scale_factor=0);

set param

autovacuum觸發條件只有兩個:一、表上(update,delte 記錄) >= autovacuum_vacuum_scale_factor* reltuples(表上記錄數) + autovacuum_vacuum_threshold;二、表的max_age > autovacuum_freeze_max_age

測試步驟

初始化1萬張測試表:

[zgy@intel175 pgbench]$ vim init.sql 

do language plpgsql $$

declare

begin

execute 'drop table if exists test';

execute 'create table test(id serial8, c1 int default 0,c2 int default 0,c3 int default 0,c4 int default 0,c5 int default 0,c6 int default 0,c7 int default 0,c8 int default 0,c9

int default 0,c10 int default 0, crt_time timestamp)';

for i in 1..10000 loop

execute format('drop table if exists test%s', i);

execute format('create table test%s (like test including all)', i);

end loop;

end;

$$;

初始化完成後,準備測試指令碼:

public | test9983  | table | zgy

public | test9984 | table | zgy

public | test9985 | table | zgy

public | test9986 | table | zgy

public | test9987 | table | zgy

public | test9988 | table | zgy

public | test9989 | table | zgy

public | test999 | table | zgy

public | test9990 | table | zgy

public | test9991 | table | zgy

public | test9992 | table | zgy

public | test9993 | table | zgy

public | test9994 | table | zgy

public | test9995 | table | zgy

public | test9996 | table | zgy

public | test9997 | table | zgy

public | test9998 | table | zgy

public | test9999 | table | zgy

(10001 rows)

pgbench測試指令碼如下:

[zgy@intel175 pgbench]$ vim ddl.sql 

\setrandom id 1 10000

begin;

alter table test:id alter column c1 type int8;

alter table test:id rename column c1 to d1;

alter table test:id drop column d1;

alter table test:id add column c1 int default 0 ;

end;

[zgy@intel175 pgbench]$ vim dml.sql 

\setrandom id 1 10000

begin;

insert into test:id(id,crt_time) values(:id,now());

insert into test:id(crt_time) values(now());

update test:id set crt_time=now() where id=:id;

delete from test:id where id=:id;

end;

pgbench執行測試指令碼如下:

[zgy@intel175 pgbench]$ vim pgbench.sh 

#!/bin/bash

dbname=$1

username=$2

port=$3

test_file=$4

bench_num=$5

excute_time=$6

nohup pgbench -d $dbname -u $username -p $port -n -r -f ./$test_file -c $bench_num -j $bench_num -t $excute_time >>pgbench.log &

開始執行測試

100併發執行1小時

[zgy@intel175 pgbench]$ sh pgbench.sh  postgres zgy 6603 ddl.sql 100 3600

[zgy@intel175 pgbench]$ nohup: redirecting stderr to stdout

[zgy@intel175 pgbench]$ sh pgbench.sh postgres zgy 6603 dml.sql 100 3600

[zgy@intel175 pgbench]$ nohup: redirecting stderr to stdout

pgbench執行完成後,依次對1萬張表進行普通查詢:

#!/bin/bash

conn="psql -d postgres -u zgy -p 6603"

for ((i=1;i<=10000;i++));

do $conn -c "select * from test$i;"

done

壓測1小時,未復現系統表屬性丟失的,後續多壓測幾次嘗試。

閘道器資料丟失分析處理

如果系統是因為防火牆而丟包,表現的行為一般是所有的報文都無法正常接收,要排查的業務中只是部分相對少量丟包,認為非防火牆問題。當然不排除防火牆只 drop 一部分報文的可能性。如果遇到丟包比率非常大的情況,防火牆某規則主動 drop udp 報文 a 檢視丟棄資料報數目?發現為0,認為正常 b 檢查丟...

介面IP丟失問題

業務需要核心模組中申請並註冊了乙個虛擬以太介面,alloc etherdev mq register netdev dev open之後,ifconfig可以看到該介面,但是配置ip後過一會ip經常會莫名消失。定位過程中wireshark抓包發現該虛擬介面經常是傳送幾次dhcp請求廣播報文後,ip跟...

Linux c 訊號丟失問題

訊號的可靠與不可靠以及訊號的含義 訊號有丟失.訊號壓縮 由於歷史的緣故 訊號有壓縮的需求.可靠訊號 實時訊號 與不可靠訊號 非實時訊號 早期訊號 1 31 31個訊號,不可靠 與系統有關 會有訊號丟失 後期訊號34 64 31個訊號,可靠訊號 使用者訊號 不會出現訊號丟失 例子1 訊號丟失 incl...