ݺߣ

ݺߣShare a Scribd company logo
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 
= 25.000 metric 
12 type servers 
= 3.000.000 metrics 
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 
DNS 
server 
Load 
balancer 
monitoring
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 UNKNOWNDOWN/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))
ձşü

More Related Content

Sunucularımızı Gözleyelim

  • 1. Sunucularımızı Gözleyelim Oğuz Yarımtepe @oguzy oguzyarimtepe ~ gmail.com http://about.me/oguzy
  • 2. 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.
  • 3. Büyük veri ~25metrics/server 100M active users = 200K QPS 10.000 servers = 25.000 metric 12 type servers = 3.000.000 metrics 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 DNS server Load balancer monitoring
  • 4. 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)
  • 5. 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?)
  • 6. 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
  • 8. 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 UNKNOWNDOWN/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
  • 9. Eksikleri ● Metrik için özelleşmiş değil ● API desteği eksik - ti (4.4 ile beta olarak gelmiş) ● Ölçek sorunu
  • 10. Sensu
  • 11. Ö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
  • 15. Peki ya metrik? ● http://www.apache.org/server-status
  • 16. 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
  • 17. Bazı eklentileri ● cpu, df, load, memory, disk ● Apache ● Mysql ● Interface ● Ping ● Filecount ● Nginx ● Ntpd ● tcpconns
  • 20. Ö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)
  • 21. Statsd ● Graphite/Carbon için ön uç (front-end) ● Sayaç ve Zamansal verinin bir araya getirilmesi (counting & timing) → rrd, ganglia
  • 22. 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')
  • 23. Statsd - 3 ● Counter >>> import statsd >>> >>> counter = statsd.Counter('MyApplication') >>> # do something here >>> counter += 1
  • 24. Statsd - 4 ● Gauge >>> import statsd >>> >>> gauge = statsd.Gauge('MyApplication') >>> # do something here >>> gauge.send('SomeName', value)
  • 25. Diamond ● Artalan süreci (daemon) ● Python ● Graphite ● Başka „handler“ da var: riemann, statsd, zmq ● Python ile yazılmış pek çok „collector“ var > collectd
  • 26. 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)
  • 27. 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
  • 28. Influxdb - 2 [ { "name" : "hd_used", "columns" : ["value", "host", "mount"], "points" : [ [23.2, "serverA", "/mnt"] ] } ]
  • 29. 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 } ] }
  • 30. 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")))))
  • 31. 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))