Sunucularımızı Gözleyelim Oğuz Yarımtepe @oguzy oguzyarimtepe ~ gmail.com http://about.me/oguzy
Gözlem yapmak kolay değildir! Eğer başarılı ise, farklı gözlem yöntemlerini uygun ve hassas bir şekilde güzel bir modele oturtabilmeliyiz.
Büyük veri ~25metrics/server 100M active users = 200K QPS 10.000 servers monitoring = 25.000 metric 12 type servers = 3.000.000 metrics DNS server Load balancer 10.000 metrics/second O(10K) metrics/second O(32MB) data/sweep Ops @ 1 min O(50K) metrics/second O(320MB)/sweep O(420G)/24hours
Neyi gözlüyoruz? Named value at some time K-tuple & timestamped 127.0.0.1 - [10/Oct/2000:13:55:36-0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)" <remote ip, timestamp, request type and the url, response type, response amount> Metrik değerler Sayaçlar (counters), Anlık değerler (Gauges), Yüzdelik değerler (Percentiles)
Nasıl Gözlüyoruz? Çözünürlük Ne sıklıkta veri toplanıyor? (her 6 sn?, her 5 dk?, her dakika?) Gecikme Veriler okunduktan sonra ne kadar sürece tepki veriliyor (sn, dk?) Çeşitlilik Kaç çeşit veri var (10, 25, 50, 10K?)
Gereksinim? Evrensel (*nix, win, sistem kaynakları, aktif cihazlar) Uyarı (alert) sms, e-posta, pager duty, Belli zamanda belli kişiler Erken Web arayüzü Şu anki durum ne? Sezonsal durumlar neler? Belli bir eğilim var mı? Ölçeklenebilir Ölçülen metrik sayısı ~ veri tabanı boyutu Özgür Yazılım Güven (test edilip onaylandı) Özelleştirilebilir Kullanımı kolay
Nagios
Nagios Özellikleri NRPE (nagios remote plugin executer) Plugin Return Code Service State Host State 0 OK UP 1 WARNING UP or DOWN/UNREACHABLE* 2 CRITICAL DOWN/UNREACHABLE 3 UNKNOWN DOWN/UNREACHABLE Uç makine ayarları elle yapılıyor Host, hangi zaman aralıklarında komutların çalışacağı, hangi gruba dahil olduğu, kimlere uyarının gönderileceği... Farklı dillerde eklenti desteği Nagios XI Eğilim (Trend) Ticari destek
Eksikleri Metrik için özelleşmiş değil API desteği eksik - ti (4.4 ile beta olarak gelmiş) Ölçek sorunu
Sensu
Özellikleri Bulut için özelleşmiş JSON ile yapılandırma API erişimi ve API üzerinden yönetim RabbitMQ Omnibus HTTP dostu (üyelik & hiyerarşi Rest Api) Nagios plugin desteği Web arayüzü daha dinamik
Uchiwa
Uchiwa - 2
Uchiwa - 3
Peki ya metrik? http://www.apache.org/server-status
collectd Ajan olarak çalışır Bütünleşik eklentileri Veritabanı (doğal - influxdb) TCP portu (graphite) HTTP POST (json) Özelleşmiş eklenti yazmak mümkün Python & statsd
Bazı eklentileri cpu, df, load, memory, disk Apache Mysql Interface Ping Filecount Nginx Ntpd tcpconns
Graphite
Grafana
Özellik <hostname>.load.load.shorttem Farklı grafik seçeneklerini destekler İstemci taraflı (client side) Zaman ayarlaması yapılabiliyor (5 saniyede bir yenile, son 1 saati göster) Threshold belirtilebiliyor Fonksiyon tanımları yapmak mümkün (graphite-api nin desteklediği, max min avg sum)
Statsd Graphite/Carbon için ön uç (front-end) Sayaç ve Zamansal verinin bir araya getirilmesi (counting & timing) rrd, ganglia
Statsd - 2 Farklı dillerde yazılmış sunucu ve istemci uygulamaları var (Go, Python, Java, C, Ruby, Node) Timer >>> import statsd >>> >>> timer = statsd.timer('myapplication') >>> >>> timer.start() >>> # do something here >>> timer.stop('sometimer')
Statsd - 3 Counter >>> import statsd >>> >>> counter = statsd.counter('myapplication') >>> # do something here >>> counter += 1
Statsd - 4 Gauge >>> import statsd >>> >>> gauge = statsd.gauge('myapplication') >>> # do something here >>> gauge.send('somename', value)
Diamond Artalan süreci (daemon) Python Graphite Başka handler da var: riemann, statsd, zmq Python ile yazılmış pek çok collector var > collectd
Diamond - 2 import diamond.collector class ExampleCollector(diamond.collector.Collector): def collect(self): # Set Metric Name metric_name = "my.example.metric" # Set Metric Value metric_value = 42 # Publish Metric self.publish(metric_name, metric_value)
Influxdb Zamansal verinin saklanması için tasarlanmış (timescale) Cluster (experimental) Ölçeklenebilir Art ve Ön uçları var Statsd, Graphite Go ile yazılmış Harici bağımlılıkları yok (! zookeeper % hadoop, storm) dpkg -i influxdb.deb HTTPS HTTP API SQL Like
Influxdb - 2 [ ] { } "name" : "hd_used", "columns" : ["value", "host", "mount"], "points" : [ [23.2, "servera", "/mnt"] ]
Veri tabanındaki verinin parçalanması (shardening) { "spaces": [ { "name": "everything_30d", "retentionpolicy": "30d", "shardduration": "7d", "regex": "/.*/", "replicationfactor": 1, "split": 1 }, { "name": "rollups", "retentionpolicy": "365d", "shardduration": "30d", "regex": "/^\\d+.*/", "replicationfactor": 1, "split": 1 } ] }
riemann Olan bazlı iş tanımlama (event processor) Collectd den metrik göndermek mümkün Cloujour ile tanımlamalar yapmak mümkün (where (or (service #"^api") (service #"^app")) (where (tagged "exception") (rollup 5 3600 (email "dev@foo.com")) (else (changed-state (email "ops@foo.com")))))
Riemann - 2 Websocket Cloujure ile kendi alerting çatınızı yazabilirsiniz Websocket web arayüzü (def tell-ops (rollup 5 3600 (email "ops@rickenbacker.mil"))) (streams (where (state "error") tell-ops) (tagged "exception" tell-ops))
Teşekkürler