环境: | centos6.6 | zabbix-2.4.5 | mysql-5.6.24 |
zabbix没有自带对mysql的监控模板,网上许多模板也都是固定的监听某端口,不够灵活,如果mysql的端口很多记不清楚的话,我们就应该以lld(low level discovery)方式监控mysql。
步骤:
一、客户端
1、监控内容的json化
在客户端里,需要把监控的内容json化展示,然后服务端可以通过正则来过滤出结果。下面在是我的json监控mysql的json展示:
脚本内容如下:
#Fucation:mysql low-level discovery #Script_name mysql_low_discovery.sh mysql() { port=($(sudo ss -tnlp | grep mysql | awk -F "[ :]+" '{print $4}')) printf '{\n' printf '\t"data":[\n' 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 $10}'|cut -d ' ' -f 1) printf '\t {\n' printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"},\n" else [[ "${key}" -eq "((${#port[@]}-1))" ]] socket=$(ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $10}'|cut -d ' ' -f 1) printf '\t {\n' printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"}\n" fi done printf '\t ]\n' printf '}\n' } $1
如果想让脚本可以用zabbix的身份获取数据,还要做以下四步操作:
chown zabbix.zabbix mysql_low_discovery.sh chmod +x mysql_low_discovery.sh echo "zabbix ALL=(root) NOPASSWD:/usr/sbin/ss" >> /etc/sudoers sed -i 's/^Defaults.*.requiretty/#Defaults requiretty/' /etc/sudoers
最后把脚本放到一个zabbix用户允许访问的目录, 定义UserParameter的时候路径保持一致就可以了。
2.自定义键值
在客户端修改配置文件zabbix_agentd.conf,添加一下内容:
UserParameter=zabbix_low_discovery[*],/bin/bash /usr/local/zabbix-2.4.5/script/mysql_low_discovery.sh $1 UserParameter=mysql_stats[*],/usr/local/mysql/bin/mysql --login-path=local -e "show global status"| grep "\<$2\>"| cut -f2
这里遇到一个坑要提前说一下,对于mysql5.6以上的版本来讲,直接使用mysql -uxxx -pxxx -e "show global status"等直接输入密码的命令会有警告:
Warning: Using a password on the command line interface can be insecure.
这条警告会直接导致zabbix服务器端不能识别mysql_stats[*]的值,解决方法是使用mysql自带的mysql_config_editor 工具:
mysql_config_editor set --login-path=local --host=127.0.0.1 --user=username --password 回车会提示输入密码
然后我们在脚本中就可以使用:
mysql --login-path=local -e "statement"
代替
mysql -u username -p pass -e "statement"
3.Mysql授权查询功能的账号
grant select on *.* to USERNAME@'127.0.0.1' identified by "PASSWORD"; flush privleges;
4.重启zabbix客户端
killall zabbix_agentd /usr/local/zabbix/sbin/zabbix_agentd
5.测试
先测试脚本和命令:
再测试客户端能不能获取键值:
最后测试服务器端能不能获取键值:
注意:zabbix接收的数据格式一定是JSON格式的,而且形式必须为:
{ "data":[ { "{#键}":"值"} ] }
二、服务端
1.创建模板
2.设置发现规则
3.设置正则
4.创建发现项
5.创建发现项的触发器
6.给需要的项绘图
7.将模板链接到mysql服务器
8.注意事项
(1)发现规则设置更新时长为1小时
为什么设置3600秒?原因是如果设置时间过短, keepalived简介 首先简单介绍一下VRRP协议(虚拟路由器冗余协议)。VRRP是一种容错协议,它可以将一组路由器组织成一个虚拟路由器,这个虚拟路由器仅适用一个IP地址,这个IP地址配置在其中的一台路由器上,这个路由器即为主路由器(MASTER),其余的为备用路由器(BACKUP)。如果这个路由器组内的MASTER路由器出现故障了,BACKUP路由器将会通过选举策略选出一个新的MASTER路由器继续向外提供服务。这样就保证了网络之间的通信不会中断。 keepalived即采用了VRRP协议实现服务器的高可用,在每个节点上运行keepalived进程,每个keepalived进程能够通过VRRP协议相互通信(通告优先级,选举主节点,配置IP地址.......),当主服务器出现故障,备用服务器可自动代替主服务器继续提供服务。相对于Corosync+Pacemaker,keepalived更加轻量级,当然它的适用场景也有限,一般仅对LVS和反向代理服务器做高可用。 keepalived组件介绍 keepalived结构图: Netlink reflector:监控网络接口 IPVS wrapper:为ipvs生成规则,并监控ipvs指向的各real server的健康状况(借助checkers完成) VRRP Stack:vrrp的具体实现 Checkers:监控ipvs指向的各real server的健康状况 其中VRRP Stack和Checkers为核心组件,为了避免其中的任意组建出现故障而导致keepalived服务无法正常工作,由watchdog监控这两个内部进程的正常运行。 LVS的高可用-主备模型 在使用keepalived对LVS实现高可用时,除了高可用的功能外,还可以为前端的Director生成ipvs规则,并对后端的Real Server的健康状况进行监控。LVS的模型为DR模型,前端两个Director,一主一备,就一个VRRP示例。 实验环境: 时间服务器,控制节点:192.168.1.102 2台Director(node1,node2): node1:192.168.1.126 node2:192.168.1.127 VIP:192.168.1.200 Real Server1:192.168.1.124 Real Server2:192.168.1.125 首先利用ansible的playbook完成高可用集群的实现前提:时间同步,基于主机名相互通信。 对应role的目录结构: hosts文件配置各节点能够基于主机名相互通信: ntp.conf为ntpd服务的配置文件,在其中指定上级时间服务器的地址: 将hosts文件和ntp.conf复制到各节点,并启动ntpd服务。 编辑ha.yml,调用对应的role: 在base源中就有keepalived,利用yum直接下载即可(RedHat6.4之后) 编辑配置文件/etc/keepalived.conf(node1上) 将配置文件复制到第2个节点并作相应的修改,注意VRRP实例中state,virtual_route_id,priority和认证信息的配置。 在各Real Server上对arp请求和arp通告做相应的配置,并在lo接口上添加VIP(192.168.1.200)。在控制主机上配置如下脚本,并利用ansible在各Real Server上完成执行。 最后在real server上配置好html页面,然后启动httpd服务。在个LVS节点上启动keepalived服务。
[root@www ansible]# vim /etc/ansible/hosts [lvs] 192.168.1.126 #LVS的节点1(node1) 192.168.1.127 #LVS的节点2(node2) [web] 192.168.1.124 #Real Server1 192.168.1.125 #Real Server2
[root@www common]# tree . ├── files │ ├── hosts │ └── ntp.conf └── tasks └── main.yml
[root@www common]# vim files/hosts 192.168.1.126 node1.xiaoxiao.com node1 192.168.1.127 node2.xiaoxiao.com node2
[root@www common]# vim files/ntp.conf ...... server 192.168.1.102 ......
[root@www ansible]# vim roles/common/tasks/main.yml - name: hosts file copy: src=hosts dest=/etc/hosts - name: sync time copy: src=ntp.conf dest=/etc/ntp.conf - name: start ntpd service: name=ntpd state=started enabled=no
[root@www ansible]# vim ha.yml - name: install corosync and crmsh remote_user: root hosts: lvs roles: - common ###################################### [root@www ansible]# ansible-playbook ha.yml
[root@www ansible]# ansible lvs -m yum -a 'name=keepalived state=present'
! Configuration File for keepalived global_defs { notification_email { root@localhost #当有通知信息时发送邮件至root@localhost } notification_email_from root@xiaoxiao.com smtp_server 127.0.0.1 #指定邮件服务器 smtp_connect_timeout 3 } vrrp_instance VI_1 { #定义VRRP实例,VI_1为实例名称 state MASTER #这个VRRP实例中,本服务器的角色,MASTER为主节点,BACKUP为备节点 interface eth0 #服务检测的接口 virtual_router_id 2 #路由标识,同一个实例,路由标识相同 priority 100 #优先级,数字越大优先级越高 advert_int 1 #一个VRRP实例中各节点之间同步的时间间隔 authentication { auth_type PASS #认证方式 auth_pass *********** #认证密码 } virtual_ipaddress { 192.168.1.200 #定义虚拟ip地址,这里也就是VIP } } virtual_server 192.168.1.200 80 { #虚拟服务器 delay_loop 3 #对后端Real Server轮询的时间间隔 lb_algo rr #负载均衡的调度算法 lb_kind DR #LVS的模型 nat_mask 255.255.255.0 #子网掩码 persistence_timeout 20 #连接的持久时长 protocol TCP #转发使用的协议 sorry_server 127.0.0.1 80 #当Real Server全部停止工作时,请求调度至本机的80端口 real_server 192.168.1.124 80 { #定义Real Server weight 1 #设置权重 HTTP_GET { #keepalived检查该Real Server时使用的方式 url { path / #检测健康状况时获取的页面(默认页面) status_code 200 #期望的返回状态码 } connect_timeout 2 #连接超时时长 nb_get_retry 3 #连接超时后的重试次数 delay_before_retry 1 #重试间隔 } } real_server 192.168.1.125 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 2 nb_get_retry 3 delay_before_retry 1 } } }
vrrp_instance VI_1 { state BACKUP #此节点为备用节点 interface eth0 virtual_router_id 2 #同一个VRRP实例中路由标识必须相同 priority 90 #权重要低于MASTER节点 advert_int 1 authentication { #认证信息必须相同 auth_type PASS auth_pass *********** } ......... }
[root@www ansible]# vim realServer_conf echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce ip addr add 192.168.1.200/32 label lo:0 brd 192.168.1.200 dev lo ip route add 192.168.1.200 dev lo:0 ######################################### [root@www ansible]# ansible web -m script -a 'realServer_conf'
[root@www ansible]# ansible web -m shell -a 'service httpd start' [root@www ansible]# ansible lvs -m shell -a 'service keepalived start'
没有评论:
发表评论