2019-02-22

栏目: 服务器 · Apache · 发布时间: 5年前

内容简介:opne-falcon是小米公司推出的一款开源的企业级监控产品,下面对它做些简单的介绍。[图片上传失败...(image-11e30b-1550819626391)]每台服务器,都有安装falcon-agent,falcon-agent是一个golang开发的daemon程序,用于自发现的采集单机的各种数据和指标,这些指标包括不限于以下几个方面,共计200多项指标。

1 Open-falcon简介

opne-falcon是小米公司推出的一款开源的企业级监控产品,下面对它做些简单的介绍。

1.1 工程结构

[图片上传失败...(image-11e30b-1550819626391)]

每台服务器,都有安装falcon-agent,falcon-agent是一个golang开发的daemon程序,用于自发现的采集单机的各种数据和指标,这些指标包括不限于以下几个方面,共计200多项指标。

  • CPU相关
  • 磁盘相关
  • IO
  • Load
  • 内存相关
  • 网络相关
  • 端口存活、进程存活
  • ntp offset(插件)
  • 某个进程资源消耗(插件)
  • netstat、ss 等相关统计项采集
  • 机器内核配置参数

只要安装了falcon-agent的机器,就会自动开始采集各项指标,主动上报,不需要用户在server做任何配置(这和zabbix有很大的不同),这样做的好处,就是用户维护方便,覆盖率高。当然这样做也会server端造成较大的压力,不过open-falcon的服务端组件单机性能足够高,同时都可以水平扩展,所以自动多采集足够多的数据,反而是一件好事情,对于SRE和DEV来讲,事后追查问题,不再是难题。

另外,falcon-agent提供了一个proxy-gateway,用户可以方便的通过http接口,push数据到本机的gateway,gateway会帮忙高效率的转发到server端。

falcon-agent,可以在我们的github上找到 : https://github.com/open-falcon/falcon-plus

1.2 组件介绍

graph

graph是存储绘图数据的组件。graph组件 接收transfer组件推送上来的监控数据,同时处理api组件的查询请求、返回绘图数据。

hbs(Heartbeat Server)

心跳服务器,公司所有agent都会连到HBS,每分钟发一次心跳请求。

judge

Judge用于告警判断,agent将数据push给Transfer,Transfer不但会转发给Graph组件来绘图,还会转发给Judge用于判断是否触发告警。

transfer

transfer是数据转发服务。它接收agent上报的数据,然后按照哈希规则进行数据分片、并将分片后的数据分别push给graph&judge等组件。

nodata

nodata用于检测监控数据的上报异常。nodata和实时报警judge模块协同工作,过程为: 配置了nodata的采集项超时未上报数据,nodata生成一条默认的模拟数据;用户配置相应的报警策略,收到mock数据就产生报警。采集项上报异常检测,作为judge模块的一个必要补充,能够使judge的实时报警功能更加可靠、完善。

aggregator

集群聚合模块。聚合某集群下的所有机器的某个指标的值,提供一种集群视角的监控体验。

agent

agent用于采集机器负载监控指标,比如cpu.idle、load.1min、disk.io.util等等,每隔60秒push给Transfer。agent与Transfer建立了长连接,数据发送速度比较快,agent提供了一个http接口 /v1/push 用于接收用户手工push的一些数据,然后通过长连接迅速转发给Transfer。

api

api组件,提供统一的restAPI操作接口。比如:api组件接收查询请求,根据一致性哈希算法去相应的graph实例查询不同metric的数据,然后汇总拿到的数据,最后统一返回给用户。

alarm

alarm模块是处理报警event的,judge产生的报警event写入redis,alarm从 redis 读取处理,并进行不同渠道的发送。

task

task是监控系统一个必要的辅助模块。定时任务,实现了如下几个功能:

  • index更新。包括图表索引的全量更新 和 垃圾索引清理。
  • falcon服务组件的自身状态数据采集。定时任务了采集了transfer、graph、task这三个服务的内部状态数据。
  • falcon自检控任务。

1.3 特性

  • 强大灵活的数据采集:自动发现,支持falcon-agent、snmp、支持用户主动push、用户自定义插件支持、opentsdb data model like(timestamp、endpoint、metric、key-value tags)
  • 水平扩展能力:支持每个周期上亿次的数据采集、告警判定、历史数据存储和查询
  • 高效率的告警策略管理:高效的portal、支持策略模板、模板继承和覆盖、多种告警方式、支持callback调用
  • 人性化的告警设置:最大告警次数、告警级别、告警恢复通知、告警暂停、不同时段不同阈值、支持维护周期
  • 高效率的graph组件:单机支撑200万metric的上报、归档、存储(周期为1分钟)
  • 高效的历史数据query组件:采用rrdtool的数据归档策略,秒级返回上百个metric一年的历史数据
  • dashboard:多维度的数据展示,用户自定义Screen
  • 高可用:整个系统无核心单点,易运维,易部署,可水平扩展
  • 开发语言: 整个系统的后端,全部golang编写,portal和dashboard使用 python 编写。

2 环境搭建

open-falcon需要运行在 linux 上,目前没有发现基于windows的版本。

下面主要的内容是本地环境搭建,vbox+Centos7。

open-falcon分为前端和后端,后端依赖软件的安装Centos与Ubuntu差异不大,这里就只说centos; 前端依赖的软件安装稍有不同,下面会提供centos与ubuntu两种命令。

2.1 环境准备

本地基础环境

  • VirtualBox 5.1.30 r118389;
  • CentOS-7-x86_64-Minimal-1804;
  • Git >= 1.7.5
  • GO >= 1.6

Centos7

虚拟机的安装这里就不再赘述,具体的网络配置可以参考: https://www.linuxidc.com/Linux/2017-01/139345.htm

设置代理及DNS配置

添加代理并生效

vi /etc/profile

# 粘贴下列代码
export http_proxy="http://xxx.xx.xx.xx:8080"
export https_proxy="https://xxx.xx.xx.xx:8080"
export ftp_proxy="ftp://xxx.xx.xx.xx:8080"
export no_proxy="xxx,xxx,xxx"

#生效配置文件
source /etc/profile

添加DNS配置并生效

#连接外网的网卡
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

#添加DNS配置
DNS1=xxx.xx.xx.xx
DNS2=xxx.xx.xx.xx

#重启网络,生效配置
service network restart

关闭防火墙

#临时关闭
systemctl stop firewalld
#禁止开机启动
systemctl disable firewalld

到这里虚拟机的安装及配置应该就完成了,可以测试一下,网络以及主机命令交互。默认的yum源速度还可以,这里就不再说如何改yum源了。

2.2 依赖软件

2.2.1 git

安装

yum install -y git

2.2.2 redis

安装

yum install -y redis
#检查服务是否启动
ps -ef|grep redis
#若未启动,启动服务
systemctl start redis.service
#root用户直接运行即可
service redis start

2.2.3 mysql

安装

yum install -y mysql-server

这里完成安装后建议使用默认密码,原因: 方便

开启远程访问

mysql默认是关闭远程访问的,这里先开启。

#登录mysql,执行语句
grant all privileges on *.* to 'root' @'%' identified by '你的root用户密码';
#刷新权限
flush privileges;

2.2.4 golang

安装

yum install -y golang
#查看 GO 环境配置
go env

GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/jay/go" #默认是在当前用户目录下go文件下
GORACE=""
GOROOT="/usr/lib/golang" #GO安装目录
GOTOOLDIR="/usr/lib/golang/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build101066216=/tmp/go-build -gno-record-gcc-switches"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"

2.2.5 python&其他软件安装(前端系统依赖)

执行以下命令,完成软件安装

centos:

yum install -y python-virtualenv
yum install -y python-devel
yum install -y openldap-devel
yum install -y mysql-devel
yum groupinstall "Development tools"

ubuntu:

apt-get install -y python-virtualenv
apt-get install -y slapd ldap-utils
apt-get install -y libmysqld-dev
apt-get install -y build-essential
apt-get install -y python-dev libldap2-dev libsasl2-dev libssl-dev

2.3 数据准备

2.3.1 源码包

clone官方github上的源码到本地,务必依以下结构创建目录。

mkdir -p $GOPATH/src/github.com/open-falcon
cd $GOPATH/src/github.com/open-falcon
git clone https://github.com/open-falcon/falcon-plus.git

若无法clone,可以下载zip包,解压后上传指定目录。当然了,如果你不想自己编译,官方也有编译好的二进制包,后面会说。

2.3.2 数据库

这里官方已提供完整的 SQL 语句,只需按顺序执行就可以,方式不限; 语句地址: https://github.com/open-falcon/falcon-plus/tree/master/scripts/mysql/db_schema 执行顺序:

1_uic-db-schema.sql
 2_portal-db-schema.sql
 3_dashboard-db-schema.sql
 4_graph-db-schema.sql
 5_alarms-db-schema.sql

2.3.3 编译源码(可省略)

cd $GOPATH/src/github.com/open-falcon/falcon-plus/

# make all modules
make all

# make specified module
make agent

# pack all modules
make pack

执行 make pack 编译成功后,就可得到 open-falcon-vx.x.x.tar.gz

官方也提供了编译好的 二进制 包,下载即可。

3 启动

3.1 后端

3.1.2 创建目录并解压二进制包

#进入当前用户目录
cd ~

#编辑.bash_profile,在当前用户添加工作目录
vi .bash_profile

export FALCON_HOME=$HOME/work
export WORKSPACE=$FALCON_HOME/open-falcon

#创建工作目录
mkdir -p $WORKSPACE

#解压之前编译(下载)好的二进制包到工作目录
tar -xzvf open-falcon-vx.x.x.tar.gz -C $WORKSPACE

3.1.3 启动后端

启动全部模块

cd $WORKSPACE
./open-falcon start

检查启动状态

./open-falcon check

#成功状态示例
        falcon-graph         UP           14577 
          falcon-hbs         UP           14586 
        falcon-judge         UP           14594 
     falcon-transfer         UP           14600 
       falcon-nodata         UP           14606 
   falcon-aggregator         UP           14613 
        falcon-agent         UP           14621 
      falcon-gateway         UP           14628 
          falcon-api         UP           14634 
        falcon-alarm         UP           14648

3.2 前端

下载前端源码至工作目录$WORKSPACE,若网络不给力,只有手动上传了。

cd $WORKSPACE
git clone https://github.com/open-falcon/dashboard.git

进入dashboard目录,启动前端系统。

cd dashboard
virtualenv ./env
./env/bin/pip install -r pip_requirements.txt -i https://pypi.douban.com/simple

#开发模式启动前端系统
./env/bin/python wsgi.py
#生产环境启动系统(这里可能出现权限问题,建议sudo执行)
bash control start
#生产环境停止系统
bash control stop
#生产环境查看日志
bash control tail

启动后,主机访问虚拟机ip:8081即可。

4 简单入门

4.1 查看监控数据

我们说agent只要部署到机器上,并且配置好了heartbeat和transfer就自动采集数据了,我们就可以去dashboard上面搜索监控数据查看了。dashboard是个web项目,浏览器访问之。左侧输入endpoint搜索,endpoint是什么?应该用什么搜索?对于agent采集的数据,endpoint都是机器名,去目标机器上执行 hostname ,看到的输出就是endpoint,拿着hostname去搜索。

搜索到了吧?嗯,选中前面的复选框,点击“查看counter列表”,可以列出隶属于这个endpoint的counter,counter是什么? counter=${metric}/sorted(${tags})

假如我们要查看cpu.busy,在counter搜索框中输入cpu并回车。看到cpu.busy了吧,点击,会看到一个新页面,图表中就是这个机器的cpu.busy的近一小时数据了,想看更长时间的?右上角有个小三角,展开菜单,可以选择更长的时间跨度

[图片上传失败...(image-189391-1550819626389)]

[图片上传失败...(image-4a374c-1550819626389)]

4.2 如何配置报警策略

上节我们已经了解到如何查看监控数据了,如果数据达到阈值,比如cpu.busy太大的时候,我们应该如何配置告警呢?

4.2.1 配置报警接收人

falcon的报警接收人不是一个具体的手机号,也不是一个具体的邮箱,因为手机号、邮箱都是容易发生变化的,如果变化了去修改所有相关配置那就太麻烦了。我们把用户的联系信息维护在一个叫 帐户/Profile 里,以后如果要修改手机号、邮箱,只要修改自己的帐户信息即可。报警接收人也不是单个的人,而是一个组(Teams),比如falcon这个系统的任何组件出问题了,都应该发报警给falcon的运维和开发人员,发给falcon这个团队,这样一来,新员工入职只要加入falcon这个Team即可;员工离职,只要从falcon这个Team删掉即可。

浏览器访问UIC,如果启用了LDAP,那就用LDAP账号登陆,如果没有启用,那就注册一个或者找管理员帮忙开通。创建一个Team,名称姑且叫falcon,把自己加进去,待会用来做测试。

首先修改帐户信息,保证邮箱和手机号正确 [图片上传失败...(image-29e354-1550819626389)]

然后添加报警组,添加成员 [图片上传失败...(image-41a467-1550819626389)]

[图片上传失败...(image-685ce6-1550819626389)]

4.2.2 创建HostGroup

比如我们要对falcon-judge这个组件做端口监控,那首先创建一个HostGroup,把所有部署了falcon-judge这个模块的机器都塞进去,以后要扩容或下线机器的时候直接从这个HostGroup增删机器即可,报警策略会自动生效、失效。咱们为这个HostGroup取名为:sa.dev.falcon.judge,这个名称有讲究,sa是我们部门,dev是我们组,falcon是项目名,judge是组件名,传达出了很多信息,这样命名比较容易管理,推荐大家这么做。

[图片上传失败...(image-e02370-1550819626389)]

在往组里加机器的时候如果报错,需要检查portal的数据库中host表,看里边是否有相关机器。那host表中的机器从哪里来呢?agent有个heartbeat(hbs)的配置,agent每分钟会发心跳给hbs,把自己的ip、hostname、agent version等信息告诉hbs,hbs负责写入host表。如果host表中没数据,需要检查这条链路是否通畅。

4.2.3 创建策略模板

portal最上面有个Templates链接,这就是策略模板管理的入口。我们进去之后创建一个模板,名称姑且也叫:sa.dev.falcon.judge.tpl,与HostGroup名称相同,在里边配置一个端口监控,通常进程监控有两种手段,一个是进程本身是否存活,一个是端口是否在监听,此处我们使用端口监控。

[图片上传失败...(image-e484f4-1550819626389)]

[图片上传失败...(image-696e8f-1550819626389)]

右上角那个加号按钮是用于增加策略的,一个模板中可以有多个策略,此处我们只添加了一个。下面可以配置报警接收人,此处填写的是falcon,这是之前在UIC中创建的Team。

4.2.4 将HostGroup与模板绑定

一个模板是可以绑定到多个HostGroup的,现在我们重新回到HostGroups页面,找到sa.dev.falcon.judge这个HostGroup,右侧有几个超链接,点击【templates】进入一个新页面,输入模板名称,绑定一下就行了。

[图片上传失败...(image-ebb279-1550819626389)]

[图片上传失败...(image-6b6b7e-1550819626389)]

4.2.5 以80端口为例完成一次告警

完成上面的步骤,相信已对HostGroup和Templates有了一个简单的了解,如果judge组件宕机,端口不再监听了,就会报警。不过大家不要为了测试报警效果,直接把judge组件给干掉了,因为judge本身就是负责判断报警的,把它干掉了,那就没法判断了...所以这里我们使用常见的80端口来完成一次告警处理。

安装&启动Apache服务(已有请忽略)

yum -y install httpd
#启动apache服务
service httpd start
#查看服务启动状态
service httpd status
#服务启动成功
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2018-06-12 14:16:22 CST; 8s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 1597 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           ├─1597 /usr/sbin/httpd -DFOREGROUND
           ├─1598 /usr/sbin/httpd -DFOREGROUND
           ├─1599 /usr/sbin/httpd -DFOREGROUND
           ├─1600 /usr/sbin/httpd -DFOREGROUND
           ├─1601 /usr/sbin/httpd -DFOREGROUND
           └─1602 /usr/sbin/httpd -DFOREGROUND
...

这里启动以后可以通过ss -ln命令查看80端口是否已被监听。

ss -ln|grep LISTEN
#80端口已监听
tcp    LISTEN     0      128      :::80                   :::*

修改策略模板

为了方便,这里就不修改名字了。

sa.dev.falcon.judge.tpl

查看80端口监听状态

现在回到Dashboard,查看 net.port.listen/port=80 是否已在列表中。 [图片上传失败...(image-5cd483-1550819626389)]

因为agent对于端口的监控只有两个值 1:监听中 0:未监听,所以表中可以看到一个关闭到启动的过程。 [图片上传失败...(image-184ef9-1550819626389)]

关闭Apache服务,触发告警

关闭服务器中的Apache服务

service httpd stop

现在继续80端口的监控信息,agent大概60s上报一次状态。 [图片上传失败...(image-fbeae5-1550819626389)]

打开Alarm-Dashboard,这里可以看到已触发的告警列表。 [图片上传失败...(image-f12db6-1550819626389)]

附录

常用配置文件注释

  1. agent配置,目录$WORKSPACE/agent/config/cfg.json
{
    "debug": true,  # 控制一些debug信息的输出,生产环境通常设置为false
    "hostname": "", # agent采集了数据发给transfer,endpoint就设置为了hostname,默认通过`hostname`获取,如果配置中配置了hostname,就用配置中的
    "ip": "", # agent与hbs心跳的时候会把自己的ip地址发给hbs,agent会自动探测本机ip,如果不想让agent自动探测,可以手工修改该配置
    "plugin": {
        "enabled": false, # 默认不开启插件机制
        "dir": "./plugin",  # 把放置插件脚本的git repo clone到这个目录
        "git": "https://github.com/open-falcon/plugin.git", # 放置插件脚本的git repo地址
        "logs": "./logs" # 插件执行的log,如果插件执行有问题,可以去这个目录看log
    },
    "heartbeat": {
        "enabled": true,  # 此处enabled要设置为true
        "addr": "127.0.0.1:6030", # hbs的地址,端口是hbs的rpc端口
        "interval": 60, # 心跳周期,单位是秒
        "timeout": 1000 # 连接hbs的超时时间,单位是毫秒
    },
    "transfer": {
        "enabled": true, 
        "addrs": [
            "127.0.0.1:18433"
        ],  # transfer的地址,端口是transfer的rpc端口, 可以支持写多个transfer的地址,agent会保证HA
        "interval": 60, # 采集周期,单位是秒,即agent一分钟采集一次数据发给transfer
        "timeout": 1000 # 连接transfer的超时时间,单位是毫秒
    },
    "http": {
        "enabled": true,  # 是否要监听http端口
        "listen": ":1988",
        "backdoor": false
    },
    "collector": {
        "ifacePrefix": ["eth", "em"], # 默认配置只会采集网卡名称前缀是eth、em的网卡流量,配置为空就会采集所有的,lo的也会采集。可以从/proc/net/dev看到各个网卡的流量信息
        "mountPoint": []
    },
    "default_tags": {
    },
    "ignore": {  # 默认采集了200多个metric,可以通过ignore设置为不采集
        "cpu.busy": true,
        "df.bytes.free": true,
        "df.bytes.total": true,
        "df.bytes.used": true,
        "df.bytes.used.percent": true,
        "df.inodes.total": true,
        "df.inodes.free": true,
        "df.inodes.used": true,
        "df.inodes.used.percent": true,
        "mem.memtotal": true,
        "mem.memused": true,
        "mem.memused.percent": true,
        "mem.memfree": true,
        "mem.swaptotal": true,
        "mem.swapused": true,
        "mem.swapfree": true
    }
}
  1. 内置的监控项,源码地址:[图片上传失败...(image-544858-1550819626388)]
package g

import (
  "time"
)

// changelog:
// 3.1.3: code refactor
// 3.1.4: bugfix ignore configuration
// 5.0.0: 支持通过配置控制是否开启/run接口;收集udp流量数据;du某个目录的大小
// 5.1.0: 同步插件的时候不再使用checksum机制
// 5.1.1: 修复往多个transfer发送数据的时候crash的问题
const (
  VERSION          = "5.1.1"
  COLLECT_INTERVAL = time.Second
  URL_CHECK_HEALTH = "url.check.health"
  NET_PORT_LISTEN  = "net.port.listen"   
  DU_BS            = "du.bs"
  PROC_NUM         = "proc.num"
)

这里列出的监控项,如果不在策略模板中配置,默认是不监控的。

可能遇到的问题

1.简单入门中,已经在模板中配置了net.port.listen,但是在counter列表中并未发现。

出现这种情况,可能是当前网卡不在agent的监控范围内,具体的内容可以参考上面的agent配置文件信息。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Essential PHP Security

Essential PHP Security

Chris Shiflett / O'Reilly Media / 2005-10-13 / USD 29.95

Being highly flexible in building dynamic, database-driven web applications makes the PHP programming language one of the most popular web development tools in use today. It also works beautifully wit......一起来看看 《Essential PHP Security》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具