Docker Swarm, Telegraf, InfluxDB, Grafana ile Metrik İzleme (MQTT Örneğiyle)

Bu yazıda sunucuların, servislerin yada çok farklı gözükse de aslında yakın olan sensörlerin verilerini canlı olarak takip edip görselleştirmeye, görselleştirmeleri de özelleştirmeye olanak sağlayan birkaç teknolojiden bahsedeceğiz. Kullanacağımız teknolojiler isim olarak Telegraf ile metrik toplama, InfluxDB ile zaman serisi veritabanında depolama, Grafana ile görselleştirme ve bu işlemleri Docker Swarm Modu üzerinden gerçekleştirmeyi içeriyor. Örnek olarak sunucunun işlemci ve hafıza kullanımıyla alakalı birkaç veriyi ve rastgele üretip MQTT’den göndereceğimiz verileri nasıl görselleştireceğimize bakacağız. Benzer şekilde Nginx, HAProxy, Graylog, Kubernetes, Docker, MySQL, MongoDB, Redis, Apache, RabbitMQ gibi yaygın kullanılan birçok servis hakkındaki kullanım bilgilerini toplayabilir, istediğimiz sürede saklayabilir ve görselleştirme/analiz yapabilir ve istediğimiz durumlarda uyarı oluşturabiliyoruz. İstediğimiz servis desteklenenler arasında olmasa ya da kendi yazdığımız bir servis olsa bile herhangi bir programlama dilinde yazacağımız ufak bir kod ile istediğimiz metrikleri Telegraf’a TCP üzerinden gönderebiliriz.

Bu temel bilgilerin ardından kuruluma başlayalım. Bu kurulumlar sırasında bir sanal makine üzerinde Docker kurarak ilerlemenizi tavsiye ederim. Daha önce Docker kurmadıysanız Centos 7 kullandığınız bir sistemde(aslında daha başka birçok dağıtımda da aynı) root kullanıcısı olarak veya sudo yetkisi bulunan bir kullanıcının komut satırından şunu yazmanız yeterli:

Bunu yazdıktan sonra, eğer root değilseniz ve sudo yetkisi için parola giriyorsanız, kısa bir süre sonra size makine bu parolayı soracaktır.

Bu işlem bittikten sonra artık Docker kurulmuş olacak. Eğer root dışında bir kullanıcı üzerinden işlem yapıyorsanız, şu komutu da yazdıktan sonra bir daha Docker işlemleri için sudo kullanmanıza gerek kalmayacak:

Bu komut ile kullanıcıyı docker grubuna eklemiş oluyoruz. Ardından, Docker ile birden fazla makine arasında servis ve yük paylaşımının yapılabildiği “Docker Swarm Mode” adı verilen özelliği aktifleştireceğiz. Bunu yapmak için:

IP adresi olarak Docker’ı kullanacağımız arayüzün IP adresini yazmamız gerekiyor. Bu, özellikle birden çok IP adresine sahip makinelerde önem taşıyor. Ayrıca birden fazla sunucunun bir Swarm içinde ortaklaşa çalışmalarını istediğimizde de birbirlerine bu IP adresleri üzerinden bağlanacaklarını söyleyelim. Dikkat etmemiz gereken, aynı ağ üzerinde bulunan makineler birbirine bağlanırken eğer varsa iç ağdaki IP adreslerini kullanabiliriz. Ancak dışarıdan bir makineyi de Swarm’a dahil etmek istediğimizde sorun yaşayacağımız eğer bu ihtimal varsa Public IP’leri kullanarak bu bağlantıyı sağlamak daha sağlıklı olacaktır. Eğer sanal makine üzerinde kendi bilgisayarımızda çalışıyorsak özel bir ayar yapmadığımızda VirtualBox üzerinde loopback(lo) arayüzü dışında bir tane daha arayüz olacağı için onunkini yazarak devam edebiliriz. Örnek olarak enp0s3 arayüzüne ait IP adresini yazabiliriz. Ardından, komutun son hali ‘docker swarm init –advertise-addr 192.168.99.100’ şeklinde olacaktır:

Bu komutun çıktısı olarak bize Docker Swarm Mode için başka makinelerin Swarm’a dahil olabileceği bir token verilecek. Bunu şu an kullanmayacağımız için geçiyoruz. Eğer bu Token’daki sayı ve harflerin ne anlama geldiğini merak ediyorsanız şu yazıda bahsetmiştik.

Birden fazla cihazı, farklı veri merkezlerinden birbirine bağlamak istersek, ağ üzerinde servisler arasında oluşan trafiğin açık olarak(cleartext) gitmesi, hassas veriler için sorun olacaktır. Bu yüzden, bir ağ oluşturup şifrelemeyi aktifleştiriyoruz. Bu sayede, servislerin arasında TLS kurulumu yapmamıza gerek kalmayacak, sadece dışarı açtıklarımızda bu tür bir ihtiyacımız olacak. Aynı zamanda şifreleme için kullanılan anahtarların yenilenmesi(key rotation) Docker tarafından otomatik olarak gerçekleştirilecektir. Bu uygulamanın bir diğer artısı da, donanımsal kripto birimleri kullanılabildiğinde ağın şifrelenmesi için onlar kullanılacak ve performans konusunda ciddi artışlar yaşanacaktır. Bu amaçla, monitor_network adında bir ağ oluşturalım:

Komut içerisinde verdiğimiz –driver overlay parametresi Docker içerisinde varsayılanda gelen birden çok cihaz destekleyen ağ sürücüsünü aktifleştirir. Bunu multi-host networking olarak İngilizce kaynaklarda görebilirsiniz. Docker ile birlikte birden çok ağ sürücüsü geldiği gibi, sonradan yüklenebilecek ve birden çok makineyi destekleyen farklı ağ sürücüleri de bulunmakta. İhtiyaç halinde bunları araştırarak farklı özelliklere denk gelebilirsiniz.

Komutta verdiğimiz –opt encrypted seçeneği, ağın şifrelemesini etkinleştirir. Bu parametrede yapacağımız olası yazım yanlışları için bize bir uyarı verilmez, zira komutun CLI üzerinden API ile Docker Engine’e aktarılması sırasında yazılan –opt parametresi kontrol edilmiyor. Bu yüzden, yanlış yazarsak şifreleme aktifleşmeyeceği gibi, bize bir uyarı veya hata da verilmeyecek. Bu konuda Docker dokümantasyonundan güncellemeleri takip edip, gerekli olduğunda ağda şifreleme olup olmadığını elle kontrol etmekte fayda var.

Son olarak, bu uygulama kapsamında tek bir ağ üzerinden gidiyoruz. Genellikle yayına alınan sistemlerde kurulan ağ sayısı birden fazla oluyor ve çalışan uygulamalarda birbiriyle haberleşmesi gerekmeyenlerin/istenmeyenlerin farklı ağlara konularak birbirlerinden izole olarak kalması sağlanıyor.

MQTT Sunucusunun Kurulması

Şimdi, esas veri kaynağımız olacak MQTT sunucusunun kurulumuna bakacağız. Bunun için bir Docker servisi oluşturup onu kullanacağız. Oluşturacağımız servis Mosquitto’yu çalıştırıp, 1883 numaralı portu dışarıya açacak.

Oluşturduğumuz servisi monitor_network ağına dahil ettik. Bunun sebebi veritabanı veya Telegraf gibi servislerle kapalı ve şifreli trafiğe sahip ağ üzerinden haberleşmesi ve dışarıya sadece görselleştirecek arayüz ile MQTT sunucusunu açmanın yeterli olması.

Bu işlemin ardından artık MQTT sunucusu çalışıyor olacak. Kontrol etmek için:

State kısmında Running yazdığını görüyorsanız servis başlamıştır. En başta servisin çalıştırılması için, ilgili sunucuda imaj yoksa indirileceği için biraz sürebilir. Bu aşamada orda Preparing görmelisiniz. Aradan biraz geçince de beklendiği gibi Running olarak değişmeli.

Veritabanı Sunucusunun Kurulması

Öncelikle, kullanacağımız veritabanı olan InfluxDB’nin verilerini kalıcı olarak saklayabilmek için db_veriler isimli bir dizin oluşturuyoruz. Ardından serviste bir sorun olursa veya yedek almak istersek bu dizin üzerinden yeniden oluşturabilir veya dizini yedekleyebiliriz.

Bunun ardından veritabanını oluşturabiliriz. Servisin adı monitor_db olacak ve bu servis de diğerleriyle birlikte monitor_network ağında olacak. Normalde açmamız gerekmiyor ancak örnek olarak dışardan gelen bazı sorguları deneyebilmek için 8083 ve 8086 portlarını açıyoruz. Son olarak da, bulunduğumuz dizindeki db_veriler dizinini /var/lib/influxdb altına bağlıyoruz.  Bu işlemin ardından veriler artık CoW(Copy on Write) dosya sisteminin dışında, bizim dosya sistemimizde db_veriler dizininde tutulacak.

Artık bir sorun var mı yok mu diye kontrol etmek, aynı zamanda servisin durumunu sürekli izlemek için şu komutu kullanabiliriz:

Bu komut çıktı olarak 2 saniyede bir, varsa hatayı yoksa da üstte gördüğünüz gibi servisin durumunu gösterir.

Veri Formatı

InfluxDB üzerinde veriler MeasurementTag SetField Set ve Timestamp olarak tutulur. Veri formatı, dokümantasyonunda yazıldığı üzere şu şekildedir:

Bu formata göre örnek bir veri şöyle olacaktır:

Burdaki ölçüm(measurement) cpu, Etiketler(tag set) host=sunucu1 ve region=Test, alan olarak(field set) sadece value=3.25‘i içeriyor. Zaman değeri(timestamp) olarak bir şey sağlamadık. Bu durumda sunucunun zamanı veritabanı tarafından otomatik olarak ekleniyor. İstersek bir boşluk daha bırakıp biz de sağlayabilirdik.

Veritabanına Erişim

Şimdi veritabanı sunucusuna nasıl erişeceğimize bakalım. Örnek olarak oluşturduğumuz servise girecek ve bir veritabanı oluşturacağız. Bu işlem için öncelikle, bulunduğumuz makinede çalışan veritabanı sunucu servisini bulmamız gerekiyor. Bunu yapmak için:

Bu çıktıda yer alan CONTAINER ID sütununda, InfluxDB’ye ait olan satırın sonunda konteynırın ismi yer alıyor. Konteynıra girip işlem yapmak için bu isme ihtiyacımız var. Şimdi ismini bildiğimiz konteynırın içine girelim ve bir terminal çalıştıralım:

Artık veritabanı sunucusu konteynırındaki servisteyiz. Veritabanı için olan kabuğu başlatıp komutlara bakabiliriz. Bunun için yazmamız gereken komut influx olacak:

Veritabanı sunucusuna giriş yaptığımıza göre ilk olarak varolan veritabanlarına bakalım. Bunun için show databases yazmamız yeterli:

Çıktıda yer alan _internal isimli veritabanı InfluxDB’nin kendi iç kullanımı için. Biz, verilerimizi tutmak için yeni bir veritabanı oluşturacağız. Ancak öncesinde, bir kullanıcı oluşturup ona yetki verelim. admin kullanıcı adıyla yeni bir kullanıcı oluşturup kendisine tüm yetkileri veriyoruz. Parola olarak da alttaki komutta istediğimiz bir parolayı yazabiliriz:

InfluxDB tabii ki sadece bir veritabanı üzerinde yazma yetkisi olan kullanıcıları oluşturmamıza imkan sağlıyor. Ancak şu anlık basitlik için bu şekilde devam edeceğiz. Dokümantasyondaki kullanıcı yönetimi kısmından farklı yetki seviyelerindeki kullanıcıların nasıl oluşturulacağına bakabilirsiniz. Şimdi oluşturduğumuz kullanıcıya bir bakalım:

InfluxDB, hiçbir kullanıcı tanımlı değilken dışardan bağlantı kabul etmiyor, sadece yönetici oluşturacak bağlantıları kabul ediyor. Haliyle bir kullanıcı oluşturarak başlamamız gerekti. Ayrıca, kullanıcı adı ve parola doğrulamasını aktifleştirmek isterseniz, dokümantasyonda belirtildiği üzere InfluxDB ayar dosyasından authentication‘ı aktifleştirmeniz gerekiyor. Yayına aldığınız bir sistemde dışarıya açtığınız bir veritabanı üzerinde bunu yapmazsanız herhangi birisi kullanıcı adı ve parola belirtmeden veritabanı sunucusuna giriş yapıp sorgu çalıştırabilir.

Şimdi, telegraf isimli bir veritabanı oluşturalım ve ardından var olan veritabanı listesine bakalım:

Buraya kadar bir yanlışlık olmadıysa veritabanı gözüktüğü gibi listelenmeli. Bu aşamada farklı isimde bir veritabanı oluşturduysanız, ilerki aşamalarda ayarlar kısmında onu yazmanız gerekiyor.

Veri Örneği

Veritabanı da oluşturduğumuza göre henüz çıkış yapmadan, örnek bir veri ekleyelim ve işlerin zaman serisi veritabanında nasıl yürüdüğünü görelim. İlk olarak, hangi veritabanını kullanacağımızı söylememiz gerekiyor. Biz telegraf isimli veritabanını kullanacağız:

Ardından örnek bir veri ekleyebiliriz. Ekleyeceğimiz verinin ölçüm adı(measurement) sicaklik olsun. Etiketleri ev ve mutfak olarak ayarlayalım. Değerine de 25 diyelim:

Artık bir veri eklemiş olduk. Şimdi hangi ölçüm türlerinin veritabanında var olduğunu görelim:

Eğer bir sorunla karşılaşmadıysanız, sicaklik adında bir ölçümün sizde de gözükmesi gerekiyor. Şimdi, sıcaklık ölçümündeki tüm değerleri görelim:

Kendi eklediği, mikrosaniye hassasiyetindeki zamanı da burda görebiliyoruz. Ancak zaman serisi veritabanı için daha çok ihtiyacımız olabilecek kısım, ‘son 5 dakikadaki veriler’ gibi sorgular olabilir. Bunun için hemen bir örnek yaparak, son 1 dakikadaki sıcaklık ölçümlerini soralım:

Eğer biraz önceki insert komutunu yazdığınızın ardından 1 dakikadan fazla geçtiyse, bu çıktı sizde de boş olacaktır. Eğer boş değilse 1 dakika kadar bekleyip tekrar denemekte fayda var. Şimdi, son 5 dakikadaki ölçümleri soralım ve eklediğimiz ölçümü görelim. Eğer siz daha uzun bir süre önce eklediyseniz ona uygun bir zaman değeri yazabilirsiniz:

Artık basit sorgularla temel işlemleri nasıl yaptığımıza örnek vermiş olduk. Detaylar için InfluxDB’nin dokümantasyonunda biraz gezinmenizi öneririm.

Şimdi veritabanı sunucusunun komut satırı istemcisinden CTRL+D ile çıkabiliriz. Konteynırın içinden de yine CTRL+D ile çıkabiliriz. Bunu yaptığımızda kendimizi tekrar işletim sistemimizin terminalinde görmemiz gerekiyor.

HTTP API Üzerinden Dışarıdan Ulaşım

InfluxDB’ye, HTTP API’ı üzerinden de ulaşabiliriz. Bunu denemek için curl kullanacağız.

Bu komutta query endpointine bağlanıp ‘SHOW DATABASES’ sorgusunu gönderdik. InfluxDB, HTTP isteklerine cevabı JSON olarak verir. Aldığımız sonuçta, oluşturduğumuz telegraf isimli veritabanının olduğuna da dikkat edelim.

Telegraf’ın Kurulumu

Veritabanı hazır olduğuna göre, artık MQTT sunucusu ile veritabanı arasındaki iletişimi sağlayacak bir servis bulmamız gerekiyor. Bu amaçla Telegraf’ı kullanacağız. Telegraf, yazının başında da belirttiğimiz gibi çok miktarda servisten veri alabiliyor. Bunların arasında MQTT takip etme gibi servis olmayan ama veri alınabilen birkaç alternatif de mevcut. Kurduğumuz sunucudaki istediğimiz konulara abone olmasını ve mesaj geldiğinde bunları veritabanına kaydetmesini isteyeceğiz.

Telegraf, veri aldığı kaynakları input olarak, verileri yazdığı yerleri de output olarak tanımlar. Bizim uygulamamızda input olarak MQTT, output olarak da InfluxDB olacak. Ayrıca çalıştığı sunucunun işlemci ve RAM kullanımı gibi bazı bilgileri Telegraf varsayılanda otomatik olarak almaktadır. İstersek bir sonraki aşamada kullanacağımız ayar dosyasından bunu da düzenleyebilir veya kapatabiliriz.

Ayar Dosyasının Elde Edilmesi

İlk aşamada şablon olarak kullanabileceğimiz, mümkün olduğunca açıklamaları da içerecek bir ayar dosyasına ihtiyacımız var. Bunu, bir Telegraf konteynırı çalıştırıp, telegraf programından örnek ayar dosyası oluşturmasını isteyerek yapabiliriz. Komutun çıktısını da bir dosyaya kaydederek şu şekilde ayar dosyasını elde ederiz:

Bu komutun çıktısı olarak, bulunduğumuz dizinde telegraf.conf isimli bir dosya görmemiz gerekiyor:

Ayarların Yapılması

Artık vimnano gibi istediğimiz bir editörle bu dosyayı açıp düzenlemeye başlayabiliriz.Dosya içerisinde ilk olarak, veritabanı sunucusunu güncellememiz gerekiyor. Docker Swarm Mode üzerinde yer alan servis bulma sunucusu, ayar dosyalarındaki servislerin adını direk adres olarak kullanmamıza izin veriyor. Bu sayede çalıştırdığımız servisler, diğer servislerin sadece isimlerini bilerek onlarla iletişim kurabiliyor. Böylece IP değişikliği veya yeni sunucu eklendiğinde ona da isteklerin aktarılması gibi durumlarla başetmekle uğraşmıyoruz.

Ayar dosyasında ilk olarak veritabanı ayarlarını yapacağız. Bunun için dosya içerisinde OUTPUT PLUGINS kısmında yer alan [[outputs.influxdb]] başlığına gelelim. Burda, veritabanı adresi ve adı gibi tanımlamalar varsayılan olarak tanımlanmış haldeler. Kendi bilgilerimizle güncelleyelim:

Eğer veritabanı sunucusunun ayar dosyasında kullanıcı adı ve parola ile girişi aktifleştirmediyseniz, son iki satırı eklemenize gerek yok.

Son olarak, MQTT sunucusunun ayarlarını da yaparak Telegraf servisini ayağa kaldırmaya geçebiliriz. Ayar dosyasında [[inputs.mqtt_consumer]] kısmını bulup, takip etmek istediğimiz konuları da düzenleyerek şu hale getirelim:

Birden fazla konuya abone olmak isterseniz topics kısmını ona göre düzenleyebilirsiniz. Veri formatı olarak influx‘ı seçtik. Bu kısımda da JSON’ın da içinde bulunduğu birkaç alternatif mevcut. Açıklamaları takip ederek bu konuda daha detaylı bilgi edinebilirsiniz.

Telegraf Servisinin Çalıştırılması

Telegraf servisini artık ayağa kaldırabiliriz. Şimdi yapmamız gereken, ayar dosyasının yerini göstermek ve monitor_network ağına dahil etmekten ibaret. Ayrıca, sorun olursa rahat çözbilmek için, debug modunda çalıştırarak yaptığı işlemleri daha net izleyelim.

Servisin ne durumda olduğuna yine  watch docker service ps telegraf ile bakabiliriz. Bizim için son derece kritik olansa ayakta olsa bile servisin metrikleri ve mesajları toplayıp toplayamadığıdır. Bunun için servisin çalıştığı makinede öncelikle  docker ps ile konteynır listesinden Telegraf’a ait konteynırı bulup daha sonra  docker logs KONTEYNIR_ISMI şeklinde logları görebiliriz. Eğer Docker’ın servis loglarını destekleyen bir versiyonunu veya son sürümlerinden birini deneysel(experimental) modda kullanıyorsanız şunu yazarak görebilirsiniz:

Telegraf’ın, veritabanına o an ulaşamasa bile istediğimiz miktarda mesajı hafızada tutmasını ve veritabanına ulaştığında öncekilerle birlikte yazmasını sağlayan bir özelliği var. Varsayılanda tutulacak maksimum mesaj sayısı 10000 olarak belirlenmiş. İstersek bunu değiştirebiliriz ancak şu an ihtiyacımız yok. Komut çıktılarından sizdeki değeri ve ne kadar dolu olduğunu kontrol edebilirsiniz.

Ölçümlerin Görselleştirilmesi

Bu yazının sanırım en çok beklenen kısmına geldik. Verileri Grafana ile görselleştireceğiz. Öncelikle, Grafana’nın kendi verilerini(mesela oluşturduğumuz panelleri, kullanıcıları) tutacağı bir dizin oluşturalım. Bu da aslında veritabanında yaptığımıza benzer bir mantıktan geliyor.

Komutu incelerken/yazarken göz önünde bulundurmamız gerekenler:

  • Grafana’nın çalışacağı yolu kendisine parametre olarak veriyoruz. Eğer kendi bilgisayarınızda veya sanal makinede ve alan adında asıl dizinde bulunacaksa aşağıda olduğu şekliyle kullanabilirsiniz.
  • Grafana’yı dışarıya 3000 portu üzerinden açıyoruz.
  • Kullanıcı adı ve parola doğrulaması varsayılanda aktif. Kullanıcı adı admin ve parolayı parametre olarak vereceğiz.
  • Grafana, eklenti destekliyor ve bu eklentilerle olmayan görselleştirme araçları, veri kaynakları gibi özellikler eklenebiliyor. Biz sadece örnek olması açısından 2 eklentiyi kuruyoruz. Bunu da parametre vererek yaptık.
  • Grafana verilerini tutacağımız grafana_data dizinini /var/lib/grafana altına bağlıyoruz.

Bunun ardından artık IP adresi veya alan adına 3000 portundan bağlanabiliriz. Örneğin, Grafana’nın çalıştığı makinenin IP adresi 192.168.50.99 ise şunu yazarak tarayıcıdan bağlanabiliriz:

Karşımıza şöyle bir ekran gelmeli:

Bu ekranda kullanıcı adına admin, parola için de servisi oluştururken parametre olarak yazdığımız parolayı yazarak giriş yapabiliriz. Karşımıza kullanım aşamalarını gösteren şu ekran gelmeli:

Bu ekranda ilk aşama olan kurulumu zaten Docker kullanarak ve verdiğimiz parametrelerle yapmış olduk. Şimdi, Grafana’nın hangi veritabanına bağlanacağını söylememiz gerekiyor. Bu ayarı da Add data source butonuna basarak yapıyoruz. Ayarları yazılı haldeyken şöyle bir ekran olmalı:

Name kısmına istediğimiz bir ismi verebiliriz. URL kutusuna ise veritabanını yazıyoruz. Docker Swarm Mode içerisinde ve overlay network üzerinde olduğumuz için direk servis adını yazmamız yeterli oldu. Access kısmında, verileri izlerken Grafana’nın veritabanından çekip bize göstermesini istediğimiz için proxy seçili olarak kaldı. Son olarak da, veritabanı adı olarak telegraf yazdık. Eğer kullanıcı adı ve parola doğrulamayı aktifleştirdiyseniz o bilgileri de burda girebilirsiniz. Bunları yazıp Save butonuna basınca, alt kısımda şunu görmelisiniz:

Veri kaynağı çalıştığına göre, artık ölçtüğü verileri incelemeye geçebiliriz. Sol üst menüden, Dashboards -> New seçeneğine gelelim. Bizi şöyle bir ekran karşılayacak:

Bu ekranda yapacağımız görselleştirmenin türünü seçebiliriz. Bu uygulamada grafik çizeceğimiz için Graph‘ı seçiyoruz. Bize boş bir grafik gelmeli:

Yukarısında Panel Title yazısının üzerine tıklayarak Edit‘i seçelim. Şimdi gelen ekrandan neyi çizeceğimizi ve nasıl çizeceğimizi seçebiliriz. Altta Metrics sekmesinde yer alan SELECT sorgusunun üzerine bir kez tıkladığımızda bize seçim yapabileceğimiz bir form açılacak:

Seçimleri bu ekran görüntüsündeki gibi yaparsanız, işlemci kullanım grafiğini görmeniz gerekiyor. Bu sırada dikkat etmemiz gereken başka bir etkense, varsayılanda grafiklerin son 6 saat baz alınarak çizilmesi. Bunu sağ üst kısımda yazan Last 6 Hours yazısına tıklayarak değiştirebiliriz:

Yukarıdaki gibi ayarlarsanız, her 5 saniyede bir grafikler güncellenecek ve son 30 dakikayı gösterecektir. Ardından kaydediğimizde grafik son yarım saati gösterecek şekilde güncellenmiş olmalı.

Örnek olarak şuna benzer bir şey çıkabilir:

Düzenleme menüsündeki seçenekleri kurcalayarak ve dokümantasyon üzerinden farklı seçenekleri de deneyebilirsiniz. Şimdi esas kısım olan MQTT verilerinin görselleştirilmesine geçelim.

MQTT Test Verisi Üretmek

Bu uygulamada, belirli aralıklarla rastgele sayılar üretip bunları MQTT bağlantısını test ederken kullanacağız. Bunu yapabilmek için de mosquitto_pub isimli, Mosquitto’ya ait yayın yapmayı sağlayan istemciyi kullanacağız. Birçok Linux dağıtımında mosquitto-clients adlı paket bu komutu sağlamaktadır. Ubuntu üzerinde  sudo apt install mosquitto-clients , CentOS üzerinde (epel reposu aktifken)  yum install mosquitto  ve Alpine üzerinde  apk add mosquito-clients yazarak kurabiliriz. Ardından, yeni bir komut satırı veya farklı bir makine üzerinde terminalden rastgele veri üretip gönderen şu komutu çalıştıralım:

Başka bir terminal veya makine üzerinden de, bu verilere MQTT ile abone olarak gerçekten geldiklerinden emin olalım:

Ardından, Grafana’ya dönerek yeni bir grafik oluşturalım ve bilgileri görmeye başlayalım:

Bazı Ek Noktalar

En son ulaştığımız kısımda artık verileri kaydediyor ve grafiklerini çizebiliyor durumdayız. Yapılabilecek veya yapılması gereken birçok ek işten birkaç tanesinden bahsedelim:

  • Verilerin kalıcılığı: Şu an tek makinede çalıştığımız için, yaptığımız bağlama işlemlerinde sorun yaşamadık. Birden çok makineden oluşan bir Swarm kurduğunuzda(ki Swarm kurmanın esas amacı büyük ihtimal bu olacaktır), bu dizinlerin makinelerin tamamından erişilebilir olması gerekiyor. Bunun için ağ üzerinden çalışan bir dosya sistemi kullanabilirsiniz. Sunucularınızı dışarıda tutuyorsanız, sunucu hizmeti aldığınız yer de bu konuda farklı çözümler içeriyor olabilir, sayfalarını kontrol etmekte fayda var. Ayrıca, Flocker‘ı bir araştırmanızı önereyim. Bu konuda birçok yerde çalışabilen bir depolama sürücüsü olarak çok kısa özetlemiş olayım.
  • Dışarı açılacak portların belirlenmesi: Veritabanı portlarını dışarı açmamızda, curl ile yapılan isteği göstermek dışında bir amaç yoktu. Gerekli olmadığı sürece portları dışarı açmanın bir faydası yok.
  • Veritabanı erişim kısıtlaması: Veritabanı için ayar dosyasını ve dokümantasyonu inceleyerek, kullanıcı adı ve parola olmadan girilmemesini ve verilen bilgiler doğru olmadan da yine giriş yapılamamasını sağlamak. Veritabanını dışarıya komple kapatınca bunun gerekliliği azalıyor olsa da, işleri düzgün tutabilmek adına önemli bir konu.
  • Ağların ayrılması: Mümkün olabildiğince, veritabanına bağlanmayacak servisleri onun ağından uzak tutmak gibi, alakasız servisleri farklı ağlara katmak. Örneğin bu uygulamada Mosquitto’nun veritabanı ile aynı ağda olması gerekli değil.

Eklemek, düzeltmek istediğiniz konuları ve yorumlarınızı yazı altına belirtmekten lütfen çekinmeyin.

 

 

  • Mustafa TÜRKÖZ

    Paylaşım için teşekkürler :)