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

GBase8a加载数据故障处理

VV_刺头王 2022-03-25
767

    GBase 8a Cluster数据加载是由数据分发服务器(dispserver)、数据分发客户端(dispcli)和集群节点上的gbloader工具共同完成原始数据文件切分,数据文件下发到各节点然后导入的加载过程。经常出现的故障可能是命令参数错误、网络错误、集群错误等,下面将一一说明。

1.参数错误

(1)任务名称错误

现象:

    加载时出现如下错误:

    ERROR: Duplicated section name: 'xxxxxx'

原因:

    加载控制文件中包含多个相同名称的任务名称(使用中括号括起的[xxxxxx]的为任务名称)时,出现此错误。

对策:

    改变任务名称使其互不相同。

举例说明:

    在加载控制文件中包含两个相同的任务头[test_dwdate],当执行dispcli命令时会报错:

$ cat lst/lineorder.lst

[test_lineorder]

disp_server=192.168.11.214:6666

file_list=/home/gbase/testSpace/data/ssbm/1s/lineorder.tbl

format=3

sg_list=sg01,sg02,sg03

db_name=test

table_name=lineorder

delimiter='|'

socket=/tmp/gbase_8a_5050.sock

extra_loader_args=--parallel=4

$ ./dispcli -t 300 lst/lineorder.lst

[2012-07-17 8:14:4] ERROR: Duplicated section name: 'test_lineorder'

(/home/gbase/dispserver/dispcli/dispcli_app.cpp:112)

(2)gcluster连接参数错误

现象:

    加载时出现如下错误:

    ./dispcli -h192.168.9.234 ~/data/lineorder.lst

    ERROR: Couldn't connect to gcluster : Can't connect to GBaseserver on '192.168.9.234'(113)

原因:

    不能连接到集群,这是由于dispcli -h 参数中给定的目标集群节点IP地址错误造成。

对策:

    给定正确的连接集群参数,连接gcluster 需要用到下面这些参数:

-h, --host Host name or ip address of a gcluster node

-u, --user User name for login to gcluster

-p, --password Password for login to gcluster

-S, --socket Unix socket file to use for connect to gcluster

-P, --port Port number to use for connect to gcluster

    这些参数与gbase 客户端程序完全相同。

(3)disp_server错误

现象:

    加载时出现如下错误:

    加载控制文件lineorder1.lst:

    [ssbm_lineorder]

    disp_server=192.168.9.234:6666

    …

执行命令:

    ./dispcli -h192.168.9.72 ~/data/lineorder1.lst

显示:

    [2012-07-03 15:44:47] ERROR: Failed to receive reply forcommand: 'get_connect' (Resource temporarily unavailable)

原因:

    这是由于控制文件中的disp_server错误造成。

对策:

    改为正确的IP 地址和端口号。

(4)file_list错误

现象:

加载时出现如下错误:

ERROR: Create dispatch failed (+ERR FATAL INVALID_ARGS (File :'/home/gbase/data/lineorder.tbl.101' does NOT exists or can NOT be read.)

原因:

由于给定的file_list中包含不存在或者无法读取的文件造成的。

对策:

修改file_list 参数值,保证所有数据文件都存在并且都可以被dispserver 读取。

(5)delimiter错误

现象:

分隔符设置错误,此错误不会造成加载出错退出,但是会造成正常的原始数据无法被导入到数据库中,同时出现大量错误数据,可能会看到如下的状态显示:

[192.168.9.70] [START TIME: 2012-07-03 14:26:50] [N/A]

[RATE: 4.43M/s] [TIMEOUT] [BAD REC: 6767869] [ETA: N/A]

[ELAPSED: 11 secs]

原因:

当分隔符设置错误时,节点上的gbloader会由于无法正确地对文本行进行切分而认为此行数据为错误数据,并将所有错误数据重新上传到dispserver上的错误数据日志文件中,所以当有大量错误数据上传时,gbloader从dispserver读取原始数据的速度也会相应变慢,进而可能造成加载超时。

对策:

根据数据文件的内容改为正确的delimiter参数值。

(6)format错误

现象:

出现大量错误数据,导致加载错误或超时。

原因:

这个参数目前有四个值:0,(文本文件);2,(gbase 二进制);3,无转义的文本文件;4,定长文本文件。如果这个参数设置错误的话,会导致原始数据被按照错误的方式解析,所以极有可能出现所有数据都被认为是错误数据的情况发生。

对策:

根据文件格式设置正确的format参数,值为0、2、3、4。

(7)db_name&table_name错误

现象:

加载时出现如下错误:

ERROR: Table 'ssbm1'.'lineorder' does not exist.

原因:

db_name或table_name错误造成程序无法在目标集群中找到指定的数据表的元信息

对策:

改为正确的数据库名和表名。

(8)extra_loader_args错误

现象:

这个参数如果设置错误的话,会导致节点上的gbloader无法正常启动或无法正常工作。

原因:

这个参数的值会被原样传递给节点上的gbloader,所以这个参数包含错误的话会导致所有gbloader都出现问题。

对策:

保证参数的正确,同时要注意gbloader不允许长参数名和参数值之间(即等号两边)包含空格。

(9)single_node_mode错误

现象:

不能像预期的那样向一个数据分片表中导入所有数据,而是仍然向一个safegroup的所有数据分片表中导入。

原因:

此参数的目的是只向一个数据分片表中导入数据,需要注意的是,这个参数需要配合dispcli的命令行参数–single-node来使用,否则就会被忽略。

对策:

确认控制文件中含有single_node_mode参数,并且其参数值为1,同时dispcli也要给定—single-node(或-s)参数。

2. 网络错误

(1)端口无法绑定

现象:

启动dispserver不成功,并且log中显示如下内容:

2012-07-04 13:46:53 Can't start dispserver server: Bind on

TCP/IP port: Address already in use

原因:

这是由于指定端口(默认为6666)已经被其他程序占用导致的。

对策:

通过--port 参数指定其他端口。

3. gcluster错误

在加载过程中如果集群出现异常,例如节点出现故障,会导致加载不能正常进行或者加载后同组中节点数据不一致,此类错误比较严重,要重点解决,以免影响后续使用。

(1)节点offline

现象:

启动加载失败。

原因:

在导入开始之前集群中已经有某些节点处于offline状态,加载机会判断offline状态节点是否是当前集群anchor节点(即分发节点),如果是anchor节点offline的话,则加载无法开始即加载失败;但如果是非anchor节点,加载机会跳过已经offline的节点进行加载,把offline状态节点的数据状态设置为LOCKED。

对策:

如果加载未进行就失败,说明offline节点是anchor节点,则需要重新启动所有集群上的节点的gcware服务,使得集群处于正常状态,不应有offline状态的节点,然后重新进行加载。如果加载进行了,只有offline 节点上的数据状态为>0 的值(即为LOCKED状态),则需要重新启动此节点的gcware服务,使其恢复到Online状态。然后在同一个safegroup组的另一个节点上执行数据同步命令,这样此节点的数据就能正常了,而且数据状态自动恢复成0(VALID 状态)。

(2)节点locked

现象:

加载开始时跳过了某个目标节点,即并未在某节点上启动gbloader,此节点数据未导入。

原因:

该节点正处于locked状态,所以加载程序会自动跳过这些节点,并对其同组节点执行正常的加载操作。

对策:

手动进行数据同步,使locked 节点的数据跟组内其他节点一致。在组内另一台好的节点上执行同步程序手动同步locked 的节点。

命令为:gcadmin sync <locked 节点IP>

同步完数据之后,locked节点的状态自动变成正常状态。

(3)safegroup 被lock

现象:加载时出现如下错误信息:

ERROR: Can’t start load while target safegroup locked.

原因:

某个目标safegroup中所有的节点都已经LOCKED,导致整个safegroup被LOCKED。

对策:

需要人工介入查找故障原因,safegroup 组恢复后可再次启动导入。

4. gbloader错误

    gbloader的错误信息会被记录到dispcli.log文件中,此log文件的默认位置是/tmp/dispcli.log,也可以使用--log-file参数指定位置。由于log 文件中记录的内容较多,所以在确定gbloader 错误的时候通常需要采用关键字查找并结合log 时间戳的方式来进行。一般来说,当有gbloader 错误发生时,可先将log 文件内容定位到最后,然后反向查找关键字“STDERR”,这样就能找到gbloader 最后一次出现错误时打印在标准错误上的信息了。如:

2012-07-04 12:59:36 We read from 192.168.9.70 [STDERR]:

2012-07-04 12:59:36 Error: kill by signal.

     得到gbloader的错误信息后即可参照gbloader的使用说明进行排错。如果想知道gbloader的返回码,可以搜索“EXIT:”,为了更好地显示loader的退出状态,gbloader的返回码被赋予了两种不同的含义,一种是loader本身返回的值,一种是导致loader退出的系统信号(signal)。如果返回码等于0 或大于100 则表明这是gbloader自身返回的值,否则即为系统信号值,由此可以判断出gbloader是由于接收到系统信号而退出还是执行结束退出,如:2012-07-04 12:59:36 192.168.9.71 EXIT: 0 bytecount: 0

    其中的IP 地址(192.168.9.71)表示这个返回码是来自于 192.168.9.71这个节点上执行的gbloader。

    gbloader 的返回码定义如下:

返回码

说明

0

加载完成,正常退出

255

出现内部错误退出,包括参数错误、数据访问错误、gnode 访问错误等

254

出现错误数据,但成功提交

253

出现表锁争用,即加载目标表已被其他写操作锁定

    其他值则表示gbloader 收到的导致其退出的系统信号,信号列表如下:

/* Signals. */

SIGHUP 1 /* Hangup (POSIX). */

SIGINT 2 /* Interrupt (ANSI). */

SIGQUIT 3 /* Quit (POSIX). */

SIGILL 4 /* Illegal instruction (ANSI). */

SIGTRAP 5 /* Trace trap (POSIX). */

SIGABRT 6 /* Abort (ANSI). */

SIGIOT 6 /* IOT trap (4.2 BSD). */

SIGBUS 7 /* BUS error (4.2 BSD). */

SIGFPE 8 /* Floating-point exception (ANSI). */

SIGKILL 9 /* Kill, unblockable (POSIX). */

SIGUSR1 10 /* User-defined signal 1 (POSIX). */

SIGSEGV 11 /* Segmentation violation (ANSI). */

SIGUSR2 12 /* User-defined signal 2 (POSIX). */

SIGPIPE 13 /* Locked pipe (POSIX). */

SIGALRM 14 /* Alarm clock (POSIX). */

SIGTERM 15 /* Termination (ANSI). */

SIGSTKFLT 16 /* Stack fault. */

SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */

SIGCHLD 17 /* Child status has changed (POSIX). */

SIGCONT 18 /* Continue (POSIX). */

SIGSTOP 19 /* Stop, unblockable (POSIX). */

SIGTSTP 20 /* Keyboard stop (POSIX). */

SIGTTIN 21 /* Background read from tty (POSIX). */

SIGTTOU 22 /* Background write to tty (POSIX). */

SIGURG 23 /* Urgent condition on socket (4.2 BSD). */

SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */

SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */

SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */

SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */

SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */

SIGPOLL SIGIO /* Pollable event occurred (System V). */

SIGIO 29 /* I/O now possible (4.2 BSD). */

SIGPWR 30 /* Power failure restart (System V). */

SIGSYS 31 /* Bad system call. */

    在网络出现严重拥塞或者连接断开的情况下,节点上的gbloader可能会因为长时间无法从dispserver读取到数据而导致操作超时,dispcli可能会有如下的显示:

[192.168.9.70] [START TIME: 2012-07-04 11:15:50] [N/A]

[RATE: 1.43M/s] [TIMEOUT] [BAD REC: 0] [ETA: N/A] [ELAPSED: 5 mins 33

secs]

    这时首先应该检查超时节点和dispserver所在节点之间的网络是否畅通,dispserver是否工作正常(如进程是否还在、端口是否还可以连接等),如dispserver工作正常,而网络拥塞确实比较严重,但仍然可以联通,且短时间内无法恢复的话,可以使用gbloader的--timeout 参数指定一个较大的超时值,设置为0 则表示永不超时。同时对dispcli 也要相应增加超时值。

    另外,需要注意的是,由于dispcli的log是追加模式,所以长时间运行时会导致产生大量log信息,对侦错工作会产生一定影响。因此建议每次启动dispcli时都使用—log-file参数指定不同的log文件(例如可使用时间戳:data +%F_%T),这样可有效地加快侦错速度。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论