GaussDB(DWS)数据库故障常用构造方法分享(一)
前言
可靠性是指系统或设备在特定条件下持续稳定运行、具有较低的故障率、高可用性、良好的容错性、易于维修和快速恢复的能力。本文目的在于方便测试人员对被测产品进行全面、细致的可靠性质量评估,同时也对可靠性能力开发过程有一定参考价值。
一、可靠性的概念
可靠性是指系统或设备在特定条件下持续稳定运行、具有较低的故障率、高可用性、良好的容错性、易于维修和快速恢复的能力。根据故障处理过程,可将可靠性能力分为如下四个维度:故障预防能力、故障检测和诊断能力、故障隔离能力和故障恢复和修复能力。
二、GaussDB(DWS)常见故障构造方法
1、根据故障注入的具体实现方式不同可以分为四大类,具体如下(三级主题所列为主要故障场景)
2、常见的故障构造方法:涉及cfe工具的,需要先uname -a查询版本信息,然后取对应的工具包来进行故障模拟注入
硬件故障类:
1)CPU故障:
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异常:参数可以是of,de,df,我们版本上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 down;ifconfig 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实例
step1:ps ux | grep 实例名称
step2:kill -9 实例进程号
b.mv+kill实例
step1:mv 实例数据目录,ps ux | grep 实例名称
step2:kill -9 实例进程号
c.实例进程hang
step1:ps ux | grep 实例名称
step2:kill SIGSTOP 实例进程号 #暂停实例进程
step3:kill SIGCONT 实例进程号 #恢复实例进程
d.实例core
step1:ps ux | grep 实例名称
step2:kill -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)系统资源过载:内存过载:
step1:free -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数据库服务中常见的故障构造方法,后续会陆续介绍各种故障场景下,集群的表象、修复手段、定位思路等,敬请期待!
- 点赞
- 收藏
- 关注作者
评论(0)