NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

加入新公司後不久開始懷念xflush,大部分情況下只需在頁面上配置, 就可以實現業務指標的視覺化及異常報警。
嘗試利用現有的開源系統搭建,經過調研分析,最終確定的方案為statsd influxdb grafana。目前已上線,執行穩定。
具體過程不再細說,其中重要的取捨和配置介紹如下。

設計取捨

graphite:

老牌的企業級的監控工具。
環境搭建繁瑣: 參考官方文件和網上各種文件,踩各種坑,加上工作上有其它事情在忙,搭建花了2-3天之久。
效能: graphite的儲存元件whisper 是零散小檔案儲存,這樣寫指標檔案會造成隨機io。效能不敢恭維。
介面: 比較傳統的樹形結構,略顯土氣。進一步調研時發現了grafana。

引入StatsD

對資料時間範圍內彙總,大大減少了db的壓力。並能進行min, max, avg多維度統計。

儲存選型InfluxDB

使用 Go 語言編寫,無需外部依賴。反之OpenTSDB 是一種基於 HBase 的時間序列資料庫。
最新版本的儲存引擎底層是B 樹, 也支援批量寫入和快取。
InfluxDB內部整合支援 graphite資料格式。 每次統計指標的min, max, avg對應到資料庫中是一條記錄的多個列, 相比graphite降低了不必要的io開銷。

視覺化Grafana:

介面相當漂亮,功能齊全的度量儀表盤和圖形編輯器和查詢編輯器。

監控報警

當時使用了kapacitor。 目前grafana4.0 已經release, 直接支援alerting。

業務指標採集

業務指標的主要內容: qps/qpm, 延遲。
對java-statsd-client進行了封裝,使用註解和aop xml配置進行業務指標彙報,業務程式碼無侵入。
java-statsd-client 內部使用udp傳送指標統計到StatsD,沒有複雜的狀態管理。對業務影響很小。另外一種方案就是記錄到日誌,flume收集後再傳送到StatsD,徹底隔離對業務的影響。

效能擴充套件

StatsD為無狀態節點,可通過負載均衡器部署多臺保證可靠性和可伸縮性。
InfluxDB儲存到達瓶頸後,可以做分庫的方案,增加一個代理層。StatsD和Grafana通過代理層訪問InfluxDB。

環境搭建

搭建statsD

安裝

sudo yum install epel
sudo yum install nodejs
cd /opt/
sudo git clone git://github.com/etsy/statsd.git
sudo cp exampleConfig.js Config.js
sudo vim Config.js 
{
graphitePort: 2003
, graphiteHost: "x.x.x.x"
, port: 8125
, flushInterval: 60000
,backends: [ "./backends/graphite", "./backends/console" ]
,debug: true
}
statsD預設為qps統計,如修改為qpm, 修改lib/process_metrics.js
current_timer_data["count_ps"]  修改為 current_timer_data["count_ps"] = timer_counters[key];
counter_rates[key]  修改為 counter_rates[key]  = value ;

執行

可直接執行 node stats.js config.js
另外node-forever 提供了守護的功能和LOG日誌記錄功能

wget  http://npmjs.org/install.sh --no-check-certificate 
sh install.sh   -- install nodejs first
[sudo] npm install forever
forever start stats.js config.js
forever list
[0] stats.js [ 24597, 24596 ]

看日誌 forever -o out.log -e err.log stats.js

搭建grafana

sudo rpm -ivh grafana-3.1.1-1470047149.x86_64.rpm
啟動使用者 grafana
服務名稱 grafana-server
預設埠 3000
賬號 admin
密碼 admin
sudo service grafana-server start

搭建InfluxDB:

下載移步:https://www.influxdata.com/downloads/#influxdb

安裝(RedHat&CentOS):

cat << EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
sudo yum install influxdb
sudo service influxdb start

graphite plugin配置

InfluxDB內部有支援 graphite的plugin。 修改配置檔案 /etc/influxdb/influxdb.conf 的graphite section, 增加相關的template

[[graphite]]
enabled = true
database = "mydb"
bind-address = ":2003"
protocol = "tcp"
consistency-level = "one"
# These next lines control how batching works. You should have this enabled
# otherwise you could get dropped metrics or poor performance. Batching
# will buffer points in memory if you have many coming in.
batch-size = 5000 # will flush if this many points get buffered
batch-pending = 10 # number of batches that may be pending in memory
batch-timeout = "1s" # will flush at least this often even if we haven't hit buffer limit
udp-read-buffer = 0 # UDP Read buffer size, 0 means OS default. UDP listener will fail if set above OS max.
# This string joins multiple matching 'measurement' values providing more control over the final measurement name.
separator = "."
# Default tags that will be added to all metrics.  These can be overridden at the template level
# or by tags extracted from metric
#tags = ["region=us-east", "zone=1c"]
# Each template line requires a template pattern.  It can have an optional
# filter before the template and separated by spaces.  It can also have optional extra
# tags following the template.  Multiple tags should be separated by commas and no spaces
# similar to the line protocol format.  There can be only one default template.
templates = [
## stats.company.services.facade.apay.PayFacade.*
#"stats.company.services.facade.* ....measurement.servicename.facadename.field",
"stats.*.services.facade.* .measurement...servicename.facadename.method",
## stats_counts.company.services.facade.servicename.facadename.methodname
"stats_counts.*.services.facade.* measurement.measurement...servicename.facadename.method",
## stats.timers.company.services.facade.apay.PayFacade.*.mean
"stats.timers.*.services.facade.* .measurement.measurement...servicename.facadename.methodname.field",
]

相關文章

程式語言 最新文章