zoukankan      html  css  js  c++  java
  • 使用zabbix监控sql server的发布订阅

    (一)背景

    个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在发布订阅环境搭建完成后,最重要的就是如何监控复制的状态了,sql server提供了复制监视器来方便我们监控复制状态、复制延迟等信息,总体来说,非常好用,复制监视器的界面如下,能够很清楚的看到哪些失败了,哪些有延迟。

    clipboard

    clipboard

    然而,在运维过程中发现,我们不可能一直盯着复制监视器,甚至每天看一次都不可能,往往发生了同步故障,发布订阅停止了几天才发现。因此,如何实时监控订阅发布变得非常急切,因为公司使用的是zabbix监控,所以希望把对sql server的监控也放在zabbix上。


    (二)监控方法概述

    zabbix提供了多种方法来监控数据库,常见方法如下:

    个人试了一下插件监控方式,配置起来较为复杂,也不知道如何自定义新的监控项。最终选择了zabbix+unixODBC来监控sql server数据库。


    (三)监控逻辑

    sql server的发布订阅错误信息存储在 [distribution].[dbo].[MSrepl_errors] 表中,信息如下:

    clipboard

    可以看到,如果发布订阅出现异常,每分钟大约会报出3条错误,这里我们简单粗暴的监控错误次数:如果最近1小时出现了5次报错,则认为复制存在异常,具体SQL语句如下:

    select case when count(*) > 5 then 'REPL_ERROR' else 'NORMAL' END monitor from [distribution].[dbo].[MSrepl_errors] a where a.time > dateadd(hour,-1,GETDATE());


    (四)具体实现过程

    使用zabbix自带的数据库监控API,依赖于zabbix server的ODBC,而ODBC又依赖于freetds。下面我们依次安装配置:freetds --> unixODBC --> zabbix监控

    (4.1)安装freetds

    下载freetds http://www.freetds.org/software.html

    解压freetds:

    [root@zabbixserver ~]# ll
    -rw-r--r--   1 root  root  3038783 Sep  9 11:33 freetds-1.2.4.tar.gz
    
    [root@zabbixserver ~]# tar -xzvf freetds-1.2.4.tar.gz 
    
    [root@zabbixserver freetds-1.2.4]# ls
    aclocal.m4  CMakeLists.txt  config.status    COPYING.txt   freetds.spec.in  libtool       Makefile.am    NEWS.md    src          vms
    AUTHORS.md  compile         config.sub       depcomp       include          locales.conf  Makefile.in    PWD        tds.dox      win32
    autogen.sh  config.guess    configure        doc           INSTALL.md       ltmain.sh     misc           PWD.in     test-driver
    BUGS.md     config.log      configure.ac     freetds.conf  install-sh       m4            missing        README.md  Thanks-1.0
    ChangeLog   config.rpath    COPYING_LIB.txt  freetds.spec  interfaces       Makefile      mkinstalldirs  samples    TODO.md

    安装freetds:

    # freetds需要使用gcc编译,先安装gcc
    yum install gcc
    
    [root@zabbixserver freetds-1.2.4]# pwd
    /root/freetds-1.2.4
    
    # 手动编译安装
    ./configure --prefix=/usr/local/freetds  --enable-msdblib
    make
    make install


    (4.2)安装unixODBC

    yum install -y unixODBC unixODBC-devel

    在/etc/odbcinst.ini中配置驱动程序,添加

    [FreeTDS]                                       # unixodbc驱动名称
    Description=FreeTDS driver                      # 简介    
    Driver=/usr/local/freetds/lib/libtdsodbc.so     # 驱动所在位置,需要检查该驱动是否存在,如果不存在,建议重新编译安装freetds

    在/etc/odbc.ini中配置数据库连接认证

    [root@zabbixserver ~]# cat /etc/odbc.ini
    [mssql71]   
    Driver = FreeTDS
    Server = 10.1.106.71 
    PORT = 1433
    TDS_Version = 8.0
    
    [mssql72]   
    Driver = FreeTDS
    Server = 10.1.106.72 
    PORT = 1433
    TDS_Version = 8.0

    使用unixODBC连接数据库,连接数据库的格式为:

    isql db_str user password

    db_str           :数据库连接字符串,在/etc/odbc.ini文件中定义
    user              :数据库用户名
    pawwword     :数据库密码


    连接数据库进行测试,可以正常访问数据库

    [root@zabbixserver ~]# isql mssql71 sa zxc@1234
    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+
    
    SQL> select getdate();
    +------------------------+
    | 2020-09-09 14:20:03.933|
    +------------------------+
    SQLRowCount returns 1
    1 rows fetched
    SQL>


    (4.3)配置zabbix监控项和触发器

    配置zabbix监控项,在zabbix上打开sql server主机,添加监控项:

    • 名称:监控项的名称,可以随便填,为了好记,建议为monitor_repl
    • 类型:数据库监控
    • 键值:db.odbc.select[str1,str2]:第1个字符串随便填,第2个字符串是数据库连接字符串,是在zabbix服务器的/etc/odbc.ini中定义的。
    • 用户名:sql server的连接用户
    • 密码:sql server的连接密码
    • SQL查询:自定义sql语句,我们这里监控发布订阅的SQL语句为
    select case when count(*) > 5 then 'REPL_ERROR' else 'NORMAL' END monitor from [distribution].[dbo].[MSrepl_errors] a where a.time > dateadd(hour,-1,GETDATE());

    clipboard

    在完成监控项的创建之后,需要到最新数据里面查看是否收到了数据,这里可以看到已经有数据收到了。

    image

    接下来创建触发器:

    clipboard

    到zabbix的首页查看,已经捕获到了复制错误

    clipboard


    (五)总结

    通过zabbix+unixODBC,我们实现了自定义监控sql server数据库的发布订阅功能,总结一下:

    (1)如果要添加新的sql server数据库,只需要在zabbix server服务器上的/etc/odbc.ini里面添加数据库连接字符串即可;

    (2)如果要添加新的监控项,只需在zabbix web界面对应的sql server主机处添加监控项并输入SQL语句即可。



    【完】

  • 相关阅读:
    无序数组求第K大/第K小的数
    [洛谷][二分搜索]进击的奶牛
    [015]向下类型转换和向上类型转换
    [014]析构函数为虚函数的注意事项
    [013]函数重载--int*和void*的匹配优先级
    [012]链表笔记--在链表中插入一个节点
    [011]链表笔记--删除一个链表节点
    [002]链表笔记--编程实现一个单链表的创建/测长/打印
    [C++]对象的销毁机制
    [011]默认实参
  • 原文地址:https://www.cnblogs.com/lijiaman/p/13641102.html
Copyright © 2011-2022 走看看