GBase 8a
运维管理
文章
GBase8a集群Event事件监控
发表于2024-02-27 16:51:49226次浏览2个评论
方案背景:GBase 8a数据库集群增加evnet事件监控,将长时间未完成同步的event事件进行告警处理,最终目的是保障gbase8a的数据安全一、创建event.sh脚本
#!/usr/bin/sh
###########################################################
##creator : zhanghe #
##create time: 2024.02.06 #
##Decription: Monitor shell,中国银行对接监控软件脚本 #
##Version: 1.0 #
###########################################################
#配置文件路径
configDir=/opt/gbase_workspace/scripts/config
#脚本路径
ScriptsDir=/opt/gbase_workspace/scripts/monitor
#获取配置信息
config()
{
gbaseMode=`cat ${configDir}/config |grep ^GBaseMode |awk -F= '{print $2}' | awk '{print $1}'`
instanceType=`cat ${configDir}/config |grep ^InstanceType |awk -F= '{print $2}' | awk '{print $1}'`
userName=`cat ${configDir}/config |grep UserName |awk -F '=' '{print $2}'`
userPasswd=`cat ${configDir}/config |grep Password |awk -F '=' '{print $2}'`
gccli_command="gccli -u${userName} -p${userPasswd}"
}
event_virtual()
{
${gccli_command} -Ns -e "show vcs" > ${configDir}/vcs.list
for vcname in `cat ${configDir}/vcs.list`
do
# 获取当前event事件id
current_dml_id=`gcadmin showdmlevent 10000 vc ${vcname} | grep Event | awk '{print "+" $3 "+"}'`
current_ddl_id=`gcadmin showddlevent 10000 vc ${vcname} | grep Event | awk '{print "+" $3 "+"}'`
current_storage_id=`gcadmin showdmlstorageevent 10000 vc ${vcname} | grep Event | awk '{print "+" $3 "+"}'`
# 获取当前event日志
gcadmin showdmlevent 10000 vc ${vcname} | grep -E 'ObjectName|Event' | sed 's# #+#g' | sed 'N;s#\nObjectName#+ ObjectName#g' | while read line; do echo `date +"%F %T"`" DML" $line; done > ${ScriptsDir}/logs/${vcname}_current_dmlevent.log
gcadmin showddlevent 10000 vc ${vcname} | grep -E 'ObjectName|Event' | sed 's# #+#g' | sed 'N;s#\nObjectName#+ ObjectName#g' | while read line; do echo `date +"%F %T"`" DDL" $line; done > ${ScriptsDir}/logs/${vcname}_current_ddlevent.log
gcadmin showdmlstorageevent 10000 vc ${vcname} | grep -E 'ObjectName|Event' | sed 's# #+#g' | sed 'N;s#\nObjectName#+ ObjectName#g' | while read line; do echo `date +"%F %T"`" STORAGE" $line; done > ${ScriptsDir}/logs/${vcname}_current_storageevent.log
# 计算当前event事件个数
totalevent=`cat ${ScriptsDir}/logs/${vcname}_current*.log | wc -l`
echo 'totalevent:'$totalevent
# 创建临时文件,后续信息追加
touch ${ScriptsDir}/logs/tmp_ddl.log
touch ${ScriptsDir}/logs/tmp_dml.log
touch ${ScriptsDir}/logs/tmp_storage.log
################################DML EVENT#########################################################
if [ ! -f "${ScriptsDir}/logs/${vcname}_history_dmlevent.log" ];
then
touch ${ScriptsDir}/logs/${vcname}_history_dmlevent.log #判断是否存在历史文件,如果不存在则创建
echo 'Touch DML History Log Success'
fi
for id in $current_dml_id
do
echo 'CurrentDMLID:'${id}
eventid=`grep $id ${ScriptsDir}/logs/${vcname}_history_dmlevent.log | wc -l` #当前事件id与历史日志匹配
if [ $eventid -gt 0 ]
then
grep $id ${ScriptsDir}/logs/${vcname}_history_dmlevent.log >> ${ScriptsDir}/logs/tmp_dml.log #历史日志存在,从历史日志提取
# 根据当前事件ID从历史日志中提取时间戳
historytime=`grep ${id} ${ScriptsDir}/logs/${vcname}_history_dmlevent.log | awk '{print $1,$2}'`
# 将时间戳转换为UNIXTIME
history_unixtime=`date -d "${datetime}" +%s`
# 获取当前系统时间的UNIXTIME
current_unixtime=`date +%s`
# 如果当前事件总数小于500且历史事件超过1天则写入告警日志
if [ ${totalevent} -lt 500 ] && [ `(expr ${current_unixtime} - ${history_unixtime})` -gt 86400 ]
then
errormessage=`grep $id ${ScriptsDir}/logs/${vcname}_history_dmlevent.log`
echo ${errormessage}
sh ${ScriptsDir}/bin/writeLog.sh EventError "${vcname}:${errormessage}"
echo 'DML Message Write Complate'
fi
else
grep $id ${ScriptsDir}/logs/${vcname}_current_dmlevent.log >> ${ScriptsDir}/logs/tmp_dml.log ##历史日志不存在,从当前日志提取
fi
done
################################DDL EVENT#########################################################
if [ ! -f "${ScriptsDir}/logs/${vcname}_history_ddlevent.log" ];
then
touch ${ScriptsDir}/logs/${vcname}_history_ddlevent.log #判断是否存在历史文件,如果不存在则创建
echo 'Touch DDL History Log Success'
fi
for id in $current_ddl_id
do
echo 'CurrentDDLID:'${id}
eventid=`grep $id ${ScriptsDir}/logs/${vcname}_history_ddlevent.log | wc -l` #当前事件id与历史日志匹配
if [ $eventid -gt 0 ]
then
grep $id ${ScriptsDir}/logs/${vcname}_history_ddlevent.log >> ${ScriptsDir}/logs/tmp_ddl.log #历史日志存在,从历史日志提取
# 根据当前事件ID从历史日志中提取时间戳
historytime=`grep ${id} ${ScriptsDir}/logs/${vcname}_history_ddlevent.log | awk '{print $1,$2}'`
# 将时间戳转换为UNIXTIME
history_unixtime=`date -d "${datetime}" +%s`
# 获取当前系统时间的UNIXTIME
current_unixtime=`date +%s`
# 如果当前事件总数小于500且历史事件超过1天则写入告警日志
if [ ${totalevent} -lt 500 ] && [ `(expr ${current_unixtime} - ${history_unixtime})` -gt 86400 ]
then
errormessage=`grep $id ${ScriptsDir}/logs/${vcname}_history_ddlevent.log`
echo ${errormessage}
sh ${ScriptsDir}/bin/writeLog.sh EventError "${vcname}:${errormessage}"
echo 'DDL Message Write Complate'
fi
else
grep $id ${ScriptsDir}/logs/${vcname}_current_ddlevent.log >> ${ScriptsDir}/logs/tmp_ddl.log ##历史日志不存在,从当前日志提取
fi
done
################################DML STORAGE#######################################################
if [ ! -f "${ScriptsDir}/logs/${vcname}_history_storageevent.log" ];
then
touch ${ScriptsDir}/logs/${vcname}_history_storageevent.log #判断是否存在历史文件,如果不存在则创建
echo 'Touch STORAGE History Log Success'
fi
for id in $current_storage_id
do
echo 'CurrentSTORAGEID:'${id}
eventid=`grep $id ${ScriptsDir}/logs/${vcname}_history_storageevent.log | wc -l` #当前事件id与历史日志匹配
if [ $eventid -gt 0 ]
then
grep $id ${ScriptsDir}/logs/${vcname}_history_storageevent.log >> ${ScriptsDir}/logs/tmp_storage.log #历史日志存在,从历史日志提取
# 根据当前事件ID从历史日志中提取时间戳
historytime=`grep ${id} ${ScriptsDir}/logs/${vcname}_history_storageevent.log | awk '{print $1,$2}'`
# 将时间戳转换为UNIXTIME
history_unixtime=`date -d "${datetime}" +%s`
# 获取当前系统时间的UNIXTIME
current_unixtime=`date +%s`
# 如果当前事件总数小于500且历史事件超过1天则写入告警日志
if [ ${totalevent} -lt 500 ] && [ `(expr ${current_unixtime} - ${history_unixtime})` -gt 86400 ]
then
errormessage=`grep $id ${ScriptsDir}/logs/${vcname}_history_storageevent.log`
echo ${errormessage}
sh ${ScriptsDir}/bin/writeLog.sh EventError "${vcname}:${errormessage}"
echo 'STORAGE Message Write Complate'
fi
else
grep $id ${ScriptsDir}/logs/${vcname}_current_storageevent.log >> ${ScriptsDir}/logs/tmp_storage.log ##历史日志不存在,从当前日志提取
fi
done
#################################################################################
mv ${ScriptsDir}/logs/tmp_dml.log ${ScriptsDir}/logs/${vcname}_history_dmlevent.log
mv ${ScriptsDir}/logs/tmp_ddl.log ${ScriptsDir}/logs/${vcname}_history_ddlevent.log
mv ${ScriptsDir}/logs/tmp_storage.log ${ScriptsDir}/logs/${vcname}_history_storageevent.log
done
}
##################################################################################################################
event_normal()
{
# 获取当前event事件id
current_dml_id=`gcadmin showdmlevent 10000 | grep Event | awk '{print "+" $3 "+"}'`
current_ddl_id=`gcadmin showddlevent 10000 | grep Event | awk '{print "+" $3 "+"}'`
current_storage_id=`gcadmin showdmlstorageevent 10000 | grep Event | awk '{print "+" $3 "+"}'`
# 获取当前event日志
gcadmin showdmlevent 10000 | grep -E 'ObjectName|Event' | sed 's# #+#g' | sed 'N;s#\nObjectName#+ ObjectName#g' | while read line; do echo `date +"%F %T"`" DML" $line; done > ${ScriptsDir}/logs/current_dmlevent.log
gcadmin showddlevent 10000 | grep -E 'ObjectName|Event' | sed 's# #+#g' | sed 'N;s#\nObjectName#+ ObjectName#g' | while read line; do echo `date +"%F %T"`" DDL" $line; done > ${ScriptsDir}/logs/current_ddlevent.log
gcadmin showdmlstorageevent 10000 | grep -E 'ObjectName|Event' | sed 's# #+#g' | sed 'N;s#\nObjectName#+ ObjectName#g' | while read line; do echo `date +"%F %T"`" STORAGE" $line; done > ${ScriptsDir}/logs/current_storageevent.log
# 计算当前event事件个数
totalevent=`cat ${ScriptsDir}/logs/current*.log | wc -l`
echo 'totalevent:'$totalevent
# 创建临时文件,后续信息追加
touch ${ScriptsDir}/logs/tmp_ddl.log
touch ${ScriptsDir}/logs/tmp_dml.log
touch ${ScriptsDir}/logs/tmp_storage.log
################################DML EVENT#########################################################
if [ ! -f "${ScriptsDir}/logs/history_dmlevent.log" ];
then
touch ${ScriptsDir}/logs/history_dmlevent.log #判断是否存在历史文件,如果不存在则创建
echo 'Touch DML History Log Success'
fi
for id in $current_dml_id
do
echo 'CurrentDMLID:'${id}
eventid=`grep $id ${ScriptsDir}/logs/history_dmlevent.log | wc -l` #当前事件id与历史日志匹配
if [ $eventid -gt 0 ]
then
grep $id ${ScriptsDir}/logs/history_dmlevent.log >> ${ScriptsDir}/logs/tmp_dml.log #历史日志存在,从历史日志提取
# 根据当前事件ID从历史日志中提取时间戳
historytime=`grep ${id} ${ScriptsDir}/logs/history_dmlevent.log | awk '{print $1,$2}'`
# 将时间戳转换为UNIXTIME
history_unixtime=`date -d "${datetime}" +%s`
# 获取当前系统时间的UNIXTIME
current_unixtime=`date +%s`
# 如果当前事件总数小于500且历史事件超过1天则写入告警日志
if [ ${totalevent} -lt 500 ] && [ `(expr ${current_unixtime} - ${history_unixtime})` -gt 86400 ]
then
errormessage=`grep $id ${ScriptsDir}/logs/history_dmlevent.log`
echo ${errormessage}
sh ${ScriptsDir}/bin/writeLog.sh EventError "${errormessage}"
echo 'DML Message Write Complate'
fi
else
grep $id ${ScriptsDir}/logs/current_dmlevent.log >> ${ScriptsDir}/logs/tmp_dml.log ##历史日志不存在,从当前日志提取
fi
done
################################DDL EVENT#########################################################
if [ ! -f "${ScriptsDir}/logs/history_ddlevent.log" ];
then
touch ${ScriptsDir}/logs/history_ddlevent.log #判断是否存在历史文件,如果不存在则创建
echo 'Touch DDL History Log Success'
fi
for id in $current_ddl_id
do
echo 'CurrentDDLID:'${id}
eventid=`grep $id ${ScriptsDir}/logs/history_ddlevent.log | wc -l` #当前事件id与历史日志匹配
if [ $eventid -gt 0 ]
then
grep $id ${ScriptsDir}/logs/history_ddlevent.log >> ${ScriptsDir}/logs/tmp_ddl.log #历史日志存在,从历史日志提取
# 根据当前事件ID从历史日志中提取时间戳
historytime=`grep ${id} ${ScriptsDir}/logs/history_ddlevent.log | awk '{print $1,$2}'`
# 将时间戳转换为UNIXTIME
history_unixtime=`date -d "${datetime}" +%s`
# 获取当前系统时间的UNIXTIME
current_unixtime=`date +%s`
# 如果当前事件总数小于500且历史事件超过1天则写入告警日志
if [ ${totalevent} -lt 500 ] && [ `(expr ${current_unixtime} - ${history_unixtime})` -gt 86400 ]
then
errormessage=`grep $id ${ScriptsDir}/logs/history_ddlevent.log`
echo ${errormessage}
sh ${ScriptsDir}/bin/writeLog.sh EventError "${errormessage}"
echo 'DDL Message Write Complate'
fi
else
grep $id ${ScriptsDir}/logs/current_ddlevent.log >> ${ScriptsDir}/logs/tmp_ddl.log ##历史日志不存在,从当前日志提取
fi
done
################################DML STORAGE#######################################################
if [ ! -f "${ScriptsDir}/logs/history_storageevent.log" ];
then
touch ${ScriptsDir}/logs/history_storageevent.log #判断是否存在历史文件,如果不存在则创建
echo 'Touch STORAGE History Log Success'
fi
for id in $current_storage_id
do
echo 'CurrentSTORAGEID:'${id}
eventid=`grep $id ${ScriptsDir}/logs/history_storageevent.log | wc -l` #当前事件id与历史日志匹配
if [ $eventid -gt 0 ]
then
grep $id ${ScriptsDir}/logs/history_storageevent.log >> ${ScriptsDir}/logs/tmp_storage.log #历史日志存在,从历史日志提取
# 根据当前事件ID从历史日志中提取时间戳
historytime=`grep ${id} ${ScriptsDir}/logs/history_storageevent.log | awk '{print $1,$2}'`
# 将时间戳转换为UNIXTIME
history_unixtime=`date -d "${datetime}" +%s`
# 获取当前系统时间的UNIXTIME
current_unixtime=`date +%s`
# 如果当前事件总数小于500且历史事件超过1天则写入告警日志
if [ ${totalevent} -lt 500 ] && [ `(expr ${current_unixtime} - ${history_unixtime})` -gt 86400 ]
then
errormessage=`grep $id ${ScriptsDir}/logs/history_storageevent.log`
echo ${errormessage}
sh ${ScriptsDir}/bin/writeLog.sh EventError "${errormessage}"
echo 'STORAGE Message Write Complate'
fi
else
grep $id ${ScriptsDir}/logs/current_storageevent.log >> ${ScriptsDir}/logs/tmp_storage.log ##历史日志不存在,从当前日志提取
fi
done
#################################################################################
mv ${ScriptsDir}/logs/tmp_dml.log ${ScriptsDir}/logs/history_dmlevent.log
mv ${ScriptsDir}/logs/tmp_ddl.log ${ScriptsDir}/logs/history_ddlevent.log
mv ${ScriptsDir}/logs/tmp_storage.log ${ScriptsDir}/logs/history_storageevent.log
}
main(){
config;
if [ ${gbaseMode} -eq 1 ];
then
echo 'Virtral Type'
event_virtual
elif [ ${gbaseMode} -eq 2 ];
then
echo 'Normal Type'
event_normal
else
echo 'None'
fi
}
main $@
脚本说明:此脚本分多VC版和兼容模式版,可以根据环境的不同执行不同的逻辑,获取gbase8a数据库的ddlevent、dmlevent、和dmlstorageevent三类事件当事件超过1天事件仍未消失则进行告警处理二、和Monitor脚本进行结合
####################GET EVENT COUNT##############################################
f_event_count(){
process=`ps -ef | grep event.sh | grep -v grep | wc -l`
if [ ${process} -eq 0 ];
then
sh event.sh &
else
echo 'Event is runing'
fi
}脚本说明:和mointor脚本进行结合,首先判断上一次event.sh脚本是否运行完成,如果运行完成则本次正常执行,如果未运行完成则跳过热门帖子
- 12025-12-01浏览数:182764
- 22023-05-09浏览数:25062
- 42023-09-25浏览数:18526
- 52020-05-11浏览数:17529