zoukankan      html  css  js  c++  java
  • Zabbix 3.2.6-Mysql多实例监控-Percona Monitoring Plugins自动发现

    mysql多实例监控实录
     
    系统环境:
    cat /etc/redhat-release
    CentOS Linux release 7.3.1611 (Core)
    内核版本:
    uname -r
    3.10.0-514.el7.x86_64
    docker版本:
    docker -v
    Docker version 1.12.6, build 3a094bd/1.12.6
    docker 相关镜像版本:
    docker.io/zabbix/zabbix-web-nginx-mysql latest
    docker.io/zabbix/zabbix-server-mysql latest
    docker.io/mysql 5.7
    被监控mysql应用版本:
    mysql-5.7.17-linux-glibc2.5-x86_64
    Percona Monitoring Plugins版本:
     
    写在最前:如果zabbix server和zabbix agent已经通过其他方式安装,可以直接跳过1、2步,直接从第3步开始看。
     
    1、zabbix服务端我们运行在docker容器内
    所以服务器端先安装docker服务
    yum install -y epel-release
    yum install -y docker #centos6.x版本的命令是yum install -y docker-io
     
    然后运行docker服务
    systemctl start docker
    docker加入开机自启动
    systemctl enable docker
    查看docker是否成功启动
    systemctl status docker
    注:使用docker需要使用加速器,否则那龟速,自己体会吧。加速器daocloud和阿里云都可以,我使用的前者。
     
    2.安装相关容器
    2.1. mysql 容器
    docker run --name mysql-server -t
          -e MYSQL_DATABASE="zabbix"
          -e MYSQL_USER="zabbix"
          -e MYSQL_PASSWORD="ywwd.net"
          -e MYSQL_ROOT_PASSWORD="ywwd.net"
          -v /data/container/mysql/zabbix:/var/lib/mysql
          -v /etc/localtime:/etc/localtime:ro
          --restart=always
          -d mysql:5.7
          --character-set-server=utf8 --collation-server=utf8_general_ci --sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
     
    2.2. zabbix-server 容器
    docker run --name zabbix-server-mysql -t
          -e DB_SERVER_HOST="mysql-server"
          -e MYSQL_DATABASE="zabbix"
          -e MYSQL_USER="zabbix"
          -e MYSQL_PASSWORD="ywwd.net"
          -e MYSQL_ROOT_PASSWORD="ywwd.net"
          --link mysql-server:mysql
          -p 10051:10051 --restart=always
          -v /etc/localtime:/etc/localtime:ro
          -d zabbix/zabbix-server-mysql:latest
     
    2.3. zabbix-web 容器(nginx)
    docker run --name zabbix-web-nginx-mysql -t
          -e DB_SERVER_HOST="mysql-server"
          -e MYSQL_DATABASE="zabbix"
          -e MYSQL_USER="zabbix"
          -e MYSQL_PASSWORD="ywwd.net"
          -e MYSQL_ROOT_PASSWORD="ywwd.net"
          --link mysql-server:mysql
          --link zabbix-server-mysql:zabbix-server
          -v /etc/localtime:/etc/localtime:ro
          -p 80:80
          --restart=always
          -d zabbix/zabbix-web-nginx-mysql:latest
     
    注意:这里有个小问题,zabbix-web-nginx-mysql的启动脚本/run_zabbix_component.sh中,指定了时区,不是中国的Asia/Shanghai,所以我们要进入zabbix-web-nginx-mysql进行修改
    2.4. 修改zabbix-web的时区
    docker exec -it zabbix-web-nginx-mysql /bin/bash
    TZ=${TZ:-"Asia/Shanghai"} 这里改为Asia/Shanghai,否则zabbix-web端的时间会慢5个小时
    sed -in 's#Europe/Riga#Asia/Shanghai#g' /run_zabbix_component.sh
    修改时区后,需要重启容器
    docker restart zabbix-web-nginx-mysql
    2.5. 在firewall防火墙放开zabbix-server和zabbix-agent的服务端口号
    firewall-cmd --permanent --add-port=10050-10051/tcp
    #--permanent永久生效,10050zabbix-agent服务端口,10051zabbix-server服务端口
    firewall-cmd --reload
    #更改后需要重新加载firewall防火墙
    firewall-cmd --list-all
    #最后查看配置是否生效
     
    这样zabbix-server端就已经安装完毕
    接下来客户端我们采用rpm包进行安装
    rpm -ivh zabbix-agent-3.2.6-1.el7.x86_64.rpm
    同样需要放开zabbix-agent端口
    firewall-cmd --permanent --add-port=10050/tcp
    firewall-cmd --reload
     
    然后对zabbix-agent端进行配置
    egrep -v '^$|^#' /etc/zabbix/zabbix_agentd.conf
    PidFile=/var/run/zabbix/zabbix_agentd.pid
    LogFile=/var/log/zabbix/zabbix_agentd.log
    Server=10.0.0.106 # <====zabbix-server端的IP地址
    ServerActive=10.0.0.106 #<====zabbix-server端的IP地址,主动方式
    Hostname=10.0.0.107 #<====zabbix-agent端的IP地址或者主机名
    Include=/etc/zabbix/zabbix_agentd.d/*.conf
     
    然后在zabbix-server端的web界面进行主机添加
     
    1)修改主机名称,要跟zabbix-agent的配置文件中的Hostname相对应
    2)选择你想设置的群组,如果群组不存在,可以在下面一栏新的群组中进行添加
    3)指定zabbix-agent端的IP地址或者域名(端口号一般变)
    其他保持默认,点击添加即可
     
    3、利用Percona Monitoring Plugins插件进行MySQL多实例的监控
    1)percona监控zabbix的脚本是使用php写的,所以需要准备好php运行环境,这里直接用yum安装就可以满足要求了:
    yum install -y php php-mysql
    2)安装percona-zabbix-templates
     
    也可配置Percona yum仓库后安装,建议配置percona的yum源,因为作为一个DBA你肯定会用到percona toolkit套件。 注:我没有用这种方式,percona toolkit我是通过源码包安装的。
    yum install -y https://www.percona.com/redir/downloads/percona-release/redhat/latest/percona-release-0.1-3.noarch.rpm
    yum install -y percona-zabbix-templates
     
    4、yum安装的shell为单实例版,所以我们要进行相关修改,这里已经有小伙伴进行了修改,我们直接克隆,进行对比,需要先安装git
     
    1)对比后,我们发现在get_mysql_stats_wrapper.sh脚本中,添加了相关参数
    PORT=$2
    HOST=127.0.0.1
     
    2)CMD="/usr/bin/php -q $DIR/ss_get_mysql_stats.php --host $HOST --items $ITEM --port $PORT"
    CMD变量的php路径一定要指定正确,否则会报错,我们在后面添加了 --port $PORT
    CACHEFILE改为判断
    if [ $PORT == 3306 ];then
    CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt"
    else
    CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt":$PORT
    fi
     
    3)running-slave进行如下修改,此处报警跟模板中的另一个Slave Stopped是重叠的,不过这个比Slave Stopped要灵敏,大概提前3分钟左右报警,不过需要在/etc/my.cnf以及脚本中添加mysql的账号和密码等信息,各有利弊吧
     
    if [ "$ITEM" = "running-slave" ]; then
    # Check for running slave
    RES=`HOME=~zabbix /usr/local/mysql/bin/mysql -P$PORT -h127.0.0.1 -uzabbix -e 'SHOW SLAVE STATUSG' | egrep '(Slave_IO_Running|Slave_SQL_Running):' | grep -i yes|wc -l `
    if [ "$RES" -ne 2 ]; then
    echo 1
    else
    echo 0
    fi
    exit
    并在/etc/my.cnf中添加
    [mysql]
    password=123456 #存在安全隐患,但是如果把权限改小,可能会获取不到值,因为是通过zabbix用户去运行的脚本,里面只是密码,而且账号只能本机登录,所以问题也不大,但是要严格控制其他3个shell脚本的权限。
     
    4)#cat $CACHEFILE | sed 's/ / /g; s/-1/0/g'| grep $ITEM | awk -F: '{print $2}'
    这一列改为:
    cat $CACHEFILE | sed 's/ / /g'| grep $ITEM | awk -F: '{print $2}' 或者
    cat $CACHEFILE | sed 's/ / /g; s/-1/1/g'| grep $ITEM | awk -F: '{print $2}'
    改为第一个,在zabbix-server的web端配置报警阈值为小于0,或者等于1的时候报警,
    改为第二行,可以统一设置报警阈值为等于1,因为这个问题,困扰了我好久
     
    5、修改自动发现脚本
    cat mysql_low_discovery.sh
    #!/bin/bash
    #Fucation:mysql low-level discovery
    #Script_name mysql_low_discovery.sh
    discovery() {
    port=($(sudo ss -tpln | awk -F "[ :]+" '/[m]ysql/ {print $4}'))
    printf '{ '
    printf ' "data":[ '
    for key in ${!port[@]}
    do
    if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
    socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $9}'|cut -d ' ' -f 1`
    printf ' { '
    printf " "{#MYSQLPORT}":"${port[${key}]}"}, "
    else [[ "${key}" -eq "((${#port[@]}-1))" ]]
    socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $9}'|cut -d ' ' -f 1`
    printf ' { '
    printf " "{#MYSQLPORT}":"${port[${key}]}"} "
    fi
    done
    printf ' ] '
    printf '} '
    }
    discovery
     
    注意:由于此处使用了 sudo ,所以要把zabbix用户加上sudo权限,且只能执行 ss命令
    echo 'zabbix ALL=(ALL) NOPASSWD:/usr/sbin/ss'>>/etc/sudoers
     
    修改ss_get_mysql_stats.php脚本
    $mysql_user = 'zabbix'; <=====此为php登录mysql的用户
    $mysql_pass = 123456; <=====此为php登录mysql的密码
    $mysql_port = NULL; <=====端口和socket要改为NULL
    $mysql_socket = NULL;
     
    修改userparameter_percona_mysql.conf 配置文件
    把每行中的逗号',' 替换为[*],
    sed -in 's#,#[*],#g' userparameter_percona_mysql.conf
    在每行后面添加 $1
    sed -in 's#$#$1#g' userparameter_percona_mysql.conf
    最后在首行添加端口自动发现脚本
    sed -in '1i UserParameter=MySQL.discovery,/bin/bash /var/lib/zabbix/percona/scripts/mysql_low_discovery.sh' userparameter_percona_mysql.conf
     
    6、复制脚本文件并执行权限
    mkdir -p /var/lib/zabbix/percona/scripts/
    cp userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/
    cp get_mysql_stats_wrapper.sh /var/lib/zabbix/percona/scripts/
    cp mysql_low_discovery.sh /var/lib/zabbix/percona/scripts/
    cp ss_get_mysql_stats.php /var/lib/zabbix/percona/scripts/
    chmod 700 /var/lib/zabbix/percona/scripts/*
    chown -R zabbix. /var/lib/zabbix/
    7、最后一定要在所有的库上面做授权操作,否则拿不到监控数据
    GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT ON *.* TO 'zabbix'@'localhost' identified by '123456';
    flush privileges;
     
    8、最后把模板Mysql_Multiport.xml导入到zabbix-server内,所有用到的脚本文件都已经添加到附件中,大家可以下载使用。
    创建触发器原型
     
    在zabbix-server端,添加触发器
    依次点击 主机===>自动发现===>触发器类型===>点击右上角的创建触发器原型
    分配报警级别,点击表达式栏的添加,选择选择原型
    然后选择 例如:MySQL.slave-stopped[{#MYSQLPORT}]
    选择最新的T值小于N
    N为0
    注:如果在第4.4中指定的是cat $CACHEFILE | sed 's/ / /g; s/-1/1/g'| grep $ITEM | awk -F: '{print $2}'
    选择最新的T值等于N
    N为1
     
    然后我们可以手动停止主从复制,稍等片刻,就会发了报警信息
     
    博客园不允许放附件,所以我只能把附件放在百度云了
    http://pan.baidu.com/s/1slFGVoT
     
    参考文章:
    https://github.com/hc-dba/Mysql_Multiport_monitor_used_zabbix
     
    另外可以添加微信和邮件告警,这里推荐下面的博文
     
  • 相关阅读:
    c++读取文本文件
    C++在设计和使用智能指针
    spring mvc 控制器方法传递一些经验对象的数组
    unity3D实际的原始视频游戏开发系列讲座10它《战斗:外来入侵》在第一季度游戏开发
    Docker安装应用程序(Centos6.5_x64)
    VC和gcc在保证功能static对线程安全的差异变量
    POJ 1252 Euro Efficiency
    extjs_03_grid(添加数据)
    BZOJ 1212 HNOI2004 L语言 AC自己主动机(Trie树)+动态规划
    OpenGL开发时,fatal error C1083: 无法打开包括文件:“glglut.h”: No such file or directory
  • 原文地址:https://www.cnblogs.com/guoyishen/p/6891953.html
Copyright © 2011-2022 走看看