背景:
- MySQL 数据库通过 Amoeba 做了读写分离。
- Amoeba 是 JAVA 程序,经常出现内存溢出的问题。虽然进行了简单的 JVM 优化,但还是会出现内存溢出的问题。
解决方法:
- 使用监控脚本(amoeba_zabbix.sh)将 Amoeba 纳入 Zabbix 监控。当 Amoeba 状态异常时,Zabbix
发送远程命令,使用重启脚本(amoeba_restart.sh)重启 Amoeba。 - 在重启 Amoeba 脚本中,再次使用 mysqladmin 连接 Amoeba 获取 MySQL 状态来判断 Amoeba 是否正常,不正常就重启 Amoeba。
脚本缺陷:
- 当 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'
- 在测试脚本时,对 Amoeba 状态的检测不稳定。
个人建议:
- 个人觉得 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 上创建监控项
查看最新数据
创建触发器
创建触发器动作
如果有发现不合理的地方,欢迎评论,共同进步!!!