柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

open-falcon之应用监控(四)

#前三节基本把open-falcon上面的页面功能讲述了一遍,下面呢就要跟着官方文档了解一下一些常用应用的监控。

#链接地址:https://book.open-falcon.org/zh_0_2/usage/

一、MySQL监控实践

MySQL的数据采集可以通过mymon来做。

1.1 工作原理

       mymon是一个cron,每分钟跑一次,配置文件中配置了数据库连接地址,mymon连到该数据库,采集一些监控指标,比如global status, global variables, slave status等等,然后组装为open-falcon规定的格式的数据,post给本机的falcon-agent。falcon-agent提供了一个http接口,使用方法可以参考数据采集中的例子。比如我们有1000台机器都部署了MySQL实例,可以在这1000台机器上分别部署1000个cron,即:与数据库实例一一对应。

       远程监控mysql实例 如果希望通过hostA上的mymon、采集hostB上的mysql实例指标,你可以这样做:将hostA上mymon的配置文件中的"endpoint设置为hostB的机器名、同时将[mysql]配置项设置为hostB的mysql实例"。查看mysql指标、对mysql指标加策略时,需要找hostB机器名对应的指标。

1.2 跟着github介绍采集一波:

安装mymon:

#cd /opt/

#go get -u github.com/open-falcon/mymon

#cd $GOPATH/src/github.com/open-falcon/mymon

#make  #然后就有个报错

\033[92mRun gofmt on all source files ...\033[0m
gofmt -l -s -w ...
==> Checking that build is using go version >= 1.10...
requires go 1.10 to build; found 1.9.4.
make: *** [build] 错误 1

#上面的报错是说需要go 1.10版本而你的版本只有1.9.4

# vim Makefile   #稍微修改下Makefile文件

GO_VERSION_MIN=1.9.4
#GO_VERSION_MIN=1.10

#make  #再次make编译  #下面为编译成功的信息

\033[92mRun gofmt on all source files ...\033[0m
gofmt -l -s -w ...
==> Checking that build is using go version >= 1.9.4...
go build -o mymon

#cp -rf /opt/src/github.com/open-falcon/mymon /usr/local/open-falcon/

# vim /usr/local/open-falcon/mymon/etc/myMon.cfg 

[default]
# 工作目录
basedir = .
# 日志目录,默认日志文件为myMon.log,旧版本有log_file项,如果同时设置了,会优先采用log_file
log_dir = .
# 配置忽略的metric项
ignore_file = ./falconignore
# 保存快照(process, innodb status)的目录
snapshot_dir = ./snapshot
# 保存快照的时间(日)
snapshot_day = 10
# 日志级别[RFC5424]
# 0 Emergency
# 1 Alert
# 2 Critical
# 3 Error
# 4 Warning
# 5 Notice
# 6 Informational
# 7 Debug
log_level  = 5
# falcon agent连接地址
falcon_client=http://127.0.0.1:1988/v1/push
# 自定义endpoint
endpoint=mysql-test-00    #可以修改这里,不然就是用本地的hostname

[mysql]
# 数据库用户名
user=root
# 您的数据库密码
password=test123   #修改数据库的密码
# 数据库连接地址
host=127.0.0.1
# 数据库端口
port=3306

#crontab  -l

* * * * * cd /usr/local/open-falcon/mymon && ./mymon -c etc/myMon.cfg

查看一下测试结果:

image.png

Metric:

      采集的metric信息,请参考./metrics.txt。该文件仅供参考,实际采集信息会根据MySQL版本、配置的不同而变化。如:/usr/local/open-falcon/mymon/metrics.txt 

同步延迟:

      关于同步延迟检测的metric有两个: Seconds_Behind_Master、Heartbeats_Behind_Master。Seconds_Behind_Master是MySQLSHOW SLAVE STATUS输出的状态变量。由于低版本的MySQL还不支持HEARTBEAT_EVENT,在低版本的MySQL中该状态可能会由于IO线程假死导致测量不准确,因此mymon增加了Heartbeats_Behind_Master。它依赖于pt-heartbeat,统计基于pt-heartbeat生成的mysql.heartbeat表中的ts字段值与从库当前时间差。如果未配置pt-heartbeat,则该项上报-1值。

      关于pt-heartbeat的配置使用,链接如下: https://www.percona.com/doc/percona-toolkit/LATEST/pt-heartbeat.html。

博文来自:www.51niux.com

二、Redis监控

#Redis的数据采集可以通过采集脚本redis-monitor (https://github.com/iambocai/falcon-monit-scripts/tree/master/redis)或者 redismon来做。

2.1 工作原理

        redis-monitor是一个cron,每分钟跑一次采集脚本redis-monitor.py,其中配置了redis服务的地址,redis-monitor连到redis实例,采集一些监控指标,比如connected_clients、used_memory等等,然后组装为open-falcon规定的格式的数据,post给本机的falcon-agent。falcon-agent提供了一个http接口,使用方法可以参考数据采集中的例子。比如,我们有1000台机器都部署了Redis实例,可以在这1000台机器上分别部署1000个cron,即:与Redis实例一一对应。

2.2  redismon部署

#暂不支持哨兵模式。

# cd /opt/

# wget https://github.com/ZhuoRoger/redismon/archive/master.zip

# unzip master.zip 

# cp -rf redismon-master /usr/local/open-falcon/redismon

# vim /usr/local/open-falcon/redismon/conf/redismon.conf  # 配置当前服务器的Redis多实例信息每行记录一个实例: 集群名,密码,端口

items:
- {cluster_name: cluster_1, password: '', port: 6379}

#yum install python-yaml -y  #不安装的话执行脚本就要报ImportError: No module named yaml错误了

# pip uninstall pyyaml

#pip install requests

#pip install redis

# crontab  -l   #再来个定时任务

* * * * * cd /usr/local/open-falcon/redismon/bin/ && python redis_monitor.py > /dev/null

#这个脚本里面默认endpoint取的本地主机名,因为配置文件里面有句:"endpoint":self.addr,你可以改掉这里

#查看日志文件/path/to/redismon/log/redismon.log, 如无异常信息,表示采集正常;几分钟后,可从open-falcon的dashboard中查看redis metric

查看一下:

image.png

#可以看到好多redis做tags标签然后记录是属于哪个端口哪个集群的一些指标。

redis的采集指标:

#redis采集的指标请参考这里:https://github.com/ZhuoRoger/redismon


CountersTypeNotes
aof_current_rewrite_time_secGAUGE当前AOF重写持续的耗时
aof_enabledGAUGEappenonly是否开启,appendonly为yes则为1,no则为0
aof_last_bgrewrite_statusGAUGE最近一次AOF重写操作是否成功
aof_last_rewrite_time_secGAUGE最近一次AOF重写操作耗时
aof_last_write_statusGAUGE最近一次AOF写入操作是否成功
aof_rewrite_in_progressGAUGEAOF重写是否正在进行
aof_rewrite_scheduledGAUGEAOF重写是否被RDB save操作阻塞等待
blocked_clientsGAUGE正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
client_biggest_input_bufGAUGE当前客户端连接中,最大输入缓存
client_longest_output_listGAUGE当前客户端连接中,最长的输出列表
cluster_enabledGAUGE是否启用Redis集群模式,cluster_enabled
cluster_known_nodesGAUGE集群中节点的个数
cluster_sizeGAUGE集群的大小,即集群的分区数个数
cluster_slots_assignedGAUGE集群中已被指派slot个数,正常是16385个
cluster_slots_failGAUGE集群中已下线(客观失效)的slot个数
cluster_slots_okGAUGE集群中正常slots个数
cluster_slots_pfailGAUGE集群中疑似下线(主观失效)的slot个数
cluster_stateGAUGE集群的状态是否正常
cmdstat_authCOUNTERauth命令每秒执行次数
cmdstat_configCOUNTERconfig命令每秒执行次数
cmdstat_getCOUNTERget命令每秒执行次数
cmdstat_infoCOUNTERinfo命令每秒执行次数
cmdstat_pingCOUNTERping命令每秒执行次数
cmdstat_setCOUNTERset命令每秒执行次数
cmdstat_slowlogCOUNTERslowlog命令每秒执行次数
connected_clientsGAUGE当前已连接的客户端个数
connected_clients_pctGAUGE已使用的连接数百分比,connected_clients/maxclients
connected_slavesGAUGE已连接的Redis从库个数
evicted_keysCOUNTER因内存used_memory达到maxmemory后,每秒被驱逐的key个数
expired_keysCOUNTER因键过期后,被惰性和主动删除清理key的每秒个数
hzGAUGEserverCron执行的频率,默认10,表示100ms执行一次,建议不要大于120
instantaneous_input_kbpsGAUGE瞬间的Redis输入网络流量(kbps)
instantaneous_ops_per_secGAUGE瞬间的Redis操作QPS
instantaneous_output_kbpsGAUGE瞬间的Redis输出网络流量(kbps)
keysGAUGE当前Redis实例的key总数
keyspace_hit_ratioGAUGE查找键的命中率(每个周期60sec精确计算)
keyspace_hitsCOUNTER查找键命中的次数
keyspace_missesCOUNTER查找键未命中的次数
latest_fork_usecGAUGE最近一次fork操作的耗时的微秒数(BGREWRITEAOF,BGSAVE,SYNC等都会触发fork),当并发场景fork耗时过长对服务影响较大
loadingGAUGE标志位,是否在载入数据文件
master_repl_offsetGAUGEmaster复制的偏移量,除了写入aof外,Redis定期为自动增加
mem_fragmentation_ratioGAUGE内存碎片率,used_memory_rss/used_memory
pubsub_channelsGAUGE目前被订阅的频道数量
pubsub_patternsGAUGE目前被订阅的模式数量
rdb_bgsave_in_progressGAUGE标志位,记录当前是否在创建RDB快照
rdb_current_bgsave_time_secGAUGE当前bgsave执行耗时秒数
rdb_last_bgsave_statusGAUGE标志位,记录最近一次bgsave操作是否创建成功
rdb_last_bgsave_time_secGAUGE最近一次bgsave操作耗时秒数
rdb_last_save_timeGAUGE最近一次创建RDB快照文件的Unix时间戳
rdb_changes_since_last_saveGAUGE从最近一次dump快照后,未被dump的变更次数(和save里变更计数器类似)
redis_aliveGAUGE当前Redis是否存活,ping监控socket_time默认500ms
rejected_connectionsCOUNTER因连接数达到maxclients上限后,被拒绝的连接个数
repl_backlog_activeGAUGE标志位,master是否开启了repl_backlog,有效地psync(2.8+)
repl_backlog_first_byte_offsetGAUGErepl_backlog中首字节的复制偏移位
repl_backlog_histlenGAUGErepl_backlog当前使用的字节数
repl_backlog_sizeGAUGErepl_backlog的长度(repl-backlog-size),网络环境不稳定的,建议调整大些
roleGAUGE当前实例的角色:master 1, slave 0
master_link_statusGAUGE标志位,从库复制是否正常,正常1,断开0
master_link_down_since_secondsGAUGE从库断开复制的秒数
slave_read_onlyGAUGE从库是否设置为只读状态,避免写入
slowlog_lenCOUNTERslowlog的个数(因未转存slowlog实例,每次采集不会slowlog reset,所以当slowlog占满后,此值无意义)
sync_fullGAUGE累计Master full sync的次数;如果值比较大,说明常常出现全量复制,就得分析原因,或调整repl-backlog-size
sync_partial_errGAUGE累计Master pysync 出错失败的次数
sync_partial_okGAUGE累计Master psync成功的次数
total_commands_processedCOUNTER每秒执行的命令数,比较准确的QPS
total_connections_receivedCOUNTER每秒新创建的客户端连接数
total_net_input_bytesCOUNTERRedis每秒网络输入的字节数
total_net_output_bytesCOUNTERRedis每秒网络输出的字节数
uptime_in_daysGAUGERedis运行时长天数
uptime_in_secondsGAUGERedis运行时长的秒数
used_cpu_sysCOUNTERRedis进程消耗的sys cpu
used_cpu_userCOUNTERRedis进程消耗的user cpu
used_memoryGAUGE由Redis分配的内存的总量,字节数
used_memory_luaGAUGElua引擎使用的内存总量,字节数;有使用lua脚本的注意监控
used_memory_pctGAUGE最大内存已使用百分比,used_memory/maxmemory; 存储场景无淘汰key注意监控.(如果maxmemory=0表示未设置限制,pct永远为0)
used_memory_peakGAUGERedis使用内存的峰值,字节数
used_memory_rssGAUGERedis进程从OS角度分配的物理内存,如key被删除后,malloc不一定把内存归还给OS,但可以Redis进程复用

建议设置监控告警项:


说明:系统级监控项由falcon agent提供;监控触发条件根据场景自行调整

告警项触发条件备注
load.1minall(#3)>10Redis服务器过载,处理能力下降
cpu.idleall(#3)<10CPU idle过低,处理能力下降
df.bytes.free.percentall(#3)<20磁盘可用空间百分比低于20%,影响从库RDB和AOF持久化
mem.memfree.percentall(#3)<15内存剩余低于15%,Redis有OOM killer和使用swap的风险
mem.swapfree.percentall(#3)<80使用20% swap,Redis性能下降或OOM风险
net.if.out.bytesall(#3)>94371840网络出口流量超90MB,影响Redis响应
net.if.in.bytesall(#3)>94371840网络入口流量超90MB,影响Redis响应
disk.io.utilall(#3)>90磁盘IO可能存负载,影响从库持久化和阻塞写
redis.aliveall(#2)=0Redis实例存活有问题,可能不可用
used_memoryall(#2)>32212254720单实例使用30G,建议拆分扩容;对fork卡停,full_sync时长都有明显性能影响
used_memory_pctall(#3)>85(存储场景)使用内存达85%,存储场景会写入失败
mem_fragmentation_ratioall(#3)>2内存碎片过高(如果实例比较小,这个指标可能比较大,不实用)
connected_clientsall(#3)>5000客户端连接数超5000
connected_clients_pctall(#3)>85客户端连接数占最大连接数超85%
rejected_connectionsall(#1)>0连接数达到maxclients后,创建新连接失败
total_connections_received每秒新创建连接数超5000,对Redis性能有明显影响,常见于PHP短连接场景
master_link_status>all(#1)=0主从同步断开;会全量同步,HA/备份/读写分离数据最终一致性受影响
slave_read_onlyall(#1)=0从库非只读状态
repl_backlog_activeall(#1)=0repl_backlog关闭,对网络闪断场景不能psync
keysall(#1)>50000000keyspace key总数5千万,建议拆分扩容
instantaneous_ops_per_secall(#2)>30000整体QPS 30000,建议拆分扩容
slowlog_lenall(#1)>101分钟中内,出现慢查询个数(一般Redis命令响应大于1ms,记录为slowlog)
latest_fork_usecall(#1)>1000000最近一次fork耗时超1秒(其间Redis不能响应任何请求)
keyspace_hit_ratioall(#2)<80命中率低于80%
cluster_stateall(#1)=0Redis集群处理于FAIL状态,不能提供读写
cluster_slots_assignedall(#1)<16384keyspace的所有数据槽未被全部指派,集群处理于FAIL状态
cluster_slots_failall(#1)>0集群中有槽处于失败,集群处理于FAIL状态
博文来自:www.51niux.com

三、MongoDB监控:

#MongoDB的部署方式跟Redis差不多这里就不详细记录了,就保存两个链接了。

官网介绍:https://book.open-falcon.org/zh_0_2/usage/MongoDB.html

github地址:https://github.com/ZhuoRoger/mongomon

四、Memcache监控:

4.1 先安装一个memcache服务

#yum install libevent libevent-devel -y

#wget memcached.org/files/memcached-1.5.12.tar.gz

#tar zxf memcached-1.5.12.tar.gz 

#cd memcached-1.5.12

#./configure --prefix=/usr/local/memcached

#make && make install

#/usr/local/memcached/bin/memcached -p 11211 -u work -m 64 &  #启动一下memcached要加-p指定端口哦

#脚本memcached-monitor.py通过ps -ef |grep memcached|grep -v grep |sed -n 's/.* *-p *\([0-9]\{1,5\}\).*/\1/p来自动发现Memcached端口的。如果Memcached启动时 没有通过 -p参数来指定端口,端口的自动发现将失败,这时需要手动修改脚本、指定端口。

4.2 安装open-falcon memcached监控脚本

# cd /home/work/scripts/

# git clone https://github.com/iambocai/falcon-monit-scripts

# vim falcon-monit-scripts/memcached/memcached-monitor.py  #找到83行修改一下IP,因为ip是个变量,默认是取得hostname(ip = socket.gethostname()),所以这里要修改成一下真正的监听IP

        try:
            # ATT: if your instance listened on 127.0.0.1, change "ip" to "127.0.0.1" in follow line
            conn = MemcachedStats("127.0.0.1", port)   #就是这里把ip改成你所需要的IP地址
            stats = conn.stats()
            conn.close()
        except:
            continue

# crontab  -l   #再来个定时任务

* * * * * cd /home/work/scripts/falcon-monit-scripts/memcached && python memcached-monitor.py > /dev/null

#然后你就默默的等,等了好久可能我擦没数据,虽然这个python脚本每次都是提示success,但是其实可能是传了个空列表上去了。

4.3 解决memcached监控脚本不采数问题

# vim falcon-monit-scripts/memcached/memcached-monitor.py   #还有一个地方要改,它这个取memcache端口的shell命令有点问题导致其实际没有取到想要的端口号而且一个错误的列表

    #insts_list = [ os.path.basename(i) for i in commands.getoutput(''' ps -ef |grep memcached|grep -v grep |sed -n 's/.* *-p *\([0-9]\{1,5\}\).*/\1/p' ''' ).split('\n') ]
    insts_list = [ os.path.basename(i) for i in commands.getoutput(''' ps -ef |grep memcached|grep -v grep|grep -o "\-p [0-9]\+"|grep -o "[0-9]\+" ''' ).split('\n') ]

#把他原来的命令注释掉改成新的shell命令就可以了。

image.png

所有memcached stats字段(pid,time除外)均汇报,除此之外,增加了以下原值:

keytagtypenote
memcached.get_hit_ratioport(实例端口号)GAUGEget命令总体命中率
memcached.incr_hit_ratioport(实例端口号)GAUGEincr命令总体命中率
memcached.decr_hit_ratioport(实例端口号)GAUGEdecr命令总体命中率
memcached.delete_hit_ratioport(实例端口号)GAUGEdelete命令总体命中率
memcached.usageport(实例端口号)GAUGE分配内存使用率,等于byte/limitmaxbyte

五、RabbitMQ监控

5.1 RabbitMQ安装

安装依赖文件:

# yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC unixODBC-devel httpd python-simplejson

安装erlang语言环境:

#wget http://erlang.org/download/otp_src_19.2.tar.gz

# tar zxf otp_src_19.2.tar.gz 

# cd  otp_src_19.2

# ./configure --prefix=/usr/local/erlang

# make && make install

# vim /etc/profile

#set erlang environment
export ERL_HOME=/usr/local/erlang
export PATH=$ERL_HOME/bin:$PATH

# source /etc/profile

# erl   #如果进入erlang的shell则证明安装成功,退出即可。如下面的效果:

Erlang/OTP 19 [erts-8.2] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V8.2  (abort with ^G)
1>

下载安装RabbitMQ :

# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-generic-unix-3.6.15.tar.xz

# xz -d rabbitmq-server-generic-unix-3.6.15.tar.xz

# tar -xvf rabbitmq-server-generic-unix-3.6.15.tar

# mv rabbitmq_server-3.6.15 /usr/local/

# ln -s /usr/local/rabbitmq-server-3.6.15 /usr/local/rabbitmq

# vim /etc/profile

#set rabbitmq environment
export PATH=$PATH:/usr/local/rabbitmq/sbin

# source /etc/profile

# /usr/local/rabbitmq/sbin/rabbitmq-server -detached   #启动rabbitmq,-detached代表后台守护进程方式启动。  #rabbitmqctl stop 关闭服务

# rabbitmqctl status   #查看状态  # rabbitmqctl list_users  列出角色

博文来自:www.51niux.com

启动Web管理插件:

# rabbitmq-plugins enable rabbitmq_management   #启动插件

# netstat  -lntup|egrep "epmd|beam"

tcp        0      0 0.0.0.0:25672           0.0.0.0:*               LISTEN      68179/beam          
tcp        0      0 0.0.0.0:4369            0.0.0.0:*               LISTEN      68136/epmd          
tcp        0      0 0.0.0.0:15672           0.0.0.0:*               LISTEN      68179/beam          
tcp6       0      0 :::5672                 :::*                    LISTEN      68179/beam          
tcp6       0      0 :::4369                 :::*                    LISTEN      68136/epmd

#4369端口是erlang发现端口,5672是client端通信口,15672是管理界面UI端口,25672是server间内部通信口。

配置访问账号密码和权限并删除匿名用户:

默认网页是不允许访问的,需要增加一个用户修改一下权限,命令如下:

# rabbitmqctl add_user admin admin123   #添加admin用户和设置密码为admin123

# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"    #添加权限

# rabbitmqctl set_user_tags admin administrator  #修改用户角色

#现在在浏览器输入服务器IP:15672就可以看到RabbitMQ的WEB管理界面了。

image.png

image.png

image.png

概念:

Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

5.2 RMQ监控

RMQ监控脚本的部署:

#下载地址:https://github.com/iambocai/falcon-monit-scripts/tree/master/rabbitmq

#还是falcon-monit-scripts这个下面的脚本

# vim /home/work/scripts/falcon-monit-scripts/rabbitmq/rabbitmq-monitor.py

#request = urllib2.Request("http://%s:15672/api/queues" %ip)
request = urllib2.Request("http://%s:15672/api/queues" %"127.0.0.1")
#base64string = base64.b64encode('guest:guest')
base64string = base64.b64encode('admin:admin123')

# python /home/work/scripts/falcon-monit-scripts/rabbitmq/rabbitmq-monitor.py  #可以先执行以下

[]
success

#默认就是啥玩意没有,因为一个queues都没有所以data = json.loads(result.read()) 里面的data就是个空的。

#然后你可以手工或者通过web管理创建一个queues。

#crontab -l  #添加一条定时任务

* * * * * cd /home/work/scripts/falcon-monit-scripts/rabbitmq && python rabbitmq-monitor.py  > /dev/null

汇报字段:

keytagtypenote
rabbitmq.messages_readyname(Queue名字)GAUGE队列中处于等待被消费状态消息数
rabbitmq.messages_unacknowledgedname(Queue名字)GAUGE队列中处于消费中状态的消息数
rabbitmq.messages_totalname(Queue名字)GAUGE队列中所有未完成消费的消息数,等于messages_ready+messages_unacknowledged
rabbitmq.ack_ratename(Queue名字)GAUGE消费者ack的速率
rabbitmq.deliver_ratename(Queue名字)GAUGEdeliver的速率
rabbitmq.deliver_get_ratename(Queue名字)GAUGEdeliver_get的速率
rabbitmq.publish_ratename(Queue名字)GAUGEpublish的速率

falcon的界面查看:

image.png

#上图中的falcon_test就是创建的队列名称。

作者:忙碌的柴少 分类:open-falcon 浏览:2279 评论:0
留言列表
发表评论
来宾的头像