Amoeba 内存溢出的处理(含脚本)

背景:

  1. MySQL 数据库通过 Amoeba 做了读写分离。
  2. Amoeba 是 JAVA 程序,经常出现内存溢出的问题。虽然进行了简单的 JVM 优化,但还是会出现内存溢出的问题。

解决方法:

  1. 使用监控脚本(amoeba_zabbix.sh)将 Amoeba 纳入 Zabbix 监控。当 Amoeba 状态异常时,Zabbix
    发送远程命令,使用重启脚本(amoeba_restart.sh)重启 Amoeba。
  2. 在重启 Amoeba 脚本中,再次使用 mysqladmin 连接 Amoeba 获取 MySQL 状态来判断 Amoeba 是否正常,不正常就重启 Amoeba。

脚本缺陷:

  1. 当 mysqladmin 连接 Amoeba 失败时,会输出如下错误。
mysqladmin: connect to server at '192.168.10.139' failed
error: 'Can't connect to MySQL server on '192.168.10.139' (4)'
Check that mysqld is running on 192.168.10.139 and that the port is 3377.
You can check this by doing 'telnet 192.168.10.139 3377'
  1. 在测试脚本时,对 Amoeba 状态的检测不稳定。

个人建议:

  1. 个人觉得 Amoeba 的性能比较差,不太适用于生产环境,应尽早更换为其他更为稳定的读写分离中间件。

PS:
我的环境:单台服务器上有多个 Amoeba
·

Amoeba 信息文件:amoeba-conf-file

#the config info

#端口
port=3300 3311 3366 3377

#主机
host=192.168.10.139

#3300的用户密码
user-3300=user3300
password-3300=123456

#3311的用户密码
user-3311=user3311
password-3311=123456

#3366的用户密码
user-3366=user3366
password-3366=123456

#3377的用户密码
user-3377=user3377
password-3377=123456

·

重启脚本:amoeba-restart.sh

#!/bin/bash
#script name : amoeba-restart.sh
#author : panbuhei
#amoeba restar script

#全局变量
CONF_FILE="/opt/amoeba-conf-file"
AMOEBA_HOST=`sed -n "/^host=/s/.*=//p" $CONF_FILE`


#判断 amoeba 是否正常,不正常时重启 amoeba
Amoeba_Status (){
  AMOEBA_STATUS=`mysqladmin --connect-timeout=3 -h"$AMOEBA_HOST" -u"$AMOEBA_USER" -p"$AMOEBA_PASSWORD" -P"$port" ping | awk '{print $3}'`
  if [ "$AMOEBA_STATUS" == alive ];then
    echo "amoeba-$port running"
  else
    sleep 3
    echo "restart amoeba-$port"
    Restart_Amoeba
  fi
}

#重启 amoeba 函数
Restart_Amoeba (){
  "$AMOEBA_PATH"/bin/shutdown
  sleep 1
  Kill_Amoeba
  "$AMOEBA_PATH"/bin/launcher
}
#注意:amoeba启动时默认会在终端输出日志,需要在launcher中注释最后一行

#shutdown 未关闭 amoeba 时,kill 函数
Kill_Amoeba (){
  AMOEBA_PID=`ps -ef | grep "$AMOEBA_PATH" | grep -v grep | grep java |awk '{print $2}'`
  if [ ! -z "$AMOEBA_PID" ];then
    kill -9 "$AMOEBA_PID"
	sleep 1
  fi
}

for port in `sed -n "/^port=/s/.*=//p" $CONF_FILE`
do
  #获取局部变量
  AMOEBA_USER=`sed -n "/^user-$port=/s/.*=//p" $CONF_FILE`
  AMOEBA_PASSWORD=`sed -n "/^password-$port=/s/.*=//p" $CONF_FILE`
  AMOEBA_PATH=/usr/local/amoeba-$port
  
  #执行函数
  Amoeba_Status
done > /tmp/amoeba-restart.log

exit 0

·

监控脚本:amoeba-zabbix.sh

#!/bin/bash
#script name : amoeba-zabbix.sh
#author : panbuhei
#describe : amoeba monitor script in zabbix

#全局变量
CONF_FILE=/opt/amoeba-conf-file
AMOEBA_HOST=`sed -n "/^host=/s/.*=//p" $CONF_FILE`


#判断 amoeba 是否正常,正常时输出 0
Amoeba_Status (){
  AMOEBA_STATUS=`mysqladmin --connect-timeout=3 -h"$AMOEBA_HOST" -u"$AMOEBA_USER" -p"$AMOEBA_PASSWORD" -P"$port" ping | awk '{print $3}'`
  if [ "$AMOEBA_STATUS" == alive ];then
    A=0
  else
    A=1
  fi
}


Amoeba_For (){
  B=0
  for port in `sed -n "/^port=/s/.*=//p" $CONF_FILE`
  do
    #获取局部变量
    AMOEBA_USER=`sed -n "/^user-$port=/s/.*=//p" $CONF_FILE`
    AMOEBA_PASSWORD=`sed -n "/^password-$port=/s/.*=//p" $CONF_FILE`
    AMOEBA_PATH=/usr/local/amoeba-$port
    
    #执行函数
    Amoeba_Status
    let "B = B + A"
  done
  
  echo $B
}

case $1 in
  status)
  Amoeba_For
  ;;
esac

·

添加 amoeba 监控项

配置 zabbix_agent

# zabbix_agentd.conf
#添加
UserParameter=amoeba[*],/usr/local/zabbix-2.4.7/etc/scripts/amoeba-zabbix.sh $1

#重启 zabbix_agentd

zabbix_get 测试是否拿得到数据

#在 zabbix_server上测试
[root@zabbix ~]# zabbix_get -s 192.168.10.139 -k amoeba[status]

在 zabbix_web 上创建监控项

在这里插入图片描述

查看最新数据

在这里插入图片描述

创建触发器

在这里插入图片描述

创建触发器动作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果有发现不合理的地方,欢迎评论,共同进步!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值