2015年8月21日星期五

zabbix监控mysql的Discovery模板

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
zabbix监控mysql的Discovery模板  阅读原文»

zabbix监控mysql的Discovery模板
环境: centos6.6 zabbix-2.4.5 mysql-5.6.24

zabbix没有自带对mysql的监控模板,网上许多模板也都是固定的监听某端口,不够灵活,如果mysql的端口很多记不清楚的话,我们就应该以lld(low level discovery)方式监控mysql。

步骤:

一、客户端

1、监控内容的json化

在客户端里,需要把监控的内容json化展示,然后服务端可以通过正则来过滤出结果。下面在是我的json监控mysql的json展示:

wKiom1XV3yyTX-TJAACeP5dZVV8556.jpg

脚本内容如下:

  #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.测试

先测试脚本和命令:

wKiom1XV4UPgK_E3AAE_hw00udw978.jpg

再测试客户端能不能获取键值:

wKioL1XV41KAHQIjAAGYf_sgiX0490.jpg

最后测试服务器端能不能获取键值:

wKiom1XV4USA_UtvAAFXHf1Wy3U171.jpg

注意:zabbix接收的数据格式一定是JSON格式的,而且形式必须为:

  {      "data":[       {              "{#键}":"值"}       ]  }  

二、服务端

1.创建模板

wKiom1XV4eqwtfszAANDqtvsnSk710.jpg

2.设置发现规则

wKioL1XV4_qSGS8FAAPtHD34S3I707.jpg

3.设置正则

wKioL1XV4_rSBKDPAAOSWCrXk1Y843.jpg

4.创建发现项

wKiom1XV4evTPX5mAATju_cC-Os390.jpg

5.创建发现项的触发器

wKioL1XV4_rQw20_AAP9w1OYEW4406.jpg

6.给需要的项绘图

wKiom1XV4evBd9ubAAVHcoOFmcw565.jpg

7.将模板链接到mysql服务器

wKioL1XV4_rAQ-AwAAO7ftDqzGY164.jpg

8.注意事项

(1)发现规则设置更新时长为1小时

为什么设置3600秒?原因是如果设置时间过短,

基于keepalived实现LVS的高可用  阅读原文»

基于keepalived实现LVS的高可用

keepalived简介

首先简单介绍一下VRRP协议(虚拟路由器冗余协议)。VRRP是一种容错协议,它可以将一组路由器组织成一个虚拟路由器,这个虚拟路由器仅适用一个IP地址,这个IP地址配置在其中的一台路由器上,这个路由器即为主路由器(MASTER),其余的为备用路由器(BACKUP)。如果这个路由器组内的MASTER路由器出现故障了,BACKUP路由器将会通过选举策略选出一个新的MASTER路由器继续向外提供服务。这样就保证了网络之间的通信不会中断。

keepalived即采用了VRRP协议实现服务器的高可用,在每个节点上运行keepalived进程,每个keepalived进程能够通过VRRP协议相互通信(通告优先级,选举主节点,配置IP地址.......),当主服务器出现故障,备用服务器可自动代替主服务器继续提供服务。相对于Corosync+Pacemaker,keepalived更加轻量级,当然它的适用场景也有限,一般仅对LVS和反向代理服务器做高可用。

keepalived组件介绍

keepalived结构图:

wKioL1XVoufhlDO7AADuUQ3uIiU188.gif

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

wKioL1XVqiOCF9bBAACbTbazDIw691.jpg

首先利用ansible的playbook完成高可用集群的实现前提:时间同步,基于主机名相互通信。

  [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  

对应role的目录结构:

  [root@www common]# tree  .  ├── files  │   ├── hosts  │   └── ntp.conf  └── tasks      └── main.yml  

hosts文件配置各节点能够基于主机名相互通信:

  [root@www common]# vim files/hosts  192.168.1.126 node1.xiaoxiao.com node1  192.168.1.127 node2.xiaoxiao.com node2  

ntp.conf为ntpd服务的配置文件,在其中指定上级时间服务器的地址:

  [root@www common]# vim files/ntp.conf  ......  server 192.168.1.102  ......  

将hosts文件和ntp.conf复制到各节点,并启动ntpd服务。

  [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  

编辑ha.yml,调用对应的role:

  [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  

在base源中就有keepalived,利用yum直接下载即可(RedHat6.4之后)

  [root@www ansible]# ansible lvs -m yum -a 'name=keepalived state=present'  

编辑配置文件/etc/keepalived.conf(node1上)

  ! 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          }      }  }  

将配置文件复制到第2个节点并作相应的修改,注意VRRP实例中state,virtual_route_id,priority和认证信息的配置。

  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 ***********      }    .........  }  

在各Real Server上对arp请求和arp通告做相应的配置,并在lo接口上添加VIP(192.168.1.200)。在控制主机上配置如下脚本,并利用ansible在各Real Server上完成执行。

  [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'  

最后在real server上配置好html页面,然后启动httpd服务。在个LVS节点上启动keepalived服务。

  [root@www ansible]# ansible web -m shell -a 'service httpd start'  [root@www ansible]# ansible lvs -m shell -a 'service keepalived start'  

没有评论:

发表评论