zabbix安装配置(LNMP环境)

1、配置参数

zabbix对PHP参数、PHP模块有特殊要求。
如下模块要特别留意加上

bcmath        --enable-bcmath
mbstring    --enable-mbstring
sockets        --enable-sockets
gd            --with-gd
libxml        --with-libxml-dir=/usr/local
xmlwriter    同上
xmlreader    同上
ctype        默认支持
session        默认支持
gettext        默认支持

以下是我PHP的编译配置参数(需要yum install libxml2-devel bzip2-devel libcurl-devel libjpeg-devel libpng-devel freetype-devel gd -y)

编译:

[root@M4 ~]# ./configure  --prefix=/usr/local/php56 
--with-config-file-path=/usr/local/php56/etc --with-bz2 --with-curl 
--enable-ftp --enable-sockets --disable-ipv6 --with-gd 
--with-jpeg-dir=/usr/local --with-png-dir=/usr/local 
--with-freetype-dir=/usr/local --enable-gd-jis-conv  
--with-iconv-dir=/usr/local --enable-mbstring --enable-calendar 
--with-gettext --with-libxml-dir=/usr/local --with-zlib 
--with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysqli=mysqlnd 
--enable-dom --enable-xml --enable-fpm --with-libdir=lib64 --enable-bcmath

安装:

[root@M4 ~]# make && make install

配置:

[root@M4 ~]# cp php.ini-development /usr/local/php56/etc/php.ini
[root@M4 ~]# ln -s /usr/local/php56/etc/php.ini /etc/php.ini
[root@M4 ~]# cp /usr/local/php56/etc/php-fpm.conf.default /usr/local/php56/etc/php-fpm.conf
[root@M4 ~]# vim /usr/local/php/etc/php-fpm.d/www.conf #编辑
user = zabbix #设置php-fpm运行账号为www
group = zabbix #设置php-fpm运行组为www
security.limit_extensions = .php .php3 .php4 .php5 .js .css .jpg .gif .png .jpeg .html .ico .bmp

设置 php-fpm开机启动

[root@M4 ~]# cp /usr/local/src/php-56/sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm

#拷贝php-fpm到启动目录

[root@M4 ~]# chmod +x /etc/rc.d/init.d/php-fpm #添加执行权限
[root@M4 ~]# chkconfig php-fpm on #设置开机启动
[root@M4 ~]# vi /usr/local/php/etc/php.ini #编辑配置文件
找到:disable_functions =
修改为:disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,
shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,
openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,
dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,
getservbyport,disk_total_space,posix_ctermid,posix_get_last_error,posix_getcwd,
posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,
posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid,
posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,
posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname
#列出PHP可以禁用的函数,如果某些程序需要用到这个函数,可以删除,取消禁用。
找到:;date.timezone =
修改为:date.timezone = PRC #设置时区
找到:expose_php = On
修改为:expose_php = Off #禁止显示php版本的信息
找到:short_open_tag = Off
修改为:short_open_tag = ON #支持php短标签
找到opcache.enable=0
修改为opcache.enable=1 #php支持opcode缓存
找到:;opcache.enable_cli=1 #php支持opcode缓存
修改为:opcache.enable_cli=0
post_max_size=16M
max_execution_time=300
max_input_time=300
always_populate_raw_post_data=off
在最后一行添加:zend_extension=opcache.so #开启opcode缓存功能
:wq! #保存退出

2、nginx编译安装

nginx版本1.12.2,以下我的安装编译参数

编译

[root@M4 ~]# ./configure --prefix=/web/soft/nginx/ --with-http_stub_status_module --with-http_ssl_module

安装:

[root@M4 ~]# make && make install

配置nginx支持php

[root@M4 ~]# vim /web/soft/nginx/conf/nginx.conf   
server {
        listen       8095;
        server_name  zabbix;
        location  / {
           root /web/soft/nginx/zabbix;
        }
       location ~ .php$ {
           root /web/soft/nginx/zabbix;
           fastcgi_pass 127.0.0.1:9000;
           fastcgi_index index.php;
           fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
           include fastcgi_params;
        }

    } 
[root@M4 ~]# /etc/init.d/nginx restart #重启nginx
[root@M4 ~]# /etc/init.d/php-fpm restart #重启php-fpm

3、zabbix服务端安装

下载安装zabbix
所有版本下载地址:http://www.zabbix.com/download.php
// 一定先安装依赖

[root@M4 ~]# yum install net-snmp-devel libxml2-devel libcurl-devel libevent-devel
[root@M4 ~]# tar xf zabbix-3.4.4.tar.gz

编译

[root@M4 ~]# ./configure --prefix=/web/data/zabbix-3.4.4/ --enable-server 
--enable-agent --with-mysql --with-net-snmp --with-libcurl --with-libxml2

安装

[root@M4 ~]# make && make install

在zabbix server一般充当两个角色:server、angent,所以上面的配置参数也同时加上了–enable-agent。
备注:请安装好MySQL,snmp,curl开发库。
创建用户
为了安全考虑zabbix只使用普通用户运行,假如你当前用户叫ttlsa,那么你运行他,他便使用ttlsa身份运行。但是如果你在root环境下运行zabbix,那么zabbix将会主动使用zabbix用户来运行。但是如果你的系统没有名叫zabbix的用户,你需要创建一个用户,如下:

[root@M4 ~]# groupadd zabbix
[root@M4 ~]# useradd -g zabbix zabbix

配置zabbix_server配置文件,zabbix源码目录下

[root@M4 ~]# mkdir /etc/zabbix
[root@M4 ~]# cp config/zabbix_server.conf /etc/zabbix/
[root@M4 ~]# vim /etc/zabbix/zabbix_server.conf
DBName=zabbix
DBUser=root
DBPassword=ttlsapwd
DBPort=3306

4、数据库安装配置

安装:数据库安装 http://yangxx.net/?p=154

初始化数据库

zabbix server与proxy需要数据库,angent不需要。尤其要注意的是proxy只需要导入一个sql文件,而server一共要导入3个sql文件。我当时在搭建proxy的时候导入了3个sql,导致出现报错。后来才发现proxy只需要导入一个表结构即可。
我假想你安装好了MySQL,用户名为root,密码为ttlsapwd

[root@M4 ~]# mysql -uroot -pttlsapwd
mysql> create database zabbix default charset utf8;
mysql> quit;
[root@M4 ~]# mysql -uroot -pttlsapwd zabbix < database/mysql/schema.sql

备注:创建数据库请别忘记加default charset utf8,有可能会导致你出现中文乱码问题

如果你仅仅是初始化proxy的数据库,那么够了。如果初始化server,那么接着导入下面两个sql

[root@M4 ~]# mysql -uroot -pttlsapwd zabbix < database/mysql/images.sql
[root@M4 ~]# mysql -uroot -ppttlsapwd zabbix < database/mysql/data.sql

5、登录web开始配置

192.168.30.6:8095

6、开启zabbix中文

原来zabbix默认把对中文的支持给关闭了,我们需要修改zabbix的php源文件. 修改站点根目录下include/locales.inc.php文件.

[root@M4 ~]# vim include/locales.inc.php
function getLocales() {
        return array(
                'en_GB' => array('name' => _('English (en_GB)'),        'display' => true),
                'en_US' => array('name' => _('English (en_US)'),        'display' => true),
                'bg_BG' => array('name' => _('Bulgarian (bg_BG)'),      'display' => true),
                'zh_CN' => array('name' => _('Chinese (zh_CN)'),        'display' => true),
                //原本这里为false,请改为true
                ...........代码省略掉........
        );
}

7、agent安装

监控主机

安装zabbix-agent

首先需要在被监控的主机上安装agent,可以下载预编译好的RPM进行安装,下载地址:http://www.zabbix.com/download
也可以源码安装,类似server的安装,只是一个地方有区别,就是配置的参数只有一个:

[root@M4 ~]# ./configure –prefix=/home/zabbix --enable-agent

配置agent

以RPM安装为例,安装后的agent配置文件位置:/etc/zabbix/zabbix_agentd.conf,主要需要修改下列2项:

Server=192.168.0.41
ServerActive=192.168.0.41:10051
Hostname=M4
#配置成主机名需要在server hosts文件中添加对应信息或者直接使用本机IP

修改完成后,重启zabbix-agent 服务。

zabbix监控supervisorctl中的服务

1、首先获取supervisorctl status

#!/bin/env python
#_*_ coding:utf-8 _*_

import sys
import os
res = {}
path = '/opt/zabbix/scripts/supervisorctl/'

file1 =os.popen('sudo supervisorctl status')
for line in file1.readlines():
        #获取服务名&服务状态
        ser_name = line.split()[0].strip()
        ser_res = line.split()[1].strip()

        #判断服务运行状态,1为成功,0为失败
        if ser_res == 'RUNNING':
                ser_res = '1'
        else:
                ser_res = '0'
        #aa = path + ser_name
        #file_object =open(aa,'wb')
        #file_object.write(ser_res)
        #file_object.close()
        res[ser_name] = ser_res

user_input = str(sys.argv[1].strip())
print(res[user_input])

2、在zabbix中添加自定义参数

UserParameter=supervisorctl.status[*],python /etc/zabbix/scripts/supervisorctl.py $1

3、默认zabbix的账户没有supervisorctl status执行权限,需要配置zabbix免密sudo

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
zabbix  ALL=(ALL)       NOPASSWD:/usr/bin/supervisorctl

zabbix 按CPU核数监控负载状态

使用zabbix自带的key来实现多核CPU监控

system.cpu.discovery

自动发现CPU核数:

未分类

定义宏

未分类

按核数监控CPU负载

$2:指key中的第二个参数,这里是idle(CPU空闲比例)

未分类

    us(user):非nice用户进程占用CPU的比率

    sy(system):内核、内核进程占用CPU的比率;

    ni(nice):如果一些用户进程修改过优先级,这里显示这些进程占用CPU时间的比率;

    id(idle):CPU空闲比率,如果系统缓慢而这个值很高,说明系统慢的原因不是CPU负载高;

    wa(iowait):CPU等待执行I/O操作的时间比率,该指标可以用来排查磁盘I/O的问题,通常结合wa和id判断

    hi(irq):CPU处理硬件终端所占时间的比率;

    si(softirq):CPU处理软件终端所占时间的比率;

    st(stealstealon):流逝的时间,虚拟机中的其他任务所占CPU时间的比率;

  用户进程占比高,wa低,说明系统缓慢的原因在于进程占用大量CPU,通常还会伴有教低的id,说明CPU空转时间很少;

  wa低,id高,可以排除CPU资源瓶颈的可能。  

  wa高,说明I/O占用了大量的CPU时间,需要检查交换空间的使用,交换空间位于磁盘上,性能远低于内存,当内存耗尽开始使用交换空间时,将会给性能带来严重影响,所以对于性能要求较高的服务器,一般建议关闭交换空间。另一方面,如果内存充足,但wa很高,说明需要检查哪个进程占用了大量的I/O资源。

    tps: 每秒I/O传输请求量;

    kB_read/s:每秒读取多少KB;

    kB_wrtn/s:每秒写多少KB;

    kB_read:一共读了多少KB;

    kB_wrtn:一共写了多少KB。

zabbix触发器表达式详解

Zabbix trigger是zabbix 进行告警通知的设定条件 ,当监控获取的值触发了设定的条件时,会按照触发器的设定,执行相应的action 操作 。在zabbix中为了比较方便的设定各种条件,zabbix为我们设计了相应的函数和操作符 。本篇就重点介绍下trigger的函数相关的内容。

一、创建触发器

触发器可以是和模板关联的,也可以是和主机关联的。即在创建模板时,就设定好相应的触发器,和模板相关联的主机同时也关联了触发器,一旦条件满足就执行相应的操作(如告警),我们可以认为他是全局性的;和主机关联的触发器是属于局限性的触发器,该触发只针对特别设定的主机有效,对其他主机无效。

针对全局性触发器和局限性触发器的不同,所以其可以在configuration 下的hosts 里配置trigger ,也可以在 configuration 下的tmplates 里配置 trigger。无论在那一处配置,其界面都是类似如下:

未分类

如上图所示,通过设置name、条件、描述、告警级别等保存并启用即可完成一个触发器的新增。

二、触发器表达式

触发器的表达式即上面的expression里填写的内容,其格式为:

{<server>:<key>.<function>(<parameter>)}<operator><constant>

以上面的截图为例,key为icmppingloss ,function函数是min ,parameter参数值为5分钟 ,运算符是大于 。

1、时间参数

zabbix 触发条件里,很多是对单位时间内的数字参数进行表达式表达的,其中涉及到的常用时间单位如下:

s - seconds (when used, works the same as the raw value)
m - minutes
h - hours
d - days
w - weeks

2、运算符

运算符对应表达式中的operator部分,可以使用的操作符有:

未分类

示例:

{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5
#系统负载大于5
{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5|{www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2
#cpu负载大于5或者最后10分钟负载大于2的时候都会报警。
{www.zabbix.com:vfs.file.cksum[/etc/passwd].diff(0)}>0
#/etc/passwd文件改变会报警
{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K
#在最后5分钟,网卡eth0的流量大于100K报警
{smtp1.zabbix.com:net.tcp.service[smtp].last(0)}=0&{smtp2.zabbix.com:net.tcp.service[smtp].last(0)}=0
#两个节点上的smtp服务都宕机才会报警,该表达式用了两个主机
{zabbix.zabbix.com:icmpping.count(30m,0)}>5
#在最后30分钟主机不能ping通的次数大于5就报警
{server:system.cpu.load.avg(1h)}/{server:system.cpu.load.avg(1h,1d)}>2
({TRIGGER.VALUE}=0&{server:temp.last(0)}>20)|
({TRIGGER.VALUE}=1&{server:temp.last(0)}>15)

以上参考官方文档 。

三、表达式函数

表达式函数也算是表达式中的一部分,不过内容比较多,这里单独拿出来总结 。

abschange

  • 参数:忽略
  • 支持类型:float,int,str,text,log
  • 作用:返回最近获得的值与之前获得值差的绝对值,对于字符串类型:0表示相等,1表示不同

avg

  • 参数:秒或#num
  • 支持类型:float,int
  • 作用:返回一段时间的平均值

举例:

  • avg(5):最后5秒的平均值

  • avg(#5):表示最近5次得到值的平均值

  • avg(3600,86400):表示一天前的一个小时的平均值

如果仅有一个参数,表示指定时间的平均值,从现在开始算起,如果有第二个参数,表示漂移,从第二个参数前开始算时间,

#n表示最近n次的值

max

  • 参数:秒或#num

  • 支持值类型:float,int

  • 描述:返回指定时间间隔的最大值.时间间隔作为第一个参数可以是秒或收集值的数目(前缀为#).从Zabbix1.8.2开始,函数支持第二个可选参数time_shift,可以查看avg()函数获取它的使用方法.

min

  • 参数:秒或#num

  • 支持值类型:float,int

  • 描述:返回指定时间间隔的最小值.时间间隔作为第一个参数可以是秒或收集值的数目(前缀为#).从Zabbix1.8.2开始,函数支持第二个可选参数time_shift,可以查看avg()函数获取它的使用方法.

sum

  • 参数:秒或#num

  • 支持值类型:float,int

  • 描述:返回指定时间间隔中收集到的值的总和.时间间隔作为第一个参数支持秒或收集值的数目(以#开始).从Zabbix1.8.2开始,本函数支持time_shift作为第二个参数。可以查看avg函数获取它的用法

change

  • 参数:忽略
  • 支持类型:float,int,str,text,log
  • 作用:返回最近获得值与之前获得值的差值,对于字符串0表示相等,1表示不同

举例:

change(0)>n:忽略参数一般输入0,表示最近得到的值与上一个值的差值大于n

count

  • 参数:秒或#num
  • 支持类型:float,int,str,text,log
  • 作用:返回指定时间间隔内数值的统计,

举例:

count(600)最近10分钟得到值的个数
count(600,12)最近10分钟得到值的个数等于12
count(600,12,"gt")最近10分钟得到值的个数大于12
count(#10,12,"gt")最近10个值中,值大于12的个数
count(600,12,"gt",86400)24小时之前的10分钟内值大于12的个数
count(600,6/7,"band")-thenumberofvaluesforlast10minuteshaving'110'(inbinary)inthe3leastsignificantbits.
count(600,,,86400)24小时之前的10分钟数据值的个数

第一个参数:指定时间段

第二个参数:样本数据

第三个参数:操作参数

第四个参数:漂移参数

#支持的操作类型
eq: 相等
ne: 不相等
gt: 大于
ge: 大于等于
lt: 小于
le: 小于等于
like: 内容匹配

diff

  • 参数:忽略
  • 支持值类型:float,int,str,text,log
    -作用:返回值为1表示最近的值与之前的值不同,0为其他情况

last

  • 参数:秒或#num
  • 支持值类型:float,int,str,text,log
  • 作用:最近的值,如果为秒,则忽略,#num表示最近第N个值,请注意当前的#num和其他一些函数的#num的意思是不同的

例子:

last(0)等价于last(#1)

last(#3)表示最近第3个值(并不是最近的三个值)本函数也支持第二个参数time_shift,例如last(0,86400)返回一天前的最近的值
如果在history中同一秒中有多个值存在,Zabbix不保证值的精确顺序
#num从Zabbix1.6.2起开始支持,timeshift从1.8.2其开始支持,可以查询avg()函数获取它的使用方法

logeventid

  • 参数:string

  • 支持值类型:log

  • 描述:检查最近的日志条目的EventID是否匹配正则表达式.参数为正则表达式,POSIX扩展样式.当返回值为0时表示不匹配,1表示匹配。该函数从Zabbix1.8.5起开始支持.

logseverity

  • 参数:忽略

  • 支持值类型:log

  • 描述:返回最近日志条目的日志等级(logseverity).当返回值为0时表示默认等级,N为具体对应等级(整数,常用于Windowseventlogs).Zabbix日志等级来源于Windowseventlog的Information列.

logsource

  • 参数:string

  • 支持值类型:log

  • 描述:检查最近的日志条目是否匹配参数的日志来源.当返回值为0时表示不匹配,1表示匹配。通场用于Windowseventlogs监控.例如logsource[“VMWareServer”]

prev

  • 参数:忽略

  • 支持值类型:float,int,str,text,log

  • 描述:返回之前的值,类似于last(#2)

regexp

  • 参数:第一个参数为string,第二个参数为秒或#num

  • 支持值类型:str,log,text

  • 描述:检查最近的值是否匹配正则表达式,参数的正则表达式为POSIX扩展样式,第二个参数为秒数或收集值的数目,将会处理多个值.本函数区分大小写。当返回值为1时表示找到,0为其他.

str

  • 参数:第一个参数为string,第二个参数为秒或#num

  • 支持值类型:str,log,text

  • 描述:查找最近值中的字符串。第一个参数指定查找的字符串,大小写敏感。第二个可选的参数指定秒数或收集值的数目,将会处理多个值。当返回值为1时表示找到,0为其他.

strlen

  • 参数:秒或#num

  • 支持值类型:str,log,text

  • 描述:指定最近值的字符串长度(并非字节),参数值类似于last函数.例如strlen(0)等价于strlen(#1),strlen(#3)表示最近的第三个值,strlen(0,86400)表示一天前的最近的值.该函数从Zabbix1.8.4起开始支持

time

  • 参数:忽略

  • 支持值类型:any

  • 描述:返回当前时间,格式为HHMMSS,例如123055

date

  • 参数:忽略
  • 支持类型:any
  • 作用:返回当前的时间,格式YYYYMMDD

dayofmonth

返回当前是本月的第几天

dayofweek

返回当前是本周的第几天

delta

  • 参数:秒或#num
  • 支持类型:float,int
  • 作用:返回时间间隔内的最大值与最小值的差值

nodata

  • 参数:秒

  • 支持值类型:any

  • 描述:当返回值为1表示指定的间隔(间隔不应小于30秒)没有接收到数据,0表示其他.

now

  • 参数:忽略

  • 支持值类型:any

  • 描述:返回距离Epoch(1970年1月1日00:00:00UTC)时间的秒数

fuzzytime

  • 参数:秒
  • 支持值类型:float,int
  • 作用:返回值为1表示监控项值的时间戳与ZabbixServer的时间多N秒,0为其他.常使用system.localtime来检查本地时间是否与Zabbixserver时间相同.

函数部分同样可以参看官方页面 。

概述

触发器中的表达式使用很灵活,我们可以创建一个复杂的逻辑测试监控,触发器表达式形式如下:

{<server>:<key>.<function>(<parameter>)}<operator><constant>

{主机:key.函数(参数)}<表达式>常数,具体的例子,请接着往下走,很简单

Functions函数

触发器functions可以引用检索到的值,当前时间或者其他元素。触发器表达式支持的function完整列表请点击官网地址 supported functions

Function参数

大多数数值functions可以使用秒来作为参数。你可以使用前缀“#”来表示它有不同的含义

未分类

last函数使用不同的参数将会得到不同的值,#2表示倒数第二新的数据。例入从老到最新值为1,2,3,4,5,6,7,8,9,10,last(#2)得到的值为9,last(#9)得到的值为2。last函数必须包含参数。
AVG,count,last,min和max函数还支持额外的参数,以秒为单位的参数time_shift(时间偏移量)。例如avg(1h,1d),那么将会获取到昨天的1小时内的平均数据。
[warning]备注:触发器表达式需要使用history历史数据来计算,如果history不可用(time_shift时间偏移量参数无法使用),因此history记录一定要保留长久一点,至少要保留需要用的记录。[/warning]
触发器表达式可以使用单位符号来替代大数字,例如5m替代300,或者1d替代86400,1k替代1024字节等等。

操作符

未分类

触发器示例

示例一

触发器名称:Processor load is too high on www.zabbix.com

{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5

触发器说明:

www.zabbix.com:host名称
system.cpu.load[all,avg1]:item值,一分内cpu平均负载值
last(0):最新值

5:最新值大于5
如上所示,www.zabbix.com这个主机的监控项,最新的CPU负载值如果大于5,那么表达式会返回true,这样一来触发器状态就改变为“problem”了。

示例二

触发器名称:www.zabbix.com is overloaded

{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5|{www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2

当前cpu负载大于5或者最近10分内的cpu负载大于2,那么表达式将会返回true.

示例三

触发器名称:/etc/passwd has been changed
使用函数 diff():

{www.zabbix.com:vfs.file.cksum[/etc/passwd].diff(0)}>0

/etc/passwd最新的checksum与上一次获取到的checksum不同,表达式将会返回true. 我们可以使用同样的方法监控系统重要的配置文件,例如/etc/passwd,/etc/inetd.conf等等。这些zabbix一般都会自带,没带的你自己加上吧。

示例四

触发器名称:Someone is downloading a large file from the Internet

使用函数 min:

{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K

当前主机网卡eth0最后5分钟内接收到的流量超过100KB那么触发器表达式将会返回true

示例五

触发器名称:Both nodes of clustered SMTP server are down

{smtp1.zabbix.com:net.tcp.service[smtp].last(0)}=0&{smtp2.zabbix.com:net.tcp.service[smtp].last(0)}=0

当smtp1.zabbix.com和smtp2.zabbix.com两台主机上的SMTP服务器都离线,表达式将会返回true.

示例六

触发器名称:Zabbix agent needs to be upgraded
使用函数str():

{zabbix.zabbix.com:agent.version.str("beta8")}=1

如果当前zabbix agent版本包含beta8(假设当前版本为1.0beta8),这个表达式会返回true.

示例七

触发器名称:Server is unreachable

{zabbix.zabbix.com:icmpping.count(30m,0)}>5

如上表达式表示最近30分钟zabbix.zabbix.com这个主机超过5次不可到达。

示例八

触发器名称:No heartbeats within last 3 minutes
使用函数 nodata():

{zabbix.zabbix.com:tick.nodata(3m)}=1

tick为Zabbix trapper类型,首先我们要定义一个类型为Zabbix trapper,key为tick的item。我们使用zabbix_sender定期发送数据给tick,如果在3分钟内还未收到zabbix_sender发送来的数据,那么表达式返回一个true,与此同时触发器的值变为“PROBLEM”。

示例九

触发器名称:CPU activity at night time
使用函数 time():

{zabbix:system.cpu.load[all,avg1].min(5m)}>2&{zabbix:system.cpu.load[all,avg1].time(0)}>000000&{zabbix:system.cpu.load[all,avg1].time(0)}<060000

只有在凌晨0点到6点整,最近5分钟内cpu负载大于2,表达式返回true,触发器的状态变更为“problem”

示例十

触发器名称:Check if client local time is in sync with Zabbix server time
使用函数 fuzzytime():

{MySQL_DB:system.localtime.fuzzytime(10)}=0

主机MySQL_DB当前服务器时间如果与zabbix server之间的时间相差10秒以上,表达式返回true,触发器状态改变为“problem”

示例十一

触发器名称:Comparing average load today with average load of the same time yesterday (使用 time_shift 时间偏移量参数).

{server:system.cpu.load.avg(1h)}/{server:system.cpu.load.avg(1h,1d)}>2

This expression will fire if the average load of the last hour tops the average load of the same hour yesterday more than two times.

Hysteresis(迟滞,滞后)

简单的说触发器状态转变为problem需要一个条件,从problem转变回来还需要一个条件才行。一般触发器只需要不满足触发器为problem条件即可恢复。明白了么?不明白就看例子吧。
有时候触发器需要使用不同的条件来表示不同的状态,举个官网很有趣的例子:机房温度正常稳定为15-20°,当温度超过20°,触发器值为problem,直到温度低于15°才会接触警报,异常会解除。别整这些没用的,我们看实例.
为了达到这个效果,我们需要使用如下触发器表达式:

示例1

触发器名称:Temperature in server room is too high

({TRIGGER.VALUE}=0&{server:temp.last(0)}>20)|
 ({TRIGGER.VALUE}=1&{server:temp.last(0)}<15)

如上有两个小括号,前面一个表示触发异常的条件,后面一个表达式表示解除异常的条件。
注意:宏变量 {TRIGGER.VALUE}将会返回当前触发器的值

示例2

触发器名称:Free disk space is too low
Problem: 最近5分钟剩余磁盘空间小于10GB。(异常)
Recovery: 最近10分钟磁盘空间大于40GB。(恢复)
简单说便是一旦剩余空间小于10G就触发异常,然后接下来剩余空间必须大于40G才能解除这个异常,就算你剩余空间达到了39G(不在报警条件里)那也是没用的,有意思不!

({TRIGGER.VALUE}=0&{server:vfs.fs.size[/,free].max(5m)}<10G)
|


({TRIGGER.VALUE}=1&{server:vfs.fs.size[/,free].min(10m)}<40G)

结尾

这篇文章很有必要细细读,很重要。

Docker下实战zabbix三部曲之三:自定义监控项

通过上一章《Docker下实战zabbix三部曲之二:监控其他机器》的实战,我们了解了对机器的监控是通过在机器上安装zabbix agent来完成的,zabbix agent连接上zabbix server之后,将自己所在机器的信息定时给到zabbix server,这样就实现了机器的监控;
但是我们能监控到的只有cpu,磁盘这些基础信息,对于一些业务信息例如访问量,某个逻辑的执行成功失败次数等信息,我们也想进行监控,这就需要我们去制作自定义监控项了,本章我们就一起来实战自定义监控项吧。

机器部署情况一览

总的来说,有四台机器,各自的功能如下:
a. 假设有一个机器在运行web应用,容器是tomcat,这个应用有个接口http://localhost:8080/zabbixcustomitemdemo/count,可以返回最近一分钟的某个业务量(例如网站访问次数);

b. 有一台机器安装了zabbix agent,作为自定义监控项的载体;
c. 有一台机器安装了zabbix server;
d. 有一台机器安装了mysql,作为zabbix系统的数据库;

整体部署如下图所示:

未分类

运行web应用的server

这是个基于maven的java web应用,里面有个spring mvc的controller,提供一个http服务,范围某个业务每分钟的业务量,代码如下图所示:

@Controller
public class CountController {

    @RequestMapping("/count")
    @ResponseBody
    public int count(String model, String type) {
        int base;
        int max;
        int min;

        if("a".equals(model)){
            base = 50000;
        }else{
            base =10000;
        }

        if("0".equals(type)){
            max = 9000;
            min = 1000;
        }else{
            max = 1000;
            min = 0;
        }

        return base + new Random().nextInt(max)%(max-min+1);
    }
}

从以上代码我们可以看出,http服务会返回随机数,此服务接受两个参数model和type,当model等于”a”时返回的随机数从50000开始,model不等于”a”时返回的随机数从10000开始,当type等于”0”时,在base的基础上增加的值是1000到9000之间,当type不等于”0”时,在base的基础上增加的值是0到1000之间;

整个工程的代码已经上传到git上,地址是[email protected]:zq2599/blog_demos.git,这个目录下由多个工程,本次实战的工程是zabbixcustomitemdemo,如下图:

未分类

docker-compose.yml文件

上面我们已经把四台机器的功能和关系梳理清楚了,现在就来制定docker-compose.yml文件吧:

version: '2'
services:
  zabbix-mysql-service: 
    image: daocloud.io/library/mysql:8
    container_name: zabbix-mysql-service
    environment:
      - MYSQL_ROOT_PASSWORD=888888
    restart: always
  zabbix-server-service:
    image: monitoringartist/zabbix-xxl:3.2.6
    links: 
      - zabbix-mysql-service:mysqlhost
    container_name: zabbix-server-service
    restart: always
    depends_on:
      - zabbix-mysql-service
    ports:
      - "8888:80"
    environment:
      - ZS_DBHost=mysqlhost
      - ZS_DBUser=root
      - ZS_DBPassword=888888
  zabbix-agent-a:
    image: zabbix/zabbix-agent:ubuntu-3.2.6
    links: 
      - zabbix-server-service:zabbixserverhost
    container_name: zabbix-agent-a
    restart: always
    depends_on:
      - zabbix-server-service
    environment:
      - ZBX_HOSTNAME=zabbix-agent-service-a
      - ZBX_SERVER_HOST=zabbixserverhost
  tomcat-server-service:
    image: bolingcavalry/bolingcavalrytomcat:0.0.1
    container_name: tomcat-server
    restart: always
    ports:
      - "8080:8080"

yml文件的内容如上所示,其中mysql、zabbix server,zabbix agent的配置和上一章《Docker下实战zabbix三部曲之二:监控其他机器》是一样的,新增的是一个tomcat的镜像,这个镜像是我在tomcat官方镜像的基础上做了点小改动,使得这个tomcat支持在线部署web应用,关于tomcat在线部署应用,请看文章《实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署》

准备好yml文件之后,打开终端,在yml文件所在目录下执行docker-compose up -d可以将yml文件中所有的容器都启动;

注意,如果您的电脑之前已经运行过上一章《Docker下实战zabbix三部曲之二:监控其他机器》中的docker-compose.yml文件,那么本次执行docker-compose up -d会提示启动失败,已有同样名称的容器存在,这时候可以去上一章的docker-compose.yml文件所在目录执行docker-compose down,也可以通过docker ps -a将所有容器列出,再通过docker stop命令依次停止所有容器,再执行docker-compose rm命令依次删除;

部署web应用

打开终端,进入web工程zabbixcustomitemdemo的目录下,执行命令mvn clean package -U -Dmaven.test.skip=true tomcat7:redeploy,即可将web工程部署到tomcat容器上,关于在线部署的细节请参照文章《实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署》;

部署成功后,打开浏览器,访问http://localhost:8080/zabbixcustomitemdemo/count,web server会返回一个数字,如下图所示:

未分类

制作访问url的shell脚本

接下来我们要在zabbix agent上做一个shell脚本,此脚本的功能时发起http请求http://localhost:8080/zabbixcustomitemdemo/count?model=a&type=0,就能得到web服务响应的数字,如果此脚本每分钟被调用一次,就能得到完整的监控曲线图了;

a. 首先,执行docker exec -it zabbix-agent-a /bin/bash登录zabbix agent的容器;
b. 登录后,执行apt-get update更新apt;
c. 先后执行apt-get install wget和apt-get install vim,安装wget和vi工具;
d. 新建目录/usr/work/,在此目录下用vi创建一个shell文件biz_count.sh,内容如下:

#"!/bin/bash
wget -qO- http://tomcathost:8080/zabbixcustomitemdemo/count?model=$1&type=$2
echo ""

上面代码的功能是访问http服务获取一个数字,其中model和type用的是shell的入参;
注意两个细节:
第一个:最后一行代码echo “”,实践证明这一行是很有用的,有了这一行就会在输出http返回的数字后进行换行,有了换行数据才能成功上报到zabbix server;
第二个:wget命令后面的url参数中,”&”符号前面要加转义的斜杠””;

e. 执行chmod a+x biz_count.sh,给shell赋予可执行权限;

agent上添加监控项

继续在zabbix agent容器上,我们要添加一个自定义监控项,这样后面在zabbix server上就能使用该监控项了:
a. 在/etc/zabbix/zabbix_agentd.d目录下,新增一个biz.conf文件,内容如下:

UserParameter=get_total_num[*],/usr/work/biz_count.sh $1 $2

以上代码配置了一个自定义监控项,名称是get_total_num,可以接受两个入参,该监控项会调用biz_count.sh这个脚本,并且把外部传来的两个入参直接传递给biz_count.sh;

b. 执行chmod a+r biz.conf使得该文件可读;

在zabbix agent上测试

继续在zabbix agent容器上,执行以下命令来测试刚刚新加的监控项:

/usr/sbin/zabbix_agentd -t get_total_num[a,0]

中括号中的a,0表示两个入参分别是”a”和”0”,我们执行四次,入参分别用[a,0]、[b,0]、[a,1]、[b,1],得到的结果如下图所示:

未分类

四个返回值分别是54741、17097、50564、10919,结合前面的java代码可以发现两个参数都生效了,数字的大小范围因入参而变化;

为了让监控项生效,需要重启zabbix agent,不过这里有个更快捷的方法可以试试:
a. 执行exit退出zabbix agent容器;
b. 执行docker restart zabbix-agent-a重启zambia agent容器;

到了这里,自定义监控项已经准备好了,接下来在zabbix server上把它配置成功,我们就能看到监控数据和曲线图了,不过在配置前,我们可以在zabbix server上测试一下能否成功调用zabbix agent上的监控项;

在zabbix server上测试agent机器的监控项

首先我们要搞清楚zabbix agent机器的ip,有两种方法:
第一种,执行docker exec -it zabbix-agent-a /bin/bash登录zabbix agent的容器,在容器中执行ip addr命令可以得到ip;
第二种,直接执行docker exec -it zabbix-agent-a ip addr命令得到ip;

不论哪种,都能得到zabbix-agent的ip是172.31.0.5;

现在我们登录zabbix server容器,执行命令docker exec -it zabbix-server-service /bin/bash即可登录,登录后执行以下命令:

zabbix_get -s 172.31.0.5 -k get_total_num[a,0]

如下图所示,测试成功,调用agent的监控项返回了符合预期的数据:

未分类

还记得我们刚才在zabbix agent上配置好之后,需要重启agent服务或者重启zabbix agent容器,如果您忘了这一步,现在zabbix server上测试会得到如下错误提示:

未分类

这时候去重启一下,再回来测试就可以成功了。

在管理页面上添加监控项

在浏览器上输入”http://localhost:8888/“登录管理页面,先添加agent机器,如下图:

未分类

添加之后,点击下图红框位置,进入监控项页面:

未分类

如下图,点击右上角的“Create item”即可开始添加监控项:

未分类

新增的监控项,我们只要填写Name,Key,Update interval(更新频率)这几个字段,其他的保持不变,每个要更新的字段的内容如下图:

未分类

填写并保存后,我们可以在Monitoring -> Latest data中看到最新的监控项数据,如下图:

未分类

接下来我们添加一个监控图形,操作如下图所示,可以进入图形管理页面:

未分类

如下图,点击右上角的“Create graph”创建一个图形:

未分类

新建图形的时候,名称随意,只要Items选中刚刚创建的监控项即可,如下图:

未分类

创建成功,现在要看看效果了,操作如下图所示:

未分类

点击”add”之后,在弹出的页面上选择刚刚我们新建的图形选项,操作完毕后,点击下图红框位置,就能看见曲线图了:

未分类

曲线图如下:

未分类

以上就是自定义监控项开发和设置的所有过程,基于监控项的操作,除了图形还能添加tirgger用来告警,在添加action用来确定告警的动作,例如邮件短信的,有兴趣的读者可以实际操作实战。

Docker下实战zabbix三部曲之二:监控其他机器

在上一章《Docker下实战zabbix三部曲之一:极速体验》中,我们快速安装了zabbix server,并登录管理页面查看了zabbix server所在机器的监控信息,但是在实际场景中,应该是对应用服务器做监控,所以今天我们来实战将应用服务器的监控加入到zabbix server中。

部署情况

假设实际项目中我们有两台应用服务器,为了监控它们,我们要在上面分别安装zabbix-agent服务,然后通过配置让它们与zabbix server连接,所有监控数据和监控配置数据都被zabbix server保存在mysql中,部署情况如下图:

未分类

真实场景中是在应用服务器上安装zabbix agent服务,但是安装agent的过程和步骤不是本次实践的重点,为了快速体验服务本文使用了zabbix官方的agent镜像,这个镜像实际上就是在ubuntu14上安装了zabbix agent(在服务器上安装zabbix agent的过程就不在本文中详述了,对安装有兴趣的读者们可以去网上搜索相关资料)

docker-compose.yml文件

按照前面图片所示的部署情况,我们的docker-compose.yml内容如下,mysql和zabbix server是必须的,再新增了两个zabbix agent容器,名称分别是zabbix-agent-a和zabbix-agent-b:

version: '2'
services:
  zabbix-mysql-service: 
    image: daocloud.io/library/mysql:8
    container_name: zabbix-mysql-service
    environment:
      - MYSQL_ROOT_PASSWORD=888888
    restart: always
  zabbix-server-service:
    image: monitoringartist/zabbix-xxl:3.2.6
    links: 
      - zabbix-mysql-service:mysqlhost
    container_name: zabbix-server-service
    restart: always
    depends_on:
      - zabbix-mysql-service
    ports:
      - "8888:80"
    environment:
      - ZS_DBHost=mysqlhost
      - ZS_DBUser=root
      - ZS_DBPassword=888888
  zabbix-agent-a:
    image: zabbix/zabbix-agent:ubuntu-3.2.6
    links: 
      - zabbix-server-service:zabbixserverhost
    container_name: zabbix-agent-a
    restart: always
    depends_on:
      - zabbix-server-service
    environment:
      - ZBX_HOSTNAME=zabbix-agent-service-a
      - ZBX_SERVER_HOST=zabbixserverhost
  zabbix-agent-b:
    image: zabbix/zabbix-agent:ubuntu-3.2.6
    links: 
      - zabbix-server-service:zabbixserverhost
    container_name: zabbix-agent-b
    restart: always
    depends_on:
      - zabbix-server-service
    environment:
      - ZBX_HOSTNAME=zabbix-agent-service-b
      - ZBX_SERVER_HOST=zabbixserverhost

如上所示,zabbix agent在配置过程中要用到zabbix server的ip信息,这里我们通过links参数,在zabbix agent的host文件中加入了zabbix server的ip信息,host name是zabbixserverhost;

另外,ZBX_HOSTNAME和ZBX_SERVER_HOST这两个环境变量,在zabbix agent镜像的官方文档中已经说明,如下图,ZBX_HOSTNAME用来表示自己的身份,ZBX_SERVER_HOST是用来标明zabbix server的ip信息的,这里直接用link参数中的alias来表示,就能通过host直接找到zabbix server的ip了:

未分类

启动docker 容器

打开控制台,在docker-compose.yml文件所在的目录下执行命令docker-compose up -d,如图:

未分类

进入控制台

等待大约1分钟,让zabbix server完成初始化,然后就能登录管理页面了,详情请参照《Docker下实战zabbix三部曲之一:极速体验》一文,登录后进入hosts页面,如下图:

未分类

获取监控机器ip

按照前面的部署描述图上的部署,有两台机器装了zabbix agent服务,然后想要加入监控,第一步我们要把机器的ip确定下来,在控制台执行docker exec -it zabbix-agent-a ip addr命令,可以看到如下输出,第一台机器的ip是172.31.0.4:

未分类

在控制台执行docker exec -it zabbix-agent-b ip addr命令,可以看到如第二台机器的ip是172.31.0.5;

添加机器监控

点击hosts页面右上角的Create host按钮,可以添加监控机器,如下图:

未分类

在添加机器的页面,主要参数填写如下:
a. Host name :机器的环境变量ZBX_HOSTNAME的值:zabbix-agent-service-a;
b. Visible name :和Host name的值相同;
c. Groups : 机器分组,这里选择Linux servers;
d. Agent interfaces:这里面只需要填写IP address,就是刚才我们通过命令docker exec -it zabbix-agent-a ip addr得到的ip:172.31.0.4;
这个页面只需要填写以上四点内容,其他的都保持默认值,填写完毕后点击底部的”Add”按钮,如下图:

未分类

增加成功后,在列表中可以看到新增的机器,如下图:

未分类

添加监控项

在机器列表页面中,点击机器名称,如下图红框中位置:

未分类

在打开的页面点击”Templates”,如下图红框所示:

未分类

再点击”Select”按钮,如下图红框所示:

未分类

在弹出的页面中,勾选“Template OS Linux”,然后再点击底部的“Select”按钮,这样就把linux服务的常用监控项给批量添加了,如下图:

未分类

注意,返回的页面中,一定要点击“Add”才能让把刚才的选择加上,如下图:

未分类

然后点击“Update”,完成监控项的批量添加,如下图:

未分类

按照同样的方法把另一台机器的监控也加上;

等待大约1-2分钟后,再刷新hosts页面,就能看到列表中的”ZBX”图标已经变为绿色,表示监控已经生效;

查看监控信息

我们来看看监控曲线图吧,点击下图红框中的“Graphs”:

未分类

可以看到有5个曲线图可以查看,如下图,我们看一下cpu load:

未分类

在跳转的页面中,点击“Previdew”,就能看到cpu load的曲线图了,如下图:

未分类

至此,我们添加监控机器的实战已经完成了,但是在真实场景中,我们除了cpu、磁盘等基础信息的监控,还要监控一些业务有关的数据,例如某个http服务每分钟的访问量,在下一章中,我们一起实战开发一个自定义监控。

Docker下实战zabbix三部曲之一:极速体验

对于想学习和实践zabbix的读者来说,在真实环境搭建一套zabbix系统是件费时费力的事情,本文内容就是用docker来缩减搭建时间,目标是让读者们尽快投入zabbix系统的体验和实践;

创建docker-compose.yml文件

首先创建一份docker-compose.yml文件,内容如下:

version: '2'
services:
  zabbix-mysql: 
    image: daocloud.io/library/mysql:8
    container_name: zabbix-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=888888
    restart: always
  zabbix-server:
    image: monitoringartist/zabbix-xxl
    links: 
      - zabbix-mysql:mysqlhost
    container_name: zabbix-server
    restart: always
    depends_on:
      - zabbix-mysql
    ports:
      - "8888:80"
    environment:
      - ZS_DBHost=mysqlhost
      - ZS_DBUser=root
      - ZS_DBPassword=888888

创建容器

打开命令行,在刚才创建的docker-compose.yml目录下,执行docker-compose up -d,这样就会先后启动mysql和zabbix server两个服务的容器,如下图:

未分类

等待zabbix server初始化

在命令行输入命令docker logs -f zabbix-server-service,查看zabbix server的日志输出,下图是部分日志的截图,可以看到有数据库初始化的操作:

未分类

登录zabbix管理页面体验

等待大约一分钟之后,zabbix server的日志不再滚动,表示初始化已经完成,打开浏览器输入http://localhost:8888,可以看到zabbix的管理系统的登录页面,如下图:

未分类

输入用户名admin,密码zabbix

登录后即可看到管理系统了,如下图:

未分类

按照下图的操作,查看已经监控的主机情况,如图,目前只能看到一台机器的信息,就是zabbix server自己这台机器,从列表的几列信息中可以看到有64个监控项,43个触发器,10个图形:

未分类

上图右侧的红框中显示的status是”Disabled”,表示这个host的监控还没有启动,点击这个”Disabled”就能启动监控,将状态变为”Enabled”,大约1分钟后再刷新页面,可以看到展示如下图:

未分类

除了状态变为”Enabled”,右侧原本灰色的”ZBX”也变成了绿色,表示该机器的监控状态是正常的;

体验监控图形

按照下图的红框和箭头操作,可以看到zabbix server所在机器的cpu load的曲线图:

未分类

显示中文

按照下图的箭头依次点击红框中的内容:

未分类

在打开后的页面中按照下图的箭头依次选择和点击:

未分类

这时候再点击右上角的”注销”按钮,退出重现登录,如下图红框所示:

未分类

再重新登录后,就能看见页面已经全部中文显示了,如下图:

未分类

以上就是Docker下实战zabbix的第一部分,快速体验zabbix系统和服务,但只有一个zabbix server服务器意义不大,毕竟实际场景是要通过zabbix系统去监控其他机器和服务,下一章我们尝试把zabbix agent加入进来,以更接近实际场景的方式来继续学习zabbix。

MySQL 5.7使用Xtrabackup搭建GTID主从

MySQL版本是5.7.17

操作系统是CentOS 7

MySQL数据目录:/alidata1/mysql

MySQL备份目录:/alidata1/backup/full_mysql

在master及slave机器安装xtrabackup软件

[root@iz2ze6jo3o3bqbcongnypqz innobackupex]# rpm -ivh percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
warning: percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:
libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.9-1.el7.x86_64
perl(DBD::mysql) is needed by percona-xtrabackup-24-2.4.9-1.el7.x86_64
perl(Digest::MD5) is needed by percona-xtrabackup-24-2.4.9-1.el7.x86_64
rsync is needed by percona-xtrabackup-24-2.4.9-1.el7.x86_64

libev.so.4()的解决到下面这里下载操作系统对应的版本,本例下载的是libev-4.15-7.el7.x86_64.rpm

http://rpmfind.net/linux/rpm2html/search.php?query=libev.so.4%28%29%2864bit%29&submit=Search+...&system=&arch=

perl(DBD::mysql)和perl(Digest::MD5),需要安装mysql-community-libs-compat-5.7.17-1.el7.x86_64.rpm,在安装包里找到即可

在master机器操作

1、在数据库创建备份账号

CREATE USER xtrabk@'localhost' IDENTIFIED BY 'onlyxtrabk!@#$';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT,Process ON *.* TO xtrabk@'localhost';
FLUSH PRIVILEGES;

2、备份主库

innobackupex --defaults-file=/etc/my.cnf --user=xtrabk --password='onlyxtrabk!@#$' --parallel=4 /alidata1/backup/full_mysql --no-timestamp

在slave机器操作

1、停止mysql,删除或者重命名Mysql数据目录

systemctl stop mysqld.service
rm -rf /alidata1/mysql/data
rm -rf /alidata1/mysql/redolog

2、应用日志及数据库还原

innobackupex --defaults-file=/etc/my.cnf --apply-log /alidata1/backup/full_mysql
innobackupex --defaults-file
=
/
etc
/
my
.
cnf --copy-back
/
alidata1
/
backup
/
full_mysql

3、修改数据目录的宿主权限

chown -R mysql:mysql /alidata1/mysql

4、启动mysql

systemctl start mysqld.service

5、过滤掉已执行过的gtid

cat /alidata1/backup/full_mysql/xtrabackup_info |grep binlog_pos
[root@iz2ze6jo3o3bqbcongnyppz full_mysql]# cat /alidata1/backup/full_mysql/xtrabackup_info |grep binlog_pos
binlog_pos = filename 'bin.000131', position '615481029', GTID of the last change 'c9c73c70-c089-11e7-8544-00163e0ad76e:1-107089934'

6、查看slave已执行的gtid是否为空,如果不为空,需要执行reset MASTER进行清理,否则无法设置gtid。

mysql> show master status G;
*************************** 1. row ***************************
             File: bin.000001
         Position: 154
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set: c9c73c70-c089-11e7-8544-00163e0ad76e:1-106016597
1 row in set (0.00 sec)

7、执行reset master

8、执行GTID_PURGED

SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED='c9c73c70-c089-11e7-8544-00163e0ad76e:1-107089934';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

9、change master

change master to
master_host='192.168.2.71',
master_port=3306,
master_user='repl',
master_password='REPLsafe!@#$71',
MASTER_AUTO_POSITION = 1;

10、start slave ;

11、show slave statusG;

安装 mysql 备份工具 Percona XtraBackup

xtrabackup第三方备份工具

Xtrabackup 是percona公司的开源项目,用以实现类似innodb官方的热备份工具InnoDB Hot Backup的功能,能够非常快速地备份与恢复mysql数据库。 Xtrabackup中包含两个工具:
xtrabackup是用于热备份innodb, xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。

下载地址

http://www.percona.com/software/percona-xtrabackup

下载安装xtrabackup

下载libev-4.15-1.el6.rf.x86_64.rpm 包
https://centos.pkgs.org/6/repoforge-x86_64/libev-4.15-1.el6.rf.x86_64.rpm.html
[[email protected] software]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
配置yum源 安装perl-Digest-MD5包
参考yum 配置方法:http://www.cndba.cn/dave/article/154
[[email protected] software]# yum -y install perl-Digest-MD5
安装percona xtrabackup
[[email protected] software]# rpm -ivh percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

全量备份示例:

innobackupex --host=localhost --user=dbbackup --password=123456 /backup/

增量备份示例:

innobackupex –host=localhost –user=dbbackup –password=123456 –incremental –incremental-basedir=/backup/2017-12-13_17-49-45/ /backup/incremental/

通过Xtrabackup日志来恢复检查点文件

最近积压了很多朋友的问题,我想起来的时候就回复一下,别见怪,不是我有势利眼。

前几天有个朋友问我的问题,是在xtrabackup的时候,没有特别保留checkpoints文件,想问问能否通过日志来推理得到里面的LSN信息呢,背景条件是做全备。

一个参考的日志如下:

171208 11:21:54 [01] Copying ./sbtest/dba_xtrabackupresult.frm to /data/backup/sbtest/dba_xtrabackupresult.frm

171208 11:21:54 [01] ...done

171208 11:21:54 Finished backing up non-InnoDB tables and files

171208 11:21:54 [00] Writing /data/backup/xtrabackup_binlog_info

171208 11:21:54 [00] ...done

171208 11:21:54 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...

xtrabackup: The latest check point (for incremental): ' 3985406424'

xtrabackup: Stopping log copying thread.

....171208 11:21:55 >> log scanned up to ( 4060591382)

171208 11:21:55 >> log scanned up to ( 4060591382) 171208 11:21:55 Backup created in directory '/data/backup/'

MySQL binlog position: filename 'mysqlbin.000017', position ' 96607849'

171208 11:21:55 [00] Writing /data/backup/backup-my.cnf

171208 11:21:55 [00] ...done

171208 11:21:55 [00] Writing /data/backup/xtrabackup_info

171208 11:21:55 [00] ...done

xtrabackup: Transaction log of lsn ( 3597739074) to ( 4060591382) was copied.

171208 11:21:57 completed OK!

可以看到日志里面出现了很多的LSN的信息,首先是能够根据日志得到LSN的信息,然后是如果可以的话,这些LSN是如何做选择的。

我们必然要引入xtrabackup的原理和过程图

总体来说xtrabackup会通过物理拷贝的方式,然后来补充增量的数据变化。整个过程和Oracle的热备有些类似。日志中的信息相对来说还是很全的,作为参考是足够的。

然后如何恢复呢,我们需要知道有哪些LSN是需要的。

一般来说,一个checkpoints文件需要如下的LSN信息

[root@tk-dba-mysql10-202 backup]# cat *checkpoints

backup_type = full-backuped

from_lsn = xx

to_lsn = xx

last_lsn = xx

compact = 0

recover_binlog_info = 0

为了避免干扰,我做了一些过滤,可以看到基本是由FROM_LSN,TO_LSN,LAST_LSN组成的,如果是全备,from_lsn应该是0,如果数据库没有负载,或者在这个备份的过程中没有什么写入,那么to_lsn和last_lsn是一致的。

可是上面的日志很明显,是在数据库比较繁忙的情况下做的备份,所以产生了很多的临界点的 LSN,所以通过这些细节就需要我们知道整个xtrabackup的过程中LSN的变化

我就不兜圈子了,通过模拟,得到的一个初步结论如下:

[root@tk-dba-mysql10-202 backup]# cat *checkpoints

backup_type = full-backuped

from_lsn = 0

to_lsn = 3985406424

last_lsn = 4060591382

compact = 0

recover_binlog_info = 0

这个过程是怎么模拟的呢,是在前端通过sysbench做压力测试,然后使用xtrabackup来备份。整个过程还是比较快的,大概半个小时内能够验证完成。