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脚本是否运行完成,如果运行完成则本次正常执行,如果未运行完成则跳过

评论

登录后才可以发表评论
崔哥发表于 2个月前
楼上黄昏欲望休,玉梯横绝月中钩。芭蕉不展丁香结,同向春风各自愁。东南日出照高楼,楼上离人唱石州。总把春山扫眉黛,不知供得几多愁?
用户头像
levvel发表于 2个月前
进来看看,应该有收获