FastD 最佳實踐四: 構建系統可視化監控

原有監控系統

Alt text

整個系統以 Graphite (carbon + whisper) 爲核心, kong 經過 statsd plugin 將服務調用信息發送至 statsd, 而 statsd 則將統計信息經過 Web API 保存至Graphite . 最終在 Grafana 中經過 Graphite Data Source 獲取統計信息並輸出圖表到面板. php

這是網上找到的, 對 Grafana 的描述mysql

Grafana 是一個開源的指標量監測和可視化工具。經常使用於展現基礎設施的時序數據和應用程序運行分析。Grafana 的 dashboard 展現很是炫酷,絕對是運維提高逼格的一大利器。
grafana 的套路基本上跟 kibana 差很少,都是根據查詢條件設置聚合規則,在合適的圖表上進行展現,多個圖表共同組建成一個 dashboard,熟悉 kibana 的用戶應該能夠很是容易上手。另外 grafana 的可視化功能比 kibana 強得多,並且 4 以上版本將集成報警功能。nginx

在以前的監控中, 只能統計到 kong 的調用信息, 整個結構的複雜度高, 而實現的功能卻比較簡單. 搞了這麼大一套鬼東西, 只能查看 kong 的監控. 雖然能經過 Zabbix Plugin 在 Grafana 中查看 zabbix 的監控數據, 可是支持度有限, zabbix 的性能也... 叔惡死 ...git

迭代

開源的時序性數據庫很少, 其中比較出名的有 Graphite 跟 influxdb.github

這是維基百科上對 influxdb 的介紹正則表達式

InfluxDB 是一個由 InfluxData 開發的開源時序型數據庫[note 1]。它由 Go 寫成,着力於高性能地查詢與存儲時序型數據。InfluxDB 被普遍應用於存儲系統的監控數據,IoT 行業的實時數據等場景。redis

經過了解, influxdb 相比 Graphite 有這些優點:sql

  • 提供 telegraf 做爲 agent 採集服務器信息, 並有很是豐富的插件用戶採集 Nginx/Redis/PHPFPM/Elasticsearch 等的狀態信息. 真正提供了採集/存儲/可視化, 屌屌屌.數據庫

  • 可擴展能力 (待實踐)瀏覽器

  • 方便而強大的查詢語言

  • 高效存儲 (待驗證)

而其中, Telegraf 也提供了 Statsd Server 功能, 解決了 Statsd 官方推薦的 influxdb backend 插件只支持 influxdb 0.9 的狀況 .

基於 Influxdb + Telegraf + Grafana 搭建的監控系統

Alt text

在這一版的監控系統中, 咱們將利用 Telegraf 或者直接提交至 Influxdb, 來採集三種信息:

  • 在每臺機器上安裝 Telegraf 用於採集服務器及其安裝的軟件的狀態和統計信息

  • 在網關所處的機器上, 啓用 Telegraf 提供的 Statsd Server 功能, 在 Kong 中, 啓用 Statsd 插件, 將調用日誌提交至 Statsd.

  • 在服務中建立計劃任務定時提交業務數據提交至 Influxdb

Influxdb 提供了一個 Web API 用於管理, 相似於 Mysql, Influxdb 也提供了 命令行的 Client 用於管理.

同時, 須要部署 Grafana 用於可視化面板. 部署 Chronograf 用於管理 Influxdb. Chronograf 提供了 Influxdb 的 Web Admin 功能(在 Influxdb 0.9時代是內置在 Influxdb中的), 以及比較豐富的圖表功能, 可是不能跟 Grafana 比. 所以咱們只把它用來管理 Influxdb.

Telegraf

telegraf 內置了不少 Input Plugin, 用途是什麼呢?
回想到若是是你本身去作一個監控, 可以作到記錄每分鐘 CPU 的空閒率是多少, 要怎麼作?

  • 搞一個數據庫, 用來放數據的

  • 寫一個腳本, 用來獲取 CPU 的相關數據, 加上時間戳, 而後保存到數據庫

  • 建立一個定時任務, 一分鐘運行一次腳本

  • 寫一個簡單的程序, 從數據庫查到數據, 而後根據時間戳, 繪製成圖表.

在你的腳本里面, 你能夠採集任何你採集獲得的數據, 而後懟到數據庫. 而 Input Plugin 就是寫好了的腳本. 只須要在配置文件中開啓, 就能夠採集到對應的數據. telegraf 內置的 Input Plugin 有這些:

  • Nginx

  • MySQL

  • PHP FPM

  • redis

  • Net

  • Netstat

  • MongoDB

  • PostgreSQL

  • Zipkin

  • Zookeeper

  • Elasticsearch

  • Apache

  • Docker

  • ...

oh shit! 我要的都有!

並且, 前面講到, telegraf 內置了一個 Statsd Server (Service Inputs), 從而解決了 Kong 調用監控的問題. 然而這不是所有, telegraf 還提供了:

  • HTTP Listener

  • TCP Listener

  • UDP Listener

  • Webhooks Listener

shit..

這只是 Input, Output 還支持 Graphite, Elasticsearch, Datadog 等等.. shit..

安裝部署

須要準備一臺機器用於安裝數據庫及 UI. 安裝完成後啓動服務, 並在須要監控的每臺機器上安裝 agent. 根據須要配置好 input plugin.

每一個 telegraf 只能提交到一個 database. telegraf 的每一個 input 項都會有一個 hosttag, 它的值默認是機器的 hostname, 能夠在 telegraf 的配置文件中修改.

根據資源編排, 以及 Grafana 的面板模板變量, 將機器與數據庫的關係定位:

  • 以每臺機的 IP 做爲 hostname, 或是以 {分組名}+{組內編號}.

  • 一個分組一個數據庫

  • 根據分組須要開啓 input plugin

  • 固定一個臺機採集全部 mysql, redis 等服務

好了, 那麼開工!

安裝 Influxdb

cd /usr/local/src
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.3.2.x86_64.rpm
yum localinstall influxdb-1.3.2.x86_64.rpm

# 啓動
/etc/init.d/influxdb start

# 檢查 8086 端口
curl -i 'http://127.0.0.1:8086'

安裝 Chronograf

cd /usr/local/src
wget https://dl.influxdata.com/chronograf/releases/chronograf-1.3.6.1.x86_64.rpm
yum localinstall chronograf-1.3.6.1.x86_64.rpm

# 啓動
/etc/init.d/chronograf start

# 檢查 8888 端口
curl -i 'http://127.0.0.1:8888'

若是 8888 已被佔用, 須要指定端口運行

nohup chronograf --port=8889 > /dev/null 2>&1 &

安裝 Grafana

cd /usr/local/src
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.4.3-1.x86_64.rpm
yum localinstall grafana-4.4.3-1.x86_64.rpm

# 啓動
/etc/init.d/grafana-server start

# 檢查 3000 端口
curl -i 'http://127.0.0.1:3000'

安裝 Telegraf

須要在每一臺機器上安裝 Telegraf 做爲 agent, 採集跟上報數據到 Influxdb. 包括安裝 Influxdb 的機器

cd /usr/local/src
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.3.5-1.x86_64.rpm
yum localinstall telegraf-1.3.5-1.x86_64.rpm

安裝完成後, 默認配置已經有采集系統信息的了, 須要增長几項 input

database

若是配置的 database 不存在, 將自動建立.

[[outputs.influxdb]]
  urls = ["http://10.1.0.1:8086"]
  database = "servers_xxxx"
  retention_policy = ""
  write_consistency = "any"
  timeout = "5s"
nginx

須要在 nginx 上啓用 status, 咱們固定使用 1200 端口.

server {
    listen  *:1200 default_server;
    server_name _;
    location /nginx_status
    {
        stub_status on;
        access_log off;
    }
}

而後修改 /etc/telegraf/telegraf.conf

[[inputs.nginx]]
   urls = ["http://127.0.0.1:1200/nginx_status"]
PHP FPM

須要啓用 fpm 的status

pm.status_path = /status

而後修改 /etc/telegraf/telegraf.conf

[[inputs.phpfpm]]
   urls = ["fcgi://127.0.0.1:7006/status"]
Net
[[inputs.net]]
    interfaces = ["eth0", "eth1"]
Netstat
[[inputs.netstat]]

配置完成後, 須要對配置進行測試, 完成後啓動再啓動

telegraf -config /etc/telegraf/telegraf.conf -test

/etc/init.d/telegraf start

配置 Grafana 面板

在 Grafana 中, 須要先配置數據源 (Data Source), 而後建立 Dashboard, 在 Dashboard 中建立 Panel 也就是各類統計組件. 最終完成一個面板的配置.

配置數據源

Alt text
配置數據源須要注意幾個地方:

  • type, 選擇 Influxdb,

  • name, 固定 server_{name}

  • url, Influxdb 的地址

  • access, 固定 proxy. 此外還有 direct. 前者是經由 Grafana 所在機器代理訪問 Influxdb, 後者是在瀏覽器直接訪問 Influxdb.

  • database, 目標機器的 Telegraf 作配置的 database

配置完成後, 點及 Add 兩次, 若是顯示 test success 即爲成功.

建立面板

Alt text
Alt text
Alt text

能夠選擇切換到手動編輯 SQL 模式.
Alt text

而後保存, 這樣就建立好了第一個面板了.

查詢語言

具體須要查看官方文檔

Influxdb 使用的查詢語言是一種類 SQL 的查詢語言

InfluxDB’s SQL-like query language for interacting with data in InfluxDB.

Influxdb 是一種時序型的數據庫, 跟關係型數據庫(以 mysql 爲例)的區別, 我理解就是數據庫自動維護着 created_at

結構的異同

  • 都有 database, 而且都須要建立才能使用

  • mysql 有 table, Influxdb 有 measurement, 二者的角色差很少

  • measurement 下有 tag, tag 下才是 field.

  • measurement + tag = serie

查詢語句的異同

  • CRUD 中 Influxdb 只有 C R D

  • Influxdb 對正則表達式的支持. 例如 SELECT "value" FROM /kong_sms_request_status_*/

  • tag 跟 field 均可以用於 where 查詢

  • Influxdb 有更豐富的聚合查詢

固然, 兩種類型的數據庫的主要用途不一樣, 對比只是用於方便上手, 並不是對比二者優劣.

示例
> create database "demo"

> show databases
name: databases
name
----
_internal
demo

> use "demo"
Using database demo

> insert hello,tag_alpha=2 value=3
> insert hello,tag_alpha=2 value=3
> insert hello,tag_alpha=4 value=5
> insert hello,tag_alpha=4 value=6
> show measurements;
name: measurements
name
----
hello

> select * from hello
name: hello
time                tag_alpha value
----                --------- -----
1503037127485600991 3         3
1503037249575451262 2         4
1503037384953683603 4         5
1503037626342109770 4         6

> select * from hello where tag_alpha='2'
name: hello
time                tag_alpha value
----                --------- -----
1503037249575451262 2         4

> select * from hello where tag_alpha='4' and value=6
name: hello
time                tag_alpha value
----                --------- -----
1503037626342109770 4         6

效果

給一張公司內部署以後的面板圖
Alt text

友情連接

RunnerLee: fastD 貢獻者之一

相關文章
相關標籤/搜索