[Shell Command] MySQL集群全局一览表【源码】
来源:互联网 发布:多功能网络表 编辑:程序博客网 时间:2024/06/17 00:43
author:skate
time:2015/01/19
为了大家可以直接下载使用此脚本,今天特意把代码修改成通用版本。
MySQL集群全局一览表
用法:
# monrep -h
Usage: monrep [-d dbname ]
-d Database Cluster name
-h Display basic help
#
例如我的一个集群名为dbx,那使用如下:
# monrep -d dbx
实现目的:
当主机比较多,而你又想查看一个MySQL集群内所有主机的和replication的基本实时情况时,就比较麻烦,如果你登录每个主机去查看,那太out了,一般
可以通过监控平台去全局查看(如果有的话)。我这里为了方便,直接在路由机上用命令查看,类似上面情况,
实现语言:linux shell
运行条件:
1.路由机到集群任何机器是ssh可信任的
2.MySQL用户可以从路由机远程登录到任何MySQL Server
3.需要修改monrep的MySQL的用户名,密码,端口号和网卡类型(如eth0或bond0等,可以自己用cat /proc/net/dev 查看下)
4.把集群的主机名或ip地址填写到配置文件中,格式如下:
# more /tmp/monmysql/config.txt
[dby]
ip1
ip2
ip3
[/dby]
[dbx]
hostname1
hostname2
hostname3
[/dbx]
特点:
1.每两秒刷新一次
2.为了提高展现的速度,这里用一个含有40个进程的进程池实现并发(尽量规避网络因素)采集所有主机信息
3.为了提供多用户同时使用,采用每次运行的pid命名的临时文件来保存临时信息
Shell 源码:
#!/bin/sh ## Author:Skate# Time:2015/01/16# Function: all mysql replication monitor# define variablesCURPID=$$DIR=/tmp/monmysqlSERVERS_ALLFILE=${DIR}/${CURPID}_allhost.list#NODES=37USER=rootPASSWD=pwdPORT=3306NETTIMER=2INTERFACE=eth0# config informationCFG=$DIR/config.txtCFGPID=$DIR/${CURPID}_configSCRIPTNAME=$(basename "$0")# clean files for muti-person run this scriptfor pid in `ls -l $DIR/ | grep -v total |awk '{print $9}'|grep '_'|awk -F'_' '{print $1}' | uniq`doNUM=`ps -ef | awk '{ print $2 }' | grep -E '^${pid}$' | wc -l`if [ $NUM -ge 0 ] ; thenrm -rf $DIR/${pid}*fidone############################################################################## Display usage message and exit#############################################################################usage() { cat <<EOFUsage: $SCRIPTNAME [-d dbname ] -d Database name -h Display basic helpEOF exit 0}# Parse parameterswhile getopts ":d:h" opt; do case $opt in d ) DBFLAG=$OPTARG ;; h ) usage ;; \?) echo "Invalid option: -$OPTARG" echo "For help, type: $SCRIPTNAME -h" exit 1 ;; : ) echo "Option -$OPTARG requires an argument" echo "For help, type: $SCRIPTNAME -h" exit 1 ;; esacdoneshift $(($OPTIND - 1))# create temporary directoryif [ ! -d "$DIR" ] ; then mkdir "$DIR" fi # The remote server data acquisitionfunction servermon(){ HOST=$1 CMD="cat /proc/loadavg | awk '{print \$1}'; mysql -u${USER} -p${PASSWD} -e 'show slave status \G' | grep -E 'Seconds_Behind_Master|Running:' | awk '{print \$2}';netstat -natp | grep :${PORT} | wc -l;cat /proc/meminfo|grep MemFree|awk '{print \$2/1024}'|cut -d. -f1;cat /proc/net/dev | grep '${INTERFACE}' | sed -e 's/\(.*\)\:\(.*\)/\2/g' | awk '{print \$1}';cat /proc/net/dev | grep '${INTERFACE}' | sed -e 's/\(.*\)\:\(.*\)/\2/g' | awk '{print \$9}';sleep ${NETTIMER} ;cat /proc/net/dev | grep '${INTERFACE}' | sed -e 's/\(.*\)\:\(.*\)/\2/g' | awk '{print \$1}';cat /proc/net/dev | grep '${INTERFACE}' | sed -e 's/\(.*\)\:\(.*\)/\2/g' | awk '{print \$9}';" SERVER_TEMLATE=$DIR/${CURPID}_${HOST}.log ssh $HOST "$CMD" > $SERVER_TEMLATE 2>&1 sed -i '/Warning/d' $SERVER_TEMLATE LOAD=`cat $SERVER_TEMLATE|sed -n '1p'` IO_STATUS=`cat $SERVER_TEMLATE|sed -n '2p'` SQL_STATUS=`cat $SERVER_TEMLATE|sed -n '3p'` BEHINDS=`cat $SERVER_TEMLATE|sed -n '4p'` SESS=`cat $SERVER_TEMLATE|sed -n '5p'` MEMFREE=`cat $SERVER_TEMLATE|sed -n '6p'` IN_OLD=`cat $SERVER_TEMLATE|sed -n '7p'` OUT_OLD=`cat $SERVER_TEMLATE|sed -n '8p'` IN=`cat $SERVER_TEMLATE|sed -n '9p'` OUT=`cat $SERVER_TEMLATE|sed -n '10p'` DIF_IN=$(((IN-IN_OLD)/NETTIMER/1024)) DIF_OUT=$(((OUT-OUT_OLD)/NETTIMER/1024)) printf "|%${HOSTNAME_WIDTH}s|" $HOST printf "%5s|" $LOAD printf "%9s|" $MEMFREE printf "%9s|" $DIF_IN printf "%9s|" $DIF_OUT printf "%7s|" $SESS printf "%7s|" $IO_STATUS printf "%7s|" $SQL_STATUS printf "%9s|\n" $BEHINDS }# Thread taskfunction subthread(){ HOST=$1 SERVERS_FILE=$DIR/${CURPID}_${HOST}.list servermon $HOST > $SERVERS_FILE}function readcfg(){FIELD=$DBFLAGfirst=`sed -n "/\[$FIELD\]/=" $CFG`last=`sed -n "/\[\/$FIELD\]/=" $CFG`sed -n "$((first+1)),$((last-1))p" $CFG > $CFGPID sed -i '/^$/d' $CFGPID}# Simulation of multi threadtmp_fifofile="$DIR/$.fifo"mkfifo $tmp_fifofileexec 6<>$tmp_fifofilerm $tmp_fifofilethread=40for (( i=0;i<$thread;i++ )); doechodone >&6# clear screenclearwhile truedoreadcfg# The number of hostsNODES=`cat $CFGPID | wc -l`# hostname column widthHOSTNAME_WIDTH=`awk '{if(length($1)>s){s=length($1);l=NR}}END{print s}' $CFGPID`for (( i=1;i<=$NODES;i++ )); doread -u6{ for h in `cat $CFGPID` do HOST=$h subthread $HOST echo >&6 done}&donewaitsleep 3for (( i=1;i<=$NODES;i++ )); do HOST=`sed -n "${i}p" $CFGPID` SERVERS_FILE=$DIR/${CURPID}_${HOST}.list if [ $(($i%${NODES})) -eq 1 ] ; then printf "******************************************\n" > $SERVERS_ALLFILE printf "MySQL Cluster(Demandforce) Real-Time View\n\n\n" >> $SERVERS_ALLFILE printf "******************************************\n" >> $SERVERS_ALLFILE printf "|%${HOSTNAME_WIDTH}s|" 'hostname' >> $SERVERS_ALLFILE printf "%5s|" 'load' >> $SERVERS_ALLFILE printf "%9s|" 'mfree(M)' >> $SERVERS_ALLFILE printf "%9s|" 'netin(K)' >> $SERVERS_ALLFILE printf "%9s|" 'netout(K)' >> $SERVERS_ALLFILE printf "%7s|" 'sess' >> $SERVERS_ALLFILE printf "%7s|" 'io_run' >> $SERVERS_ALLFILE printf "%7s|" 'sql_run' >> $SERVERS_ALLFILE printf "%9s|\n" 'behind' >> $SERVERS_ALLFILE cat $SERVERS_FILE >> $SERVERS_ALLFILE else cat $SERVERS_FILE >> $SERVERS_ALLFILE fi done# delete blank linessed -i '/^$/d' $SERVERS_ALLFILE# print info to screenclearcat $SERVERS_ALLFILEdoneexec 6>&-
--------end--------
- [Shell Command] MySQL集群全局一览表【源码】
- mysql的command line shell的问题
- Shell命令一览表
- Shell命令一览表
- command shell(flume command)
- shell command
- mysql源码安装shell脚本
- VS.net 2005快捷键一览表 全局”快捷键
- mysql存储过程一览表
- LAMP--源码MySQL集群版搭建
- Linux集群安装MySQL---属于源码安装
- mysql command
- MySQL Command
- MySql Command
- MYSQL Command
- Mysql command
- mysql command
- mysql command
- udev的实现原理
- android常用权限
- 要获得表中每一个时间time对应的f_value的最大值,该sql应该如何实现
- ios AfNetWoring 上传多张图片
- NANDFlash结构图解
- [Shell Command] MySQL集群全局一览表【源码】
- Java注解@interface (入门)
- online_judge_1046
- 百度地图开发
- Remove Duplicates from Sorted Array II
- Android.mk简介
- android canva画人
- online_judge_1047
- Android UI开发第三十五篇——AppCompat实现Action Bar