GaussDB(DWS)数据库故障常用构造方法分享(一)

举报
故障小能手 发表于 2023/12/13 09:52:25 2023/12/13
【摘要】 可靠性是指系统或设备在特定条件下持续稳定运行、具有较低的故障率、高可用性、良好的容错性、易于维修和快速恢复的能力。本文目的在于方便测试人员对被测产品进行全面、细致的可靠性质量评估,同时掌握常用的故障构造手段及基本故障定位及恢复能力。

前言

可靠性是指系统或设备在特定条件下持续稳定运行、具有较低的故障率、高可用性、良好的容错性、易于维修和快速恢复的能力。本文目的在于方便测试人员对被测产品进行全面、细致的可靠性质量评估,同时也对可靠性能力开发过程有一定参考价值。

一、可靠性的概念

可靠性是指系统或设备在特定条件下持续稳定运行、具有较低的故障率、高可用性、良好的容错性、易于维修和快速恢复的能力。根据故障处理过程,可将可靠性能力分为如下四个维度:故障预防能力、故障检测和诊断能力、故障隔离能力和故障恢复和修复能力。

二、GaussDBDWS)常见故障构造方法

1、根据故障注入的具体实现方式不同可以分为四大类,具体如下(三级主题所列为主要故障场景)


2、常见的故障构造方法:涉及cfe工具的,需要先uname -a查询版本信息,然后取对应的工具包来进行故障模拟注入

硬件故障类:

1CPU故障:

a.指定某一CPU核占有率达到100%

 注入:./cfe "inject rCPU_Overloadp (cpuid) values(1)"

 查询:./cfe "query rCPU_Overloadp"

 清除:./cfe "clean rCPU_Overloadp"

 b.CPU核失效/下线

  注入:./cfe "inject rCPU_Offline (cpuid) values(1)"

 查询:./cfe "query rCPU_Offline"

 清除:./cfe "clean rCPU_Offline where cpuid = 1"

c. CPU异常:参数可以是ofdedf,我们版本上df故障生效,注入后会导致设备重启

注入:./cfe "inject rCPU_Exception (param) values (df)"

 d.CPU挂死:在设定时间恢复

 注入:./cfe "inject rCPU_Pendings (time, cpuid) values(30, 1)"

 e.CPU core故障(cache error):需要安装先mce-inject

 step1.创建一个test文件,不需要后缀

 step2.输入

CPU 0 BANK 1

STATUS 0xbd00000000100145

ADDR 0x3f107f2000

step3.执行注入:mce-inject   test

step4.查看注入信息: /var/log/messages

备注:ADDR具体参数为内核地址:查询方法为:cat /proc/iomem | grep Kernel;选取该范围中的的地址即可

 f. CPU core故障(cache error

 step1.创建一个test文件,不需要后缀

 step2.输入

 CPU 0 BANK 13

 STATUS 0xbd800000040000a1

 ADDR 0x3f107f2000

step3.执行注入:mce-inject   test

 step4.查看注入信息: /var/log/messages

2)内存故障:需提前部署EINJ内核和vir_to_physical工具

 a.内存CE风暴:0x08是CE故障

 #!/bin/bash

 # bash mem-ce-10.sh &

#循环10次造成CE风暴,每次注入时间不超过1min

tick=10

for((i=0;i<$tick;i++));

do

cd /sys/kernel/debug/apei/einj

echo 0x08 > error_type

echo 0xaedef8b000 > param1 # echo对应的值为CE故障发生的物理地址

echo 0xfffffffffffffff000 > param2  #物理内存地址掩码,一般不需修改

echo 1 > error_inject  #注入故障

sleep 30

echo $i

date >> /home/fsp/mem-ce-10.log

done

b.用户态对应的内存空间触发UCE:可导致业务进程挂死或异常退出

cd /sys/kernel/debug/apei/einj

echo 0x20 > error_type   #UCE故障

echo 0xaedef8b000 > param1 # echo对应的值为CE故障发生的物理地址

echo 0xfffffffffffffff000 > param2  #物理内存地址掩码,一般不需修改

echo 1 > error_inject  #注入故障

c.内存过载:

 注入:./cfe "inject rMem_Overloadn"

 清除:./cfe "clean rMem_Overloadn"

d.内存不足/泄漏

 注入:./cfe "inject rmem_low(total) values(40000M)" ----泄露40000M内存

 清除:./cfe "clean rmem_leak"

3)网卡故障:使用cfe工具或者linux自带的tc命令

a.down网卡:

ifdown eth2;ifup eth2 ifconfig eth2 downifconfig eth2 up

b.网络闪断:

./cfe "inject rNetLink_flash(repeat,duration,interval,dev)values(10,1,2,eth2)"

c.网络丢包:可用另一节点ping该网卡查询故障是否注入成功

注入:./cfe "inject rNet_loss (dev, rate)values(eth2, 50%))"

          tc qdisc add dev eth2 root netem loss 50%

清除:./cfe "clean rNet_loss where dev = eth2 AND rate = 50%"

          或 tc qdisc del dev eth2 root netem loss 50% 

d.网络错包:可用另一节点ping该网卡查询故障是否注入成功

注入:./cfe "inject rNet_corrupt(dev,rate)values(eth2,50%)"

          tc qdisc add dev eth2 root netem corrupt 50%

清除:./cfe "clean rNet_corrupt where dev = eth2 AND rate = 50%"

          或 tc qdisc del dev eth2 root netem corrupt 50%

e.网络时延:可用另一节点ping该网卡查询故障是否注入成功

注入:./cfe "inject rNet_delay (dev, time)values(eth2, 1000ms)"

            tc qdisc add dev eth2 root netem delay 1000ms

清除:./cfe "clean rNet_delay where dev = eth2 AND time = 1000ms"

           tc qdisc del dev eth2 root netem delay 1000ms

4)磁盘故障:磁盘坏道(DF/UNC/IDNF)、慢盘(DS)、磁盘满等

a.磁盘坏道:rdisk不支持虚拟盘

注入:rdisk df/unc/idnf  /dev/sdc

查询:rdisk query | grep /dev/sdc | grep df/unc/idnf

恢复:rdisk restore 3   3为查询步查到的/dev/sdc盘索引值)

b.慢盘: DS故障不能按照时间自动恢复,只能进行手动恢复

 注入:rdisk ds /dev/sdc

 查询:rdisk query | grep /dev/sdc | grep ds

恢复:rdisk restore 3

c.磁盘满

注入:dd if=/dev/zero of=/var/chroot/DWS/data1/100M.img bs=1M count=97280

 清除:rm -rf 100M.img

备注:of后是生成大文件所存放的位置,根据实际情况指定。 count的值 = 磁盘可用空间 * 1024

数据库类:

1)实例类故障

a.kill实例

 step1ps ux | grep 实例名称

 step2kill -9 实例进程号

b.mv+kill实例

  step1mv 实例数据目录,ps ux | grep 实例名称

  step2kill -9 实例进程号

c.实例进程hang

   step1ps ux | grep 实例名称

   step2kill SIGSTOP 实例进程号   #暂停实例进程

   step3kill SIGCONT 实例进程号   #恢复实例进程

d.实例core

   step1ps ux | grep 实例名称

   step2kill -11 实例进程号

2)进程类故障:D/T/Z

a.Z进程:23713是需要注入Z进程故障的进程号,可用ps ux | grep 实例名称查询

  注入:./cfe "inject rProc_z(pid) values(23713)"

  查询:./cfe "query rProc_z where pid=23713"   ps ux

  清除:./cfe "clean rProc_z where pid=23713"

b.D进程:Z进程

       注入:./cfe "inject rProc_d(pid) values(23713)"

       查询:./cfe "query rProc_d where pid=23713"   ps ux

       清除:./cfe "clean rProc_d where pid=23713"

c.T进程:Z进程

        注入:./cfe "inject rProc_h(pid) values(23713)"

        查询:./cfe "query rProc_h where pid=23713"   ps ux

       清除:./cfe "clean rProc_h where pid=23713"

3)系统资源过载:内存过载:

  step1free -g查看集群内存,计算80%的内存值

  step2./cfe "inject rMem_Overloadn(total)values(70000)"   #注入故障

  step3./cfe "clean rMem_Overloadn"     #清除故障

操作系统类:文件句柄耗尽

注入:./cfe "inject rProc_f (pid,num,time) values(11953, 200, 300) "

查询:./cfe "query rProc_f (pid) values(11953) "

清除:./cfe "clean rProc_f (pid) values(11953) "

注:pid为被测进程号,num为消耗句柄数,time为恢复时间

人为因素类:

1)节点异常重启

   a.登录节点执行reboot

   b.BMC执行重启操作

   c.执行shutdown -h now

2)数据库启停:

   cm_ctl stop;cm_ctl start

写在结尾:

     上面内容简单介绍了DWS数据库服务中常见的故障构造方法,后续会陆续介绍各种故障场景下,集群的表象、修复手段、定位思路等,敬请期待!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。