CentOS üzerinde Docker Container ile Clustered HA Grafana Kurulumu

Uygulama Yönetimi Ekibi
Nov 4 · 4 min read

Merhabalar, bu yazımızda CentOS sunucuları üzerine clustered HA Grafana kurulumunu yapacağız. Yazımıza başlamadan önce kullanacağımız specler ile beraber Grafana’dan da kısaca bahsedelim.

Ortam bilgileri:

3 adet CentOS VM

10.10.10.10 — grafana node 1

10.10.10.11 — grafana node 2

10.10.10.12 — mysql node

Grafana

Grafana, web uygulaması olarak çalışan, zengin görsel yeteneklere sahip metrik analiz ve görselleştirme yapabilen, açık kaynak kodlu monitoring programıdır. Grafit, InfluxDB veya Opentsdb’yi yardımcı olarak destekler. Detaylı bilgi:

www.grafana.com

MySql

MySql, açık kaynak kodlu, relational veritabanı yönetim sistemidir (RDBMS). RDBMS relational bir modele dayalı veritabanı yaratmak ve yönetmek için kullanılan bir yazılım veya hizmettir. Detaylı bilgi:

www.mysql.com

Kurulum sırasında kullanılmasının amacı Grafana üzerinde user sessionları ve chart-dashboard bilgilerini database üzerinde tutup stateful bir ortam hazırlamaktır. Bu sayede farklı node üzerinde düşen istekler de diğer node üzerinde oluşturulan resourceların erişilebilirliliği sağlanır.

Nginx

Nginx, open source bir web serverdır. Bunun yanında aşağıdaki özellikleri de oldukça kullanışlıdır.

· Reverse Proxy (Ters Vekil Sunucusu),

· Load Balancing (Yük Dengeleme),

· Virtual Host (Sanal Sunucu),

· Statik ve index dosyalarının sunumu, otomatik indeksleme.

Detaylı bilgi:

www.nginx.com

Bu kurulum da basit bir load balancer olarak implemente edilecektir.

Docker Container üzerine Mysql Kurulumu

Grafana kurulumlarına başlamadan evvel session bilgisi, chartlar, dashboardlar vs. datalarını tutacak olan mysql kurulumunu yapalım.

Not: Bu kurulum best practice’den uzak bir mysql kurulumdur. Prod kurulumları için root user’dan ayrı bir user oluşturulmalı ve yetkilendirmeler ona göre verilmelidir.

Aşağıdaki komut ile mysql kurulumunu yapıyoruz.

docker run -d — name mysql -e MYSQL_ROOT_PASSWORD=12345678 -p 3306:3306 mysql:5.7.27

Sonra mysqle bağlanıp ilgili veritabanlarını oluşturuyoruz.

docker exec -it mysql bash

mysql -uroot -p12345678

CREATE DATABASE grafana;

CREATE DATABASE grafana_user;

Grafana Kurulumu

Node1

Container üzerine kuracağımız için config dosyalarının host üzerinde bulundurup container crash olduğunda config kaybı yaşamamak adına aşağıdaki şekilde host üzerinde klasörler oluşturuyoruz.

mkdir grafana_n1

cd grafana_n1

mkdir -p config log plugins

cd config

vi grafana.ini

Grafana’nın configürasyon dosyası üzerinde aşağıda ki değişiklikleri yapıyoruz. Aşağıda sadece değiştirilen kısımları ekliyorum.

….

[paths]

logs = /grafana_n1/log

plugins = /grafana_n1/plugins

[server]

protocol = http

http_port = 3000

root_url = http://10.10.10.10:3000

router_logging = true

[database]

type = mysql

host = 10.10.10.12:3306

name = grafana

user = admin

password = 12345678

url = mysql://root:12345678 @10.10.10.12:3306/grafana

[session]

provider = mysql

provider_config = root:12345678@tcp(10.10.10.12:3306)/grafana_user

cookie_name = grafana_sess

session_life_time = 900

[dataproxy]

logging = true

….

Config dosyasını bu şekilde düzenledikten sonra aşağıdaki komutla grafana container’ını ayağa kaldırıyoruz.

docker run -d -p 3000:3000 — name grafanaN1 -v /grafana_n1/config/grafana.ini:/etc/grafana/grafana.ini -v /grafana_n1/data:/var/lib/grafana -v /grafana_n1/plugins:/var/lib/grafana/plugins grafana/grafana

Not: -v ile container içindeki default config pathlerini host üzerinde kendi oluşturduğumuz config pathlerine mapliyoruz.

Node2

Node1'de açıkladığımız gibi, container crash olduğunda config dosya kaybı yaşamamak adına host üzerinde aşağıdaki gibi klasörler oluşturuyoruz.

mkdir grafana_n2

cd grafana_n2

mkdir -p config log plugins

cd config

vi grafana.ini

Grafana’nın configürasyon dosyası üzerinde aşağıda ki değişiklikleri yapıyoruz. Aşağıda sadece değiştirilen kısımları ekliyorum.

….

[paths]

logs = /grafana_n2/log

plugins = /grafana_n2/plugins

[server]

protocol = http

http_port = 3000

root_url = http://10.10.10.11:3000

router_logging = true

[database]

type = mysql

host = 10.10.10.12:3306

name = grafana

user = admin

password = 12345678

url = mysql://root:12345678@10.10.10.12:3306/grafana

[session]

provider = mysql

provider_config = root:12345678@tcp(10.10.10.12:3306)/grafana_user

cookie_name = grafana_sess

session_life_time = 900

[dataproxy]

logging = true

….

Bu şekilde config dosyasını düzenledikten sonra aşağıdaki komutla grafana containerını ayağa kaldırıyoruz.

docker run -d -p 3000:3000 — name grafanaN2 -v /grafana_n2/config/grafana.ini:/etc/grafana/grafana.ini -v /grafana_n2/data:/var/lib/grafana -v /grafana_n2/plugins:/var/lib/grafana/plugins grafana/grafana

Load Balancer olarak Nginx Kurulumu

Cluster’ımızı test edebilme amaçlı nginx’i kurup load balancing yapacak şekilde configüre edelim. Bu kurulumda nginx test amaçlı Node1 (10.10.10.10) üzerinde konumlandırılmıştır. Aşağıdaki komutlarla kurabiliriz.

yum install nginx

systemctl enable nginx.service

systemctl start nginx.service

/etc/nginx/conf.d/ altında ki default.conf dosyasını loadbalancer.conf olarak güncelleyip aşağıda ki şekilde konfigüre edelim

upstream backend {

least_conn;

server 10.10.10.10:3000;

server 10.10.10.11:3000;

}

server {

listen 80;

location / {

proxy_pass http://backend;

}

}

Bu işlemden sonra nginx servisini restart edip 10.10.10.10:80 üzerinden cluster’ımızın load balancer tanımına erişmiş oluyoruz.

Default kullanıcı adı ve şifre olarak admin/admin olarak giriş yapabiliriz.

Node1 ve Node2'ye gelen loglar ise aşağıdaki gibidir.

Node1:

t=2019–11–04T10:59:28+0000 lvl=info msg=”Request Completed” logger=context userId=0 orgId=0 uname= method=POST path=/login status=200 remote_addr=10.10.10.10 time_ms=35 size=41 referer=http://10.10.10.10/login
t=2019–11–04T10:59:29+0000 lvl=info msg=”Request Completed” logger=context userId=2 orgId=1 uname=Admin method=GET path=/avatar/c511c76b75d868be149dd1f71e65b62c status=200 remote_addr=10.10.10.10 time_ms=112 size=1486 referer=http://10.10.10.10/
t=2019–11–04T10:59:30+0000 lvl=info msg=”Request Completed” logger=context userId=2 orgId=1 uname=Admin method=GET path=/api/plugins status=200 remote_addr=10.10.10.10 time_ms=2 size=14653 referer=”http://10.10.10.10/?orgId=1"
t=2019–11–04T10:59:30+0000 lvl=info msg=”Request Completed” logger=context userId=2 orgId=1 uname=Admin method=GET path=/api/search status=200 remote_addr=10.10.10.10 time_ms=3 size=2 referer=”http://10.10.10.10/?orgId=1"

Node2:

t=2019–11–04T10:58:56+0000 lvl=info msg=”HTTP Server Listen” logger=http.server address=0.0.0.0:3000 protocol=http subUrl= socket=
t=2019–11–04T10:59:12+0000 lvl=info msg=”Request Completed” logger=context userId=0 orgId=0 uname= method=GET path=/login status=200 remote_addr=10.10.10.10 time_ms=5 size=38934 referer=
t=2019–11–04T10:59:28+0000 lvl=info msg=”Request Completed” logger=context userId=2 orgId=1 uname=Admin method=GET path=/ status=200 remote_addr=10.10.10.10 time_ms=12 size=41101 referer=http://10.10.10.10/login
t=2019–11–04T10:59:29+0000 lvl=info msg=”Request Completed” logger=context userId=2 orgId=1 uname=Admin method=GET path=/api/dashboards/home status=200 remote_addr=10.10.10.10 time_ms=5 size=1593 referer=http://10.10.10.10/

Yukarıdaki tüm adımlardan sonra Docker Container üzerinde clustered HA Grafana kurulumumuzu tamamlamış oluyoruz.

    Uygulama Yönetimi Ekibi

    Written by

    Doğuş Teknoloji

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade