5-zabbix监控案例

熊 1 阅读 监控平台

1. 监控TCP连接数

1.1 TCP 基础

TCP ,全称Transfer Control Protocol , 中文名为传输控制协议, 它工作在OSI的传输层, 提供面向连接的可靠传输服务, TCP的工作主要是建立连接, 然后从应用层程序中接收数据并进行传输。TCP采用虚电路连接方式进行工作, 在发送数据前它需要在发送方和接收方建立一个连接, 数据在发送出去后, 发送方会等待接收方给出一个确定性应答, 否则发送方将认为此数据丢失, 并重新发送此数据。

在建立连接的时候, 所谓的客户端与服务端是相对应的, 即要看是谁主动连接的谁, 如果A主动连接B, 那么A就是客户端而B是服务端, 如果反过来B主动连接A, 那么B就是客户端A就成了服务端。

TCP端口的十一种连接状态 :

  • CLOSED : 端口默认是关闭状态

  • LISTEN : 服务器程序监听一个端口, 就是LISTEN状态

  • SYN_RCVD : 三次握手的第二次握手后的端口状态, 是收到了客户端发送的SYN_SENT数据包之后的状态, 这个状态很短暂 ,正常在服务器上是很少看到的, 除非服务器故意不发送最后一次握手数据包, 服务器返回给客户端SYN 确认之后就会将在自己的端口置为SYN_RCVD

  • SYN_SENT : SYN_SENT状态表示客户端已发送SYN=1的请求连接报文, 发送之后客户端就会将自己的端口状态置为SYN_SENT

  • ESTABLISHED : 表示已经连接成功, 客户端收到服务器的确认报文会回复服务器, 然后就将端口置为ESTABLISHED ,服务器第三次收到客户端的ACK确认就会将端口置为ESTABLISHED并开始传输数据

  • FIN_WAIT_1 : 出现在主动关闭方,FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,当任意一方想主动关闭连接, 想对方发送了FIN=1的断开连接请求报文, 此时该SOCKET即进入到FIN_WAIT_!状态, 而当对方回应ACK报文后, 则进入到FIN_WAIT_2状态 , 当然在实际的正常情况下, 无论对方何种情况下, 就应该马上回应ACK报文, 所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到

  • FIN_WAIT_2: 出现在主动关闭方, 当被动方回应FIN_WAIT_1的ACK报文后, 则进入到FIN_WAIT_2状态

  • TIME_WAIT : 出现在主动关闭方, 表示收到了对方的FIN请求关闭报文, 并发送出了ACK报文, 就等2*MSL(Max Segment Lifetime)后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下, 收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态, 而无须经过FIN_WAIT_2状态

  • CLOSING : 这种状态比较特殊, 实际情况种应该时很少见, 属于一种比较罕见的例外状态。正常情况下, 当你发送FIN报文后, 按理来说,是应该先收到(或者同时收到)对方的ACK报文, 再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后, 并没有收到对方的ACK报文, 反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论; 那就是如果双方几乎同时close一个SOCKET的话, 那么就出现了双方同时发送FIN报文的情况, 也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接

  • CLOSE_WAIT : 表示在等待关闭端口, 这种状态存在于被动关闭的一方

  • LAST_ACK : 是被动关闭方在主动关闭一方在发送FIN报文后,最后等待对方的ACK报文,当再次收到ACK报文后, 也即进入到CLOSED可用状态了

端口转换状态

按照服务端与客户端将端口状态区分:

  • 主动端口方:SYN_SENT、FIN_WAIT1 、FIN_WAIT2、CLOSING、TIME_WAIT

  • 被动断开方: LISTEN 、SYN_RCVD 、LAST_ACK

  • 都具有的: CLOSED 、ESTABLISHED

1769223-20200224115304101-503260560

TCP三次握手

1769223-20200224115333385-1719903937

TCP四次断开

image-20240318160125602

1.2 配置主动模式的zabbix-agent服务器

  1. 准备TCP连接数的提取脚本

    [root@agent zabbix_agentd.d]# cat tcp_conn.sh 
    #!/bin/bash
    tcp_conn_status(){
        TCP_STAT=$1
        ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/tcp_conn.txt
        TCP_NUM=$(grep "$TCP_STAT" /tmp/tcp_conn.txt | cut -d ' ' -f2)
        if [ -z $TCP_NUM ];then
           TCP_NUM=0
        fi
        echo $TCP_NUM
        }
     
     
    main(){
        case $1 in
          tcp_status)
            tcp_conn_status $2;
            ;;
        esac
          }
    main $1 $2
    [root@agent zabbix_agentd.d]# pwd
    /etc/zabbix/zabbix_agentd.d
    ​
  2. 加上执行权限, 并验证效果

    [root@agent zabbix_agentd.d]# chmod +x tcp_conn.sh 
    [root@agent zabbix_agentd.d]# bash tcp_conn.sh tcp_status LISTEN       # 查看此时提取连接数的效果
    4
    [root@agent zabbix_agentd.d]# bash tcp_conn.sh tcp_status WAIT-TIME     # 查看此时提取连接数的效果
    0

    验证完成脚本后,生成在/tmp/tcp_conn.txt文件是root用户的,可以将其文件删除或者修改属主为zabbix即可。

    [root@agent zabbix_agentd.d]# rm -rf  /tmp/tcp_conn.txt
    [root@agent zabbix_agentd.d]# chown -R zabbix.zabbix   /tmp/tcp_conn.txt
  3. 在监控主动模式的基础上修改/etc/zabbix/zabbix_agent.conf配置文件

    [root@agent zabbix_agentd.d]# grep -i "^[a-Z]" /etc/zabbix/zabbix_agentd.conf 
    ​
    Server=192.168.194.131
    ServerActive=192.168.194.131
    Hostname=192.168.194.135
    UserParameter=linux_status[*],/etc/zabbix/zabbix_agentd.d/tcp_conn.sh $1 $2 
    ​
    ​
  4. 重启zabbix-agent服务

    [root@agent zabbix_agentd.d]# systemctl restart zabbix-agent
    ​
  5. 然后在主动模式的server主机上进行验证脚本的传递,显示数字之后,说明配置正确

    [root@zabbix-server ~]# /apps/zabbix_server/bin/zabbix_get -s 192.168.194.135 -p "10050" -k "linux_status[tcp_status,LISTEN]"
    4
    [root@zabbix-server ~]# /apps/zabbix_server/bin/zabbix_get -s 192.168.194.135 -p "10050" -k "linux_status[tcp_status,WAIT_TIME]"
    0
    ​

1.3 zabbix页面配置

  1. 临时创建一个tcp连接的模板tcp_conn

    image-20240318165255104
    image-20240318165331284
  2. 选择创建已经添加的模板,

    image-20240318165508570
    image-20240318165540351
  3. 在模板中创建新的LISTEN连接数量的监听项 , 按照脚本中的模板中的模式添加即可

    image-20240318165643749
  4. 创建新主机, 并将刚才创建的模板添加到主机里面

    image-20240318170341631
  5. 之后可以在主机,最新数据里面看到获取的主机LISTEN的连接数量

    image-20240318170804535
  6. 如果希望可以看到监控项按照图形显示, 直接点击模板中的图形

    image-20240318171600699

    点击创建图形

    image-20240318171639981

    添加对应的LISTEN监控项目,之后点击确定即可

    image-20240318171740635
  7. 之后便可以直接在主机中看到对应tcp连接数量的图形

    image-20240318171857078

其他十种连接数量,按照之前的添加方式添加即可。

这里有一个已经创建好的TCP连接数量的模板。直接在页面导入即可

  • 在模板中直接点击导入

    image-20240318172309020

  • 选择自制模板

    image-20240318172340355
    image-20240318172508553
  • 之后在主机中,添加刚导入的模板

    image-20240318172616199
  • 之后点击查看即可

    image-20240318173824299

2. 监控memcached

2.1 配置memcached服务

  1. 在agent节点安装memcache服务以及nc命令

    [root@agent ~]# yum install memcached nc -y
    ​
    #ubuntu安装nmap ,memcached
    1. 调整配置文件

      [root@agent ~]# cat /etc/sysconfig/memcached 
      PORT="11211"
      USER="memcached"
      MAXCONN="4096"       #最大连接数
      CACHESIZE="1024"     #最大缓存
      OPTIONS=""
      ​
    2. 启动memcached服务

      [root@agent ~]# systemctl start memcached
    3. 用echo -e命令验证: 去除线程数和当前连接数的取值效果

      [root@agent ~]#  echo -e "stats\nquit" | nc 127.0.0.1 "11211" | grep "STAT curr_connections"  | awk '{print $3}'    # 取出当前连接数
      2
      [root@agent ~]# echo -e "stats\nquit" | nc 127.0.0.1 "11211" | grep "STAT threads"  | awk '{print $3}'            # 取出当前的线程数
      4
      [root@agent ~]# echo -e "stats\nquit" | nc 127.0.0.1 "11211"  # 查看所有的数据
      STAT pid 30752
      STAT uptime 1441
      STAT time 1710757088
      STAT version 1.5.22
      STAT libevent 2.1.8-stable
      STAT pointer_size 64
      STAT rusage_user 0.086984
      STAT rusage_system 0.060399
      STAT max_connections 4096
      STAT curr_connections 2
      STAT total_connections 8
      STAT rejected_connections 0
      STAT connection_structures 3
      STAT reserved_fds 20
      STAT cmd_get 0
      STAT cmd_set 0
      STAT cmd_flush 0
      STAT cmd_touch 0
      STAT cmd_meta 0
      STAT get_hits 0
      STAT get_misses 0
      STAT get_expired 0
      STAT get_flushed 0
      STAT delete_misses 0
      STAT delete_hits 0
      STAT incr_misses 0
      STAT incr_hits 0
      STAT decr_misses 0
      STAT decr_hits 0
      STAT cas_misses 0
      STAT cas_hits 0
      STAT cas_badval 0
      STAT touch_hits 0
      STAT touch_misses 0
      STAT auth_cmds 0
      STAT auth_errors 0
      STAT bytes_read 66
      STAT bytes_written 9527
      STAT limit_maxbytes 1073741824
      STAT accepting_conns 1
      STAT listen_disabled_num 0
      STAT time_in_listen_disabled_us 0
      STAT threads 4
      STAT conn_yields 0
      STAT hash_power_level 16
      STAT hash_bytes 524288
      STAT hash_is_expanding 0
      STAT slab_reassign_rescues 0
      STAT slab_reassign_chunk_rescues 0
      STAT slab_reassign_evictions_nomem 0
      STAT slab_reassign_inline_reclaim 0
      STAT slab_reassign_busy_items 0
      STAT slab_reassign_busy_deletes 0
      STAT slab_reassign_running 0
      STAT slabs_moved 0
      STAT lru_crawler_running 0
      STAT lru_crawler_starts 1785
      STAT lru_maintainer_juggles 1490
      STAT malloc_fails 0
      STAT log_worker_dropped 0
      STAT log_worker_written 0
      STAT log_watcher_skipped 0
      STAT log_watcher_sent 0
      STAT bytes 0
      STAT curr_items 0
      STAT total_items 0
      STAT slab_global_page_pool 0
      STAT expired_unfetched 0
      STAT evicted_unfetched 0
      STAT evicted_active 0
      STAT evictions 0
      STAT reclaimed 0
      STAT crawler_reclaimed 0
      STAT crawler_items_checked 0
      STAT lrutail_reflocked 0
      STAT moves_to_cold 0
      STAT moves_to_warm 0
      STAT moves_within_lru 0
      STAT direct_reclaims 0
      STAT lru_bumps_dropped 0
      END
    4. 在/etc/zabbix/zabbix_agentd.d目录下书写memcached.sh脚本,并加上执行权限

      [root@agent ~]# cat /etc/zabbix/zabbix_agentd.d/memcached.sh
      #!/bin/bash
      memcached_status(){
          M_PORT=$1
          M_COMMAND=$2
          echo -e "stats\nquit" | nc 127.0.0.1 "$M_PORT" | grep "STAT $M_COMMAND" | awk '{print $3}'
      }
       
      main(){
          case $1 in
            memcached_status)
                   memcached_status $2 $3
            ;;
          esac
      }
       
      main $1 $2 $3

      加上执行权限

      [root@agent ~]# chmod +x /etc/zabbix/zabbix_agentd.d/memcached.sh

      验证脚本效果

      [root@agent ~]#  bash /etc/zabbix/zabbix_agentd.d/memcached.sh  memcached_status 11211 curr_connections
      2
    5. 编辑/etc/zabbix/zabbix_agentd.conf配置文件

      Include=/etc/zabbix/zabbix_agentd.d/*.conf
    6. 在/etc/zabbix/zabbix_agentd.d/目录下创建zabbix_agent_linux.conf配置文件,修改配置文件,调用memcached.sh脚本文件

      [root@agent ~]# cat /etc/zabbix/zabbix_agentd.d/zabbix_agent_linux.conf
      UserParameter=linux_status[*],/etc/zabbix/zabbix_agentd.d/tcp_conn.sh $1 $2  
      UserParameter=memcached_status[*],/etc/zabbix/zabbix_agentd.d/memcached.sh $1 $2 $3  
    7. 重启zabbix-agent服务

      [root@agent zabbix_agentd.d]# systemctl restart zabbix-agent
    8. 在zabbix-server服务器端验证此时的memcached服务器是否正常,返回正常,就可以再zabbix网页上添加主机和模板

      [root@zabbix-server ~]# /apps/zabbix_server/bin/zabbix_get  -s 192.168.194.135 -p 10050 -k "memcached_status[memcached_status,11211,curr_connections]"
      2

2.2 在zabbix页面上创建memcached模板

  1. 在zabbix页面上创建一个通用的memcached模板

    image-20240318184036324
  2. 在创建好的memcached_linux模板下,创建监控项和图形

    image-20240318185122181
    image-20240318185405373
  3. 创建图形

    image-20240318185646900
  4. 创建触发器

    image-20240318192808787
    image-20240318192330893
  5. 将之前创建好的主机关联模板

    image-20240318193142948
  6. 观察监控数据

    image-20240318193251145

3. 监控 Redis

3.1 安装配置redis服务器

  1. 安装epel源及redis包

    [root@agent ~]# yum install epel-release -y
    [root@agent ~]# yum install redis  -y
  2. 简单配置redis文件, 将监听地址改为0.0.0.0, 允许进行远程连接

    [root@agent ~]# vi /etc/redis.conf 
    bind 0.0.0.0
    [root@agent ~]# systemctl restart redis

    用redis-cli命令进入到redis服务器中,输入info查看关键的键值信息,用来创建监控项 :

    [root@agent ~]# redis-cli 
    127.0.0.1:6379> info
    # Server
    redis_version:5.0.3
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:9529b692c0384fb7
    redis_mode:standalone
    os:Linux 4.18.0-348.el8.x86_64 x86_64
    arch_bits:64
    multiplexing_api:epoll
    atomicvar_api:atomic-builtin
    gcc_version:8.4.1
    process_id:46284
    run_id:c4010eb16c87d4cb163052ef583ea99dbc0cb8a6
    tcp_port:6379
    uptime_in_seconds:64
    uptime_in_days:0
    hz:10
    configured_hz:10
    lru_clock:16263379
    executable:/usr/bin/redis-server
    config_file:/etc/redis.conf
    
    # Clients
    connected_clients:1
    client_recent_max_input_buffer:2
    client_recent_max_output_buffer:0
    blocked_clients:0
    
    # Memory
    used_memory:854912
    used_memory_human:834.88K
    used_memory_rss:13139968
    used_memory_rss_human:12.53M
    used_memory_peak:854912
    used_memory_peak_human:834.88K
    used_memory_peak_perc:100.12%
    used_memory_overhead:841710
    used_memory_startup:792016
    used_memory_dataset:13202
    used_memory_dataset_perc:20.99%
    allocator_allocated:1477016
    allocator_active:1810432
    allocator_resident:8744960
    total_system_memory:1876963328
    total_system_memory_human:1.75G
    used_memory_lua:37888
    used_memory_lua_human:37.00K
    used_memory_scripts:0
    used_memory_scripts_human:0B
    number_of_cached_scripts:0
    maxmemory:0
    maxmemory_human:0B
    maxmemory_policy:noeviction
    allocator_frag_ratio:1.23
    allocator_frag_bytes:333416
    allocator_rss_ratio:4.83
    allocator_rss_bytes:6934528
    rss_overhead_ratio:1.50
    rss_overhead_bytes:4395008
    mem_fragmentation_ratio:16.16
    mem_fragmentation_bytes:12327056
    mem_not_counted_for_evict:0
    mem_replication_backlog:0
    mem_clients_slaves:0
    mem_clients_normal:49694
    mem_aof_buffer:0
    mem_allocator:jemalloc-5.1.0
    active_defrag_running:0
    lazyfree_pending_objects:0
    
    # Persistence
    loading:0
    rdb_changes_since_last_save:0
    rdb_bgsave_in_progress:0
    rdb_last_save_time:1710762131
    rdb_last_bgsave_status:ok
    rdb_last_bgsave_time_sec:-1
    rdb_current_bgsave_time_sec:-1
    rdb_last_cow_size:0
    aof_enabled:0
    aof_rewrite_in_progress:0
    aof_rewrite_scheduled:0
    aof_last_rewrite_time_sec:-1
    aof_current_rewrite_time_sec:-1
    aof_last_bgrewrite_status:ok
    aof_last_write_status:ok
    aof_last_cow_size:0
    
    # Stats
    total_connections_received:1
    total_commands_processed:1
    instantaneous_ops_per_sec:0
    total_net_input_bytes:31
    total_net_output_bytes:11468
    instantaneous_input_kbps:0.00
    instantaneous_output_kbps:0.00
    rejected_connections:0
    sync_full:0
    sync_partial_ok:0
    sync_partial_err:0
    expired_keys:0
    expired_stale_perc:0.00
    expired_time_cap_reached_count:0
    evicted_keys:0
    keyspace_hits:0
    keyspace_misses:0
    pubsub_channels:0
    pubsub_patterns:0
    latest_fork_usec:0
    migrate_cached_sockets:0
    slave_expires_tracked_keys:0
    active_defrag_hits:0
    active_defrag_misses:0
    active_defrag_key_hits:0
    active_defrag_key_misses:0
    
    # Replication
    role:master
    connected_slaves:0
    master_replid:cdd79f7802e304720ce3afa6352769b97f9e823d
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:0
    second_repl_offset:-1
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    
    # CPU
    used_cpu_sys:0.023439
    used_cpu_user:0.035597
    used_cpu_sys_children:0.000000
    used_cpu_user_children:0.000000
    
    # Cluster
    cluster_enabled:0
    
    # Keyspace
  3. 创建redis采取关键信息脚本: /etc/zabbix/zabbix_agentd.d/目录下面常见redis_status.sh脚本

    [root@agent ~]# cat /etc/zabbix/zabbix_agentd.d/redis_status.sh
    #!/bin/bash
    redis_status(){
        R_PORT=$1
        R_COMMAND=$2
        (echo -en "INFO \r\n";sleep 1;) | nc 127.0.0.1 "$R_PORT" > /tmp/redis_"$R_PORT".tmp  #在/tmp目录下创建文件
        REDIS_STAT_VALUE=$(grep ""$R_COMMAND":" /tmp/redis_"$R_PORT".tmp | cut -d ':' -f2)
        echo $REDIS_STAT_VALUE
    }
    help(){
        echo "${0} + redis_status + PORT + COMMAND"
        }
         
    main(){
        case $1 in
          redis_status)
            redis_status $2 $3
            ;;
          *)
            help
            ;;
        esac
    }
     
    main $1 $2 $3
  4. 将脚本加上执行权限

    [root@agent ~]# chmod +x /etc/zabbix/zabbix_agentd.d/redis_status.sh
  5. 验证脚本是否存在错误, 在节点主机上执行脚本看能否取出数据

    [root@agent ~]# bash /etc/zabbix/zabbix_agentd.d/redis_status.sh redis_status 6379 used_memory
    853896
    [root@agent ~]# ll /tmp/redis_6379.tmp           ##生成的临时数据是root权限的,需要删除,因为zabbix是用zabbix启动的,此时的数据就会存在问题。
    -rw-r--r-- 1 root root 3266 Mar 18 07:55 /tmp/redis_6379.tmp
  6. 将脚本的路径存放在前面创建的/etc/zabbix/zabbix_agentd.d/zabbix_agent_linux.conf配置文件中

    [root@agent ~]# cat /etc/zabbix/zabbix_agentd.d/zabbix_agent_linux.conf
    UserParameter=linux_status[*],/etc/zabbix/zabbix_agentd.d/tcp_conn.sh $1 $2  
    UserParameter=memcached_status[*],/etc/zabbix/zabbix_agentd.d/memcached.sh $1 $2 $3  
    UserParameter=redis_status[*],/etc/zabbix/zabbix_agentd.d/redis_status.sh $1 $2 $3 
  7. 重启主机的zabbix-agent服务

    [root@agent ~]# systemctl restart redis
  8. 在zabbix-server服务端验证node1主机,是否可以获取到数据

    [root@zabbix-server ~]# /apps/zabbix_server/bin/zabbix_get  -s 192.168.194.135 -p 10050 -k "redis_status[redis_status,6379,used_cpu_sys]"
    0.059430
    [root@zabbix-server ~]# /apps/zabbix_server/bin/zabbix_get  -s 192.168.194.135 -p 10050 -k "redis_status[redis_status,6379,used_memory]"
    853896
    [root@zabbix-server ~]# /apps/zabbix_server/bin/zabbix_get  -s 192.168.194.135 -p 10050 -k "redis_status[redis_status,6379,connected_clients]"
    1

3.2 redis页面配置

  1. 创建新的redis状态的模板

    image-20240318200734295
  2. 创建监控项

    • 创建客户端连接数的监控项

      image-20240318201037733
    • 创建redis已用内存使用量监控项

      image-20240318201224731
  3. 创建触发器

    • 客户端连接数触发器

      image-20240318201520171
    • redis已用内存。限制在2G以内,需要将G转换为字节: 2*1024*1024*1024=2147483648

      image-20240318201842282
  4. 创建图形

    • redis客户端连接数

      image-20240318202010185
    • redis已用内存

      image-20240318202114062
  5. 将模板添加到对应主机中

    image-20240318202227887
  6. 查看对应主机数据

    image-20240318215513625

4. 监控 nginx

4.1 配置nginx服务

[root@agent ~]# curl http://192.168.194.135/nginx_status 
Active connections: 1 
server accepts handled requests
 4 4 4 
Reading: 0 Writing: 1 Waiting: 0 

Active connections :  当前处于活动状态的客户端连接数,包括连接等待空闲连接数。
accepts : 统计总值,Nginx自启动后已经接受的客户端请求的总数。
handled : 统计总值,Nginx自启动后已经处理完成的客户端请求的总数,通常等于accepts,除非有因worker_connections限制等被拒绝的连接。
requests : 统计总值,Nginx自启动后客户端发来的总的请求数。
Reading : 当前状态,正在读取客户端请求报文首部的连接的连接数。
Writing : 当前状态,正在向客户端发送响应报文过程中的连接数。
Waiting : 当前状态,正在等待客户端发出请求的空闲连接数,开启keep-alive的情况下,这个值等于active–(reading+writing)。

  1. 安装nginx服务,并配置状态页

    [root@agent ~]# yum install nginx
    [root@agent ~]# vi /etc/nginx/nginx.conf  在server段进行配置
            location /nginx_status {
                 stub_status;
            #     allow 127.0.0.1;
            #     deny all;
            }
  2. 启动nginx服务

    [root@agent ~]# systemctl start nginx
  3. 在agent主机的/etc/zabbix/zabbix_agentd.d目录下创建一个nginx_status.sh脚本

    [root@agent ~]# chmod +x /etc/zabbix/zabbix_agentd.d/nginx_status.sh
    [root@agent ~]# cat /etc/zabbix/zabbix_agentd.d/nginx_status.sh
    #!/bin/bash
     
    nginx_status_fun(){ #函数内容
        NGINX_PORT=$1 #端口,函数的第一个参数是脚本的第二个参数,即脚本的第二个参数是段端口号
        NGINX_COMMAND=$2 #命令,函数的第二个参数是脚本的第三个参数,即脚本的第三个参数是命令
        nginx_active(){ #获取nginx_active数量,以下相同,这是开启了nginx状态但是只能从本机看到
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
            }
        nginx_reading(){ #获取nginx_reading状态的数量
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
           }
        nginx_writing(){
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
           }
        nginx_waiting(){
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
           }
        nginx_accepts(){
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
           }
        nginx_handled(){
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
           }
        nginx_requests(){
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
           }
        case $NGINX_COMMAND in
            active)
                nginx_active;
                ;;
            reading)
                nginx_reading;
                ;;
            writing)
                nginx_writing;
                ;;
            waiting)
                nginx_waiting;
                ;;
            accepts)
                nginx_accepts;
                ;;
            handled)
                nginx_handled;
                ;;
            requests)
                nginx_requests;
            esac
    }
     
    main(){ #主函数内容
        case $1 in #分支结构,用于判断用户的输入而进行响应的操作
            nginx_status) #当输入nginx_status就调用nginx_status_fun,并传递第二和第三个参数
                nginx_status_fun $2 $3;
                ;;
            *) #其他的输入打印帮助信息
                echo $"Usage: $0 {nginx_status key}"
        esac #分支结束符
    }
     
    main $1 $2 $3
  4. 修改/etc/zabbix/zabbix_agentd.d/zabbix_agent_linux.conf配置文件,和监控的memcached、redis一样

    [root@agent ~]# cat /etc/zabbix/zabbix_agentd.d/zabbix_agent_linux.conf
    UserParameter=linux_status[*],/etc/zabbix/zabbix_agentd.d/tcp_conn.sh $1 $2  
    UserParameter=memcached_status[*],/etc/zabbix/zabbix_agentd.d/memcached.sh $1 $2 $3  
    UserParameter=redis_status[*],/etc/zabbix/zabbix_agentd.d/redis_status.sh $1 $2 $3 
    
    UserParameter=nginx.status[*],/etc/zabbix/zabbix_agentd.d/nginx_status.sh $1 $2 $3
    # 添加最新监控的nginx脚本路径,由于自制的nginx模板是nginx.status,所以将此处也改为nginx.status
  5. 重启zabbix-agent服务 : systemctl restart zabbix-agent

  6. 在主机上验证脚本是否可以执行,返回一个数字,说明可以执行

    [root@agent ~]# bash /etc/zabbix/zabbix_agentd.d/nginx_status.sh nginx_status 80  active
    1

4.2 配置zabbix页面

  1. 导入自制的模板

  2. 这里显示具体模板中的内容

    image-20240318223809655
    image-20240318224030817
    image-20240318224056245

    需要注意

    • net.tcp.listen[80] :zabbix自带键值,主要用于监测端口, 如果端口开启则为1,否则为0

  3. 将该模板添加到主机中

    image-20240318224332423
  4. 添加之后可以看到已经获取到数据

    image-20240318224537505

5. 监控mysql

5.1 在percona插件监控mariadb数据库

5.1.1 环境准备

node1 : 192.168.7.101 master-mysql主数据库

node2 : 192.168.7.102 slave-mysql从数据库

node4 : 192.168.7.104 zabbix-proxy服务器

  1. 主从数据库都需要安装zabbix-agent

    # yum install zabbix-agent -y  
  2. node4主机需要安装zabbix-proxy-mysql包

    # yum install zabbix-proxy-mysql -y

5.1.2. 安装配置主从数据库

  1. 在node1和node2主机上安装mariadb-server数据库

    # yum install mariadb-server  -y
  2. 配置主服务mariadb数据库: /etc/my.cnf

    [mysqld]
    socket=/var/lib/mysql/mysql.sock
    user=mysql
    symbolic-links=0
    datadir=/data/mysql
    innodb_file_per_table=1
    relay-log = /data/mysql
    server-id=101
    log-bin=/data/mysql/master-log

    创建一个存放数据库的目录:

    # mkdir /data/mysql -p
    # chown -R mysql.mysql  /data/mysql
  3. 启动mariadb主服务器的数据库

    # systemctl start mariadb
  4. 配置从服务器的mariadb数据库: vim /etc/my.cnf

    [mysqld]
    socket=/var/lib/mysql/mysql.sock
    user=mysql
    symbolic-links=0
    datadir=/data/mysql
    innodb_file_per_table=1
    relay-log = /data/mysql
    server-id=102
    log-bin=/data/mysql/master-log

    创建一个存放数据库目录:

    # mkdir /data/mysql -p
    # chown -R mysql.mysql  /data/mysql
  5. 启动从服务器的数据库

    # systemctl start mariadb
  6. 在主服务器上(node1)创建linux数据库,并授权

    [root@node1 ~]# mysql
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 11
    Server version: 10.3.10-MariaDB-log MariaDB Server
     
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
     
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
     
    MariaDB [(none)]> create database linux; # 创建linux数据库
    MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'linux'@'192.168.7.%' IDENTIFIED BY '123456';
    Query OK, 0 rows affected (0.003 sec)
  7. 在主服务器的数据库备份数据,并导出到/opt目录下 

    [root@node1 ~]# mysqldump -A -F --single-transaction --master-data=1 > /opt/backup.sql
  8. 将备份出来的backup.sql数据传到从数据库上(node2主机上)

    [root@node1 ~]# scp /opt/backup.sql  192.168.7.102:/opt
  9. 查看主数据库传到从数据库的二进制日志初始的名称 : vim /opt/backup.sql

    1769223-20200225204320038-1472378426
  10. 在从服务器上,将/opt/backup.sql数据传到从服务器上

    [root@node2 ~]# mysql < /opt/backup.sql
    [root@node2 ~]# mysql  # 进入数据库
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 3
    Server version: 5.5.64-MariaDB MariaDB Server
     
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
     
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
     
    MariaDB [(none)]> show databases ; # 查看导入的linux数据库信息,此时已经导入到数据库内。
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | linux              |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)
    MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.7.101',MASTER_USER='linux',MASTER_PASSWORD='123456',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=342; # 同步主从数据库,从mysql-bin.000001开始复制,文件大小是342
    MariaDB [(none)]> start slave ; # 开始复制主数据库信息
    Query OK, 0 rows affected (0.00 sec)
     
    MariaDB [(none)]> show slave status\G; #查看此时的状态
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: 192.168.7.101
    Master_User: linux
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mysql-bin.000001
    Read_Master_Log_Pos: 385
    Relay_Log_File: node2-relay-bin.000002
    Relay_Log_Pos: 583
    Relay_Master_Log_File: mysql-bin.000001
    Slave_IO_Running: Yes  # 两个为yes,说明正常。
    Slave_SQL_Running: Yes
    Replicate_Do_DB:
    Replicate_Ignore_DB:
    Replicate_Do_Table:
    Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
    Replicate_Wild_Ignore_Table:
    Last_Errno: 0
    Last_Error:
    Skip_Counter: 0
    Exec_Master_Log_Pos: 385
    Relay_Log_Space: 877
    Until_Condition: None
    Until_Log_File:
    Until_Log_Pos: 0
    Master_SSL_Allowed: No
    Master_SSL_CA_File:
    Master_SSL_CA_Path:
    Master_SSL_Cert:
    Master_SSL_Cipher:
    Master_SSL_Key:
    Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
    Last_IO_Errno: 0
    Last_IO_Error:
    Last_SQL_Errno: 0
    Last_SQL_Error:
    Replicate_Ignore_Server_Ids:
    Master_Server_Id: 1

    查看此时的主从IO和SQL运行状态都为yes,说明正常

    1769223-20200225204441382-1189824226

5.1.3 官网下载percona的zabbix监控插件

官网下载地址 : https://www.percona.com/downloads/

官方文档 : https://www.percona.com/doc/percona-monitoring-plugins/LATEST/zabbix/index.html

安装教程 : https://www.percona.com/doc/percona-monitoring-plugins/LATEST/zabbix/index.html#installation-instructions

  1. 进入官网然,然后选择Percona的zabbix监控插件

    1769223-20200225210524007-1949535380
  2. 选择最新版本,并选择centos7系统,然后复制percona关联的zabbix的插件包链接,在linux上下载并安装

    1769223-20200225210850431-1036924356
  3. 在(从服务器上)linux系统上开始下载percona关联的zabbix插件

    [root@node2 ~]# wget https://www.percona.com/downloads/percona-monitoring-plugins/percona-monitoring-plugins-1.1.8/binary/redhat/7/x86_64/percona-zabbix-templates-1.1.8-1.noarch.rpm
    --2020-02-25 21:11:12--  https://www.percona.com/downloads/percona-monitoring-plugins/percona-monitoring-plugins-1.1.8/binary/redhat/7/x86_64/percona-zabbix-templates-1.1.8-1.noarch.rpm
    Resolving www.percona.com (www.percona.com)... 74.121.199.234
    Connecting to www.percona.com (www.percona.com)|74.121.199.234|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 28296 (28K) [application/x-redhat-package-manager]
    Saving to: ‘percona-zabbix-templates-1.1.8-1.noarch.rpm’
     
    100%[=======================================================================================================>] 28,296      38.0KB/s   in 0.7s  
     
    2020-02-25 21:11:25 (38.0 KB/s) - ‘percona-zabbix-templates-1.1.8-1.noarch.rpm’ saved [28296/28296]
  4. 在从服务器上安装percona关联的zabbix插件

    [root@node2 ~]# rpm -ivh percona-zabbix-templates-1.1.8-1.noarch.rpm
    warning: percona-zabbix-templates-1.1.8-1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
    Preparing...                          ################################# [100%]
    Updating / installing...
       1:percona-zabbix-templates-1.1.8-1 ################################# [100%]
     
    Scripts are installed to /var/lib/zabbix/percona/scripts
    Templates are installed to /var/lib/zabbix/percona/templates
  5. 在从服务器上复制percona的zabbix插件模板

    [root@node2 ~]# cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf  /etc/zabbix/zabbix_agentd.d/
  6. 配置从服务器的/etc/zabbix/zabbix_agentd.conf文件

    Server=192.168.7.100,192.168.7.104 # zabbix server服务器端的IP地址和主动模式代理服务器的IP地址
    ServerActive=192.168.7.104 # 代理服务器的IP地址
    Hostname=192.168.7.102  # 从服务器的IP地址
  7. 重启zabbix-agent服务 : systemctl restart zabbix-agent

  8. 新建一个配置文件:/var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php.cnf

  9. 在从服务器上安装php和php-mysql包

    # yum install php  php-mysql  -y
  10. 用脚本测试页面是否会显示数据,如果显示数据,说明正确

    [root@node2 ~]# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg
    5599
  11. 在从服务器验证完之后,因此测试的文件是root执行生成的文件,此时在zabbix-server服务器端验证就会获取不到数据,所以必须删除脚本测试的临时文件,临时文件在/tmp/目录下。

    [root@node2 ~]# rm -rf /tmp/localhost-mysql_cacti_stats.txt
  12. 在zabbix-server服务器端获取数据

    [root@zabbix ~]# zabbix_get  -s 192.168.7.102 -p 10050 -k "MySQL.Key-read-requests"
    5599
  13. 此时在从服务器上查看/tmp临时目录下的文件,就会创建以zabbix用户创建的文件

    [root@node2 ~]# ll /tmp/localhost-mysql_cacti_stats.txt
    -rw-rw-r-- 1 zabbix zabbix 1237 Feb 25 22:09 /tmp/localhost-mysql_cacti_stats.txt

5.1.4 在zabbix网页上创建Percona模板

  1. 导入自制的Percona模板

    1769223-20200225234123398-1283637976
  2. 将主机关联到前面创建的主动模式的proxy代理服务器node4上

    1769223-20200225234639110-1733797897
  3. 关联Percon模板

    1769223-20200225234727519-80499735
  4. 将percona模板的监控项被动模式改为主动模式

    1769223-20200225235056530-2029725197
  5. 此时可以看到从服务器的主机的zabbix-agent变绿了

    1769223-20200226000639582-958056977
  6. 查看此时监控的结果

    1769223-20200226000952469-989630062

5.2 自定义监控项监控数据库

5.2.1 在从服务器上创建检查主从同步自定义监控脚本

  1. 在从服务器上/etc/zabbix/zabbix_agentd.d/目录下创建脚本,调用脚本查看返回的值,脚本名称为mysql_monitor.sh

    #!/bin/bash
    Seconds_Behind_Master(){
            NUM=`mysql -uroot -hlocalhost   -e "show slave status\G;"  | grep "Seconds_Behind_Master:" | awk -F: '{print $2}'`
            echo $NUM
    }
     
    master_slave_check(){
    NUM1=`mysql -uroot -hlocalhost   -e "show slave status\G;"  | grep "Slave_IO_Running" | awk -F:  '{print $2}' | sed 's/^[ \t]*//g'`
    #echo $NUM1
    NUM2=`mysql -uroot -hlocalhost   -e "show slave status\G;"  | grep "Slave_SQL_Running:" | awk -F:  '{print $2}' | sed 's/^[ \t]*//g'`
    #echo $NUM2
    if test $NUM1 == "Yes" &&  test $NUM2 == "Yes";then
        echo 50
    else
        echo 100
    fi
    }
     
    main(){
        case $1 in
            Seconds_Behind_Master)
               Seconds_Behind_Master;
               ;;
            master_slave_check)
               master_slave_check
               ;;
        esac
    }
    main $1
  2. 验证脚本返回值,检查返回为50,时延返回为0,说明没问题。

    [root@node2 zabbix_agentd.d]# bash mysql_monitor.sh  master_slave_check
    50
    [root@node2 zabbix_agentd.d]# bash mysql_monitor.sh  Seconds_Behind_Master
    0
  3. 将mysql_monitor.sh加上执行权限

    # chomd +x mysql_monitor.sh
  4. 创建一个调用脚本的文件:vim /etc/zabbix/zabbix_agentd.d/mysql_monitor.conf

    UserParameter=mysql_monitor[*],/etc/zabbix/zabbix_agentd.d/mysql_monitor.sh $1
  5. 重启zabbix-agent服务,并在zabbix-server服务器端验证返回效果:systemctl restart zabbix-agent

  6. 在zabbix-server服务器端进行验证此时的脚本返回值,和在服务器上返回一致。

    [root@zabbix ~]# zabbix_get -s 192.168.7.102 -p 10050 -k "mysql_monitor[master_slave_check]"
    50
    [root@zabbix ~]# zabbix_get -s 192.168.7.102 -p 10050 -k "mysql_monitor[Seconds_Behind_Master]"
    0

5.2.2 在zabbix网页上创建模板,关联proxy主动模式代理的模板

  1. 创建mysql_linux模板

    1769223-20200225224641717-1819738320
  2. 在创建了mysql_linux模板下,创建监控项

    1769223-20200225225038276-1457411270
  3. 添加从服务器主机

    1769223-20200225214316498-1451463155
  4. 将从服务器关联到创建mysql监控的模板上

    1769223-20200225225238118-204413088
  5. 创建主从同步检查的图形

    1769223-20200225225541798-520713055
  6. 创建mysql时延监控项

    1769223-20200225225803291-1479523765
  7. 创建mysql时延监控图形

    1769223-20200225225922733-548469949
  8. 创建mysql主从同步检查触发器

    1769223-20200225230344948-1130242725
  9. 创建主从同步延时触发器,时延大于300ms就会触发动作

    1769223-20200225230526289-209748627
  10. 查看此时的mysql监控时延信息。

    1769223-20200226002354447-1644556084
  11. 查看mysql监控的同步信息

    1769223-20200226002501376-1830364746

6. 结合脚本监控案例

  • kubernetes集群状态监控脚本

    #!/usr/bin/env python
    #coding:utf-8
    
    import subprocess
    success_list = []
    error_list = []
    def get_status():
        obj = subprocess.Popen(("curl -sXGET http://10.20.15.209:8080/api/v1/nodes"),shell=True,stdout=subprocess.PIPE)
        data = obj.stdout.read()
        data1 = eval(data)
        data2 =data1.get('items')
        #print data2
        for i in data2:
            data3 = i.get('status')
            for i in data3.get('conditions'):
                if i.get('reason') == 'kubeletReady':
                   if i.get('type') == 'Ready':
                      if i.get('status') == 'True':
                          success_list.append(i.get('status'))
                      elif i.get('status') == 'false':
                           error_list.append(i.get('status'))
                      else:
                          break
                    else:
                         error_list.append(i.get('status'))
                         #pass
                else:
                     error_list.append(i.get('status'))
    def count_status():
        if len(error_list) == 0:
            print 50
        else:
            print 100
    def main():
        get_status()
        count_status()
    if __name__ == "__main__"
       main()
                                  
        
  • 统计磁盘IO脚本

    #!/bin/bash
    #Date: 2016/11/11
    #Author:zhangjie
    disk_read(){
      NUM=`/usr/bin/sudo iotop -b -n 3 | grep "Total DISK READ" | grep -v grep | awk  -F "|" '{print $1}' | awk -F ":" '{print $2}' |  tail -n1 | awk -F "/" '{print $1}'`
      NUM2=`echo $NUM | awk '{print $1}'`
      UNIT=`echo $NUM | awk '{print $2}'`
      if [ $UNIT == "B" ];then
        echo $NUM2
      elif [ $UNIT == "K" ];then
        NUM3=$(echo "$NUM2 * 1024" | bc)
        echo $NUM3
      elif [ $UNIT == "M" ];then
        NUM3=$(echo "$NUM2 * 1024 * 1024" | bc)
        echo $NUM3
      elif [ $UNIT == "G" ];then
        NUM3=$(echo "$NUM2 * 1024 * 1024 * 1024" | bc)
        echo $NUM3
      fi
    }
    disk_write(){
      NUM=`/usr/bin/sudo iotop -b -n 3 | grep "Total DISK WRITE :" |  grep -v grep | awk  -F "|" '{print $2}' | awk -F ":" '{print $2}' | tail -n1 | awk -F "/" '{print $1}'`
      NUM2=`echo $NUM | awk '{print $1}'`
      UNIT=`echo $NUM | awk '{print $2}'`
      if [ $UNIT == "B" ];then
        echo $NUM2
      elif [ $UNIT == "K" ];then
        NUM3=$(echo "$NUM2 * 1024" | bc)
        echo $NUM3
      elif [ $UNIT == "M" ];then
        NUM3=$(echo "$NUM2 * 1024 * 1024" | bc)
        echo $NUM3
      elif [ $UNIT == "G" ];then
        NUM3=$(echo "$NUM2 * 1024 * 1024 * 1024" | bc)
        echo $NUM3
      fi
    }
    
    main(){
        case $1 in
            disk_read)
               disk_read;
               ;;
            disk_write)
                disk_write;
                ;;
        esac
    }
    main $1


参考链接

Zabbix之九---Zabbix监控mysq数据库 - 一叶知秋~~ - 博客园 (cnblogs.com)