CentOS üzerinde Docker Container ile Clustered HA Grafana Kurulumu
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:
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:
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:
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.
