5-zabbix监控案例
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_RCVDSYN_SENT:SYN_SENT状态表示客户端已发送SYN=1的请求连接报文, 发送之后客户端就会将自己的端口状态置为SYN_SENTESTABLISHED: 表示已经连接成功, 客户端收到服务器的确认报文会回复服务器, 然后就将端口置为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

TCP三次握手

TCP四次断开

1.2 配置主动模式的zabbix-agent服务器
准备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 加上执行权限, 并验证效果
[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在监控主动模式的基础上修改
/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 重启
zabbix-agent服务[root@agent zabbix_agentd.d]# systemctl restart zabbix-agent 然后在主动模式的
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页面配置
临时创建一个
tcp连接的模板tcp_conn

选择创建已经添加的模板,


在模板中创建新的
LISTEN连接数量的监听项 , 按照脚本中的模板中的模式添加即可
创建新主机, 并将刚才创建的模板添加到主机里面

之后可以在主机,最新数据里面看到获取的主机
LISTEN的连接数量
如果希望可以看到监控项按照图形显示, 直接点击模板中的图形

点击创建图形

添加对应的
LISTEN监控项目,之后点击确定即可
之后便可以直接在主机中看到对应tcp连接数量的图形

其他十种连接数量,按照之前的添加方式添加即可。
这里有一个已经创建好的TCP连接数量的模板。直接在页面导入即可
在模板中直接点击导入

选择自制模板


之后在主机中,添加刚导入的模板

之后点击查看即可

2. 监控memcached
2.1 配置memcached服务
在
agent节点安装memcache服务以及nc命令[root@agent ~]# yum install memcached nc -y #ubuntu安装nmap ,memcached调整配置文件
[root@agent ~]# cat /etc/sysconfig/memcached PORT="11211" USER="memcached" MAXCONN="4096" #最大连接数 CACHESIZE="1024" #最大缓存 OPTIONS="" 启动
memcached服务[root@agent ~]# systemctl start memcached用
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在
/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编辑
/etc/zabbix/zabbix_agentd.conf配置文件Include=/etc/zabbix/zabbix_agentd.d/*.conf在
/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重启zabbix-agent服务
[root@agent zabbix_agentd.d]# systemctl restart zabbix-agent在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模板
在
zabbix页面上创建一个通用的memcached模板
在创建好的
memcached_linux模板下,创建监控项和图形

创建图形

创建触发器


将之前创建好的主机关联模板

观察监控数据

3. 监控 Redis
3.1 安装配置redis服务器
安装
epel源及redis包[root@agent ~]# yum install epel-release -y [root@agent ~]# yum install redis -y简单配置
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创建
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将脚本加上执行权限
[root@agent ~]# chmod +x /etc/zabbix/zabbix_agentd.d/redis_status.sh验证脚本是否存在错误, 在节点主机上执行脚本看能否取出数据
[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将脚本的路径存放在前面创建的
/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重启主机的
zabbix-agent服务[root@agent ~]# systemctl restart redis在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页面配置
创建新的
redis状态的模板
创建监控项
创建客户端连接数的监控项

创建redis已用内存使用量监控项

创建触发器
客户端连接数触发器

redis已用内存。限制在2G以内,需要将G转换为字节:2*1024*1024*1024=2147483648
创建图形
redis客户端连接数
redis已用内存
将模板添加到对应主机中

查看对应主机数据

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)。安装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; }启动
nginx服务[root@agent ~]# systemctl start nginx在
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修改
/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重启
zabbix-agent服务 :systemctl restart zabbix-agent在主机上验证脚本是否可以执行,返回一个数字,说明可以执行
[root@agent ~]# bash /etc/zabbix/zabbix_agentd.d/nginx_status.sh nginx_status 80 active 1
4.2 配置zabbix页面
导入自制的模板
这里显示具体模板中的内容



需要注意
net.tcp.listen[80]:zabbix自带键值,主要用于监测端口, 如果端口开启则为1,否则为0
将该模板添加到主机中

添加之后可以看到已经获取到数据

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服务器
主从数据库都需要安装
zabbix-agent# yum install zabbix-agent -ynode4主机需要安装zabbix-proxy-mysql包# yum install zabbix-proxy-mysql -y
5.1.2. 安装配置主从数据库
在
node1和node2主机上安装mariadb-server数据库# yum install mariadb-server -y配置主服务
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启动
mariadb主服务器的数据库# systemctl start mariadb配置从服务器的
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启动从服务器的数据库
# systemctl start mariadb在主服务器上(
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)在主服务器的数据库备份数据,并导出到
/opt目录下[root@node1 ~]# mysqldump -A -F --single-transaction --master-data=1 > /opt/backup.sql将备份出来
的backup.sql数据传到从数据库上(node2主机上)[root@node1 ~]# scp /opt/backup.sql 192.168.7.102:/opt查看主数据库传到从数据库的二进制日志初始的名称 :
vim /opt/backup.sql
在从服务器上,将
/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,说明正常
5.1.3 官网下载percona的zabbix监控插件
官网下载地址 : https://www.percona.com/downloads/
官方文档 : https://www.percona.com/doc/percona-monitoring-plugins/LATEST/zabbix/index.html
进入官网然,然后选择
Percona的zabbix监控插件
选择最新版本,并选择
centos7系统,然后复制percona关联的zabbix的插件包链接,在linux上下载并安装
在(从服务器上)
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]在从服务器上安装
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在从服务器上复制
percona的zabbix插件模板[root@node2 ~]# cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/配置从服务器的
/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地址重启
zabbix-agent服务 :systemctl restart zabbix-agent新建一个配置文件:
/var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php.cnf在从服务器上安装
php和php-mysql包# yum install php php-mysql -y用脚本测试页面是否会显示数据,如果显示数据,说明正确
[root@node2 ~]# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg 5599在从服务器验证完之后,因此测试的文件是
root执行生成的文件,此时在zabbix-server服务器端验证就会获取不到数据,所以必须删除脚本测试的临时文件,临时文件在/tmp/目录下。[root@node2 ~]# rm -rf /tmp/localhost-mysql_cacti_stats.txt在
zabbix-server服务器端获取数据[root@zabbix ~]# zabbix_get -s 192.168.7.102 -p 10050 -k "MySQL.Key-read-requests" 5599此时在从服务器上查看/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模板
导入自制的
Percona模板
将主机关联到前面创建的主动模式的
proxy代理服务器node4上
关联
Percon模板
将
percona模板的监控项被动模式改为主动模式
此时可以看到从服务器的主机的
zabbix-agent变绿了
查看此时监控的结果

5.2 自定义监控项监控数据库
5.2.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验证脚本返回值,检查返回为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将
mysql_monitor.sh加上执行权限# chomd +x mysql_monitor.sh创建一个调用脚本的文件:
vim /etc/zabbix/zabbix_agentd.d/mysql_monitor.confUserParameter=mysql_monitor[*],/etc/zabbix/zabbix_agentd.d/mysql_monitor.sh $1重启
zabbix-agent服务,并在zabbix-server服务器端验证返回效果:systemctl restart zabbix-agent在
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主动模式代理的模板
创建
mysql_linux模板
在创建了
mysql_linux模板下,创建监控项
添加从服务器主机

将从服务器关联到创建
mysql监控的模板上
创建主从同步检查的图形

创建
mysql时延监控项
创建
mysql时延监控图形
创建
mysql主从同步检查触发器
创建主从同步延时触发器,时延大于
300ms就会触发动作
查看此时的
mysql监控时延信息。
查看
mysql监控的同步信息
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)