Chinaunix首页 | 论坛 | 博客
  • 博客访问: 809531
  • 博文数量: 167
  • 博客积分: 7173
  • 博客等级: 少将
  • 技术积分: 1671
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-04 23:07
文章分类

全部博文(167)

文章存档

2018年(1)

2017年(11)

2012年(2)

2011年(27)

2010年(88)

2009年(38)

分类: 系统运维

2010-08-26 22:22:01


上一篇日志中介绍了上一次遇到的memcache的问题:
上一次故障是:
后端的一台机器中的memcache给误停,刚才那个相关应用没做相关处理导致页面有地方出不了页面,并
很慢。
上次解决的办法是:改善应用代码,增加memcache的监控程序。



这段时间遇到的问题:

后端其中一台memcach机器e,可能因为负载高,或温度高 造成系统假死;
应用花在网络的时间,和连接停留在memcache的时间比较多;造成
应用响应慢或响应不过来,监控程序简单到三次应用有问题自动重启
应用(resin),但在memcache机器没恢复过程中,情况持续。

参考之前弄的一个nginx自动摘除后端机器的原理,弄一个不需重启应用
的摘除程序。

要处理memcache事件,要依赖点memcache客户端;
memcache的客户端有:
C : libmemcache  (libmemcache 解压后的主目录下面clients目录有不少监控memcache的好工具)
     安装方式./configure && make && make install
     引用#include (好像是这样,有兴趣的朋友可以上网搜索一下很多)
     看评论效率不怎样
    
Python : cmemcachm pylibmc
     只简单用过pylibmc
     python setup.py build && python setup.py install
     调用:
         import pylibmc 
        
mc = pylibmc.Client(["127.0.0.1:11211"])
         mc.set("MCHEATHY_STATS""OK"

         mc.get("MCHEATHY_STATS")
    
Java  :  java_memcached-release_2.1.13.jar
     不需要安装,但同时需要log4j的jar包。
Perl : cache:memcache
     对perl不太熟悉只能提供连点了
  • Cache::Memcached - search.cpan.org
    perl cache:memcached 参考的文章:http://kiddymeet.blog.51cto.com/20194/380017




本人这边服务器上的情况是:
1.存在一个运维平台,这个平台能上传一些监控插件(只能单独一个文件),上传后能按需分发
2.各服务器上没有相关的memcache客户端
3.各动态应用服务器上是resin或仅有的weblogic
4.面临的环境是不能安装memcache客户端,并要在一个脚本里面完成监控工作
5.在resin的家目录下有这样的一个目录pconline_plugin,里面放的是自主开发的jar,resin插件

C和python的客户端要进行安装,对perl暂时不太熟悉,并动态应用上有相应的java环境,所以选择java

检测机制:
mcheathychk.jar先写一个值到mc中,然后立刻取出
连接不上,插不进数据,去不出数据都认为mc不正常要摘除

工作流程:
1.读取监控文件(该文件是应用上线的时候填写好)中正在服务器的动态应用
2.读取相应应用所配置的mc servers
3.对每个mc server 利用检测机制进行检测
4.如果mc server有问题使用iptables进行把目的为改server和端口的数据包进行抛弃
5.检测所有server
6.检测所有应用

PS:
今天做了一些测试使用iptables  reject掉数据包不影响mc的速度,也不存在应用死等mc的情况

代码:
#!/bin/bash
#author Sky
PATH="/var/PROGRAM/MANAGEMENT/modules/xbash:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:"
LANG=zh_CN
export PATH LANG

RESINHOME="/data/resin-pro-3.1.8"
PLUGIN_HOME=$RESINHOME/pconline_plugin

JAVAHOME="/usr/java/jdk1.6.0_06"

PLUGIN_MC="java_memcached-release_2.0.1.jar"
PLUGIN_LOG4J="log4j-1.2.15.jar"
PLUGIN_NAME="mcheathychk.jar"

#############enviroment initialize###################
[[ ! -e $JAVAHOME/jre/lib/ext/$PLUGIN_MC ]] && cp $RESINHOME/pconline_plugin/$PLUGIN_MC $JAVAHOME/jre/lib/ext/
[[ ! -e $JAVAHOME/jre/lib/ext/$PLUGIN_LOG4J ]] && cp $RESINHOME/pconline_plugin/$PLUGIN_LOG4J $JAVAHOME/jre/lib/ext/
####################################################


############
# 主机信息 #
############
INTF=$(netstat -rn | tail -1 | awk '{print $NF}')
IP=$(ifconfig $INTF | awk '/inet addr/{ split($2,tmp,":") ; print tmp[2] }')
HOST_NAME=$(hostname --short)

##########
#邮件环境#
##########
#CHARTSET="zh_CN."
MAIL_CLIENT=""
MAIL_SENDER=""
MAIL_SERVER=""
case $IP in
192.168.230.*|192.168.1[0-1].*|192.168.238.*|202.9.1.*)
MAIL_SERVER="202.2"
;;
*)
MAIL_SERVER="192.168.8."
;;
esac
##########

for resin in `cat /etc/mods.conf | grep resind | grep -v "#" | awk -F":" '{print $2}' | xargs`
do
######get relate configuration#####################
JAVAHOME=`cat $resin | grep "JAVA_HOME=" | awk -F"=" '{print $2}'`
RESINHOME=`cat $resin | grep "RESIN_HOME=" | awk -F"=" '{print $2}'`
CONF_NAME=`cat $resin | grep "SEARCH_STR=" | awk -F"=" '{print $2}' | sed 's/\"//g'`
APP_HOME=`cat $RESINHOME/conf/$CONF_NAME | grep "##g"`
CONF_MC=$APP_HOME/WEB-INF/classes/memcached.properties
###################################################
if [[ -e $CONF_MC ]] ; then
servers=`cat $CONF_MC | grep "servers" | awk -F"=" '{print $2}'`
for server in `echo $servers | awk -F"," '{for( i=0;i<$NF;i++) {print $((i+1))}}' | xargs`
do
#echo $server
echo $server | awk -F":" '{print $1,$2}' | \
while read dip port
do
if /sbin/iptables -nL | grep -q "$dip"
then
######解封###############
/sbin/iptables -D OUTPUT -p tcp -s $IP -d $dip --dport $port -j REJECT --reject-with tcp-reset 2> /dev/null
fi
done
##############Test Memcache################
stats=`$JAVAHOME/bin/java -jar $RESINHOME/pconline_plugin/$PLUGIN_NAME $server 2> /dev/dull`
#echo "stats="$stats
if [[ $stats == "MCOK" ]] ; then
agentname=`echo $resin | awk -F"_" '{print $2}'`
echo "mcchk_$agentname=0"
else
agentname=`echo $resin | awk -F"_" '{print $2}'`
echo $server | awk -F":" '{print $1,$2}' | \
while read dip port
do
/sbin/iptables -A OUTPUT -p tcp -s $IP -d $dip --dport $port -j REJECT --reject-with tcp-reset
done
echo "mcchk_$agentname=1"
echo $agentname"_"$server" is bad" | env MAILRC=/dev/null charset="$CHARTSET" from="$MAIL_SENDER" smtp="$MAIL_SERVER" \
nail -n -s "$HOST_NAME($IP)MC had bad information" $MAIL_CLIENT
fi
done
else
agentname=`echo $resin | awk -F"_" '{print $2}'`
echo "mcchk_$agentname=0"
break
fi
done


文件:pconline_plugin.zip
大小:407KB
下载:下载
脚本中echo输出的信息是返回个运维平台,不需要理会,可按需修改。

PS:nginx也是参考这套流程进行做摘除,效果不错。




PS:memcache客户端
阅读(1711) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~