Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Bu makale projeyi tartışacak nginx-günlük-toplayıcıNginx günlüklerini okuyacak olan , bunları Clickhouse kümesine gönderir. Günlükler için genellikle ElasticSearch kullanılır. Clickhouse daha az kaynak gerektirir (disk alanı, RAM, CPU). Clickhouse verileri daha hızlı yazar. Clickhouse verileri sıkıştırarak diskteki verileri daha da kompakt hale getirir. Clickhouse'un faydaları rapordaki 2 slaytta görülebilir VK, on ​​binlerce sunucudan ClickHouse'a nasıl veri ekliyor?

Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Analizleri günlüklere göre görüntülemek için Grafana için bir kontrol paneli oluşturalım.

Kimin umurunda, kedinin altına hoş geldin.

Nginx, grafana'yı standart şekilde yükleyin.

Ansible-playbook ile clickhouse kümesini şuradan yükleyin: Denis Proskurin.

Clickhouse'da veritabanı ve tablolar oluşturma

Bu da dosya Clickhouse'da nginx-log-collector için veritabanları ve tablolar oluşturmaya yönelik SQL sorguları açıklanmaktadır.

Clickhouse kümesinin her sunucusunda her isteği sırayla yapıyoruz.

Önemli Not. Bu satırda logs_cluster, "remote_servers" ve "shard" arasında clickhouse_remote_servers.xml dosyasındaki küme adınızla değiştirilmelidir.

ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())

Nginx-log-collector-rpm'yi yükleme ve yapılandırma

Nginx-log-collector'ın rpm'si yok. Burada https://github.com/patsevanton/nginx-log-collector-rpm bunun için rpm oluşturun. rpm kullanılarak oluşturulacak fötr şapka

Nginx-log-collector-rpm rpm paketini yükleyin

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nginx-log-collector-rpm
yum -y install nginx-log-collector
systemctl start nginx-log-collector

Config /etc/nginx-log-collector/config.yaml dosyasını düzenleyin:

  .......
  upload:
    table: nginx.access_log
    dsn: http://ip-адрес-кластера-clickhouse:8123/

- tag: "nginx_error:"
  format: error  # access | error
  buffer_size: 1048576
  upload:
    table: nginx.error_log
    dsn: http://ip-адрес-кластера-clickhouse:8123/

Nginx'i ayarlama

Genel nginx yapılandırması:

user  nginx;
worker_processes  auto;

#error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format avito_json escape=json
                     '{'
                     '"event_datetime": "$time_iso8601", '
                     '"server_name": "$server_name", '
                     '"remote_addr": "$remote_addr", '
                     '"remote_user": "$remote_user", '
                     '"http_x_real_ip": "$http_x_real_ip", '
                     '"status": "$status", '
                     '"scheme": "$scheme", '
                     '"request_method": "$request_method", '
                     '"request_uri": "$request_uri", '
                     '"server_protocol": "$server_protocol", '
                     '"body_bytes_sent": $body_bytes_sent, '
                     '"http_referer": "$http_referer", '
                     '"http_user_agent": "$http_user_agent", '
                     '"request_bytes": "$request_length", '
                     '"request_time": "$request_time", '
                     '"upstream_addr": "$upstream_addr", '
                     '"upstream_response_time": "$upstream_response_time", '
                     '"hostname": "$hostname", '
                     '"host": "$host"'
                     '}';

    access_log     syslog_server=unix:/var/run/nginx_log.sock,nohostname,tag=nginx avito_json; #ClickHouse
    error_log      syslog_server=unix:/var/run/nginx_log.sock,nohostname,tag=nginx_error; #ClickHouse

    #access_log  /var/log/nginx/access.log  main;

    proxy_ignore_client_abort on;
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}

Sanal ana bilgisayar bir:

vhost1.conf:

upstream backend {
    server ip-адрес-сервера-с-stub_http_server:8080;
    server ip-адрес-сервера-с-stub_http_server:8080;
    server ip-адрес-сервера-с-stub_http_server:8080;
    server ip-адрес-сервера-с-stub_http_server:8080;
    server ip-адрес-сервера-с-stub_http_server:8080;
}

server {
    listen   80;
    server_name vhost1;
    location / {
        proxy_pass http://backend;
    }
}

/etc/hosts dosyasına sanal ana bilgisayarlar ekleyin:

ip-адрес-сервера-с-nginx vhost1

HTTP sunucusu emülatörü

HTTP sunucusu emülatörü olarak kullanacağız nodejs-taslak-sunucu itibaren Maxim Ignatenko

nodejs-stub-server'ın rpm'si yok. Burada https://github.com/patsevanton/nodejs-stub-server bunun için rpm oluşturun. rpm kullanılarak oluşturulacak fötr şapka

nodejs-stub-server paketini yukarı akış nginx rpm'ye yükleyin

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nodejs-stub-server
yum -y install stub_http_server
systemctl start stub_http_server

Stres testi

Test Apache kıyaslaması kullanılarak gerçekleştirilir.

Yükle:

yum install -y httpd-tools

Apache kıyaslamasını kullanarak 5 farklı sunucudan test etmeye başlıyoruz:

while true; do ab -H "User-Agent: 1server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 2server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 3server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 4server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 5server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done

Grafana'yı ayarlama

Resmi Grafana web sitesinde bir kontrol paneli bulamazsınız.

Bu nedenle bunu elle yapacağız.

Kayıtlı kontrol panelimi bulabilirsiniz burada.

Ayrıca içeriğe sahip bir tablo değişkeni oluşturmanız gerekir. nginx.access_log.
Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Singlestat Toplam İstekler:

SELECT
 1 as t,
 count(*) as c
 FROM $table
 WHERE $timeFilter GROUP BY t

Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Singlestat Başarısız İstekler:

SELECT
 1 as t,
 count(*) as c
 FROM $table
 WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t

Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Singlestat Başarısızlık Yüzdesi:

SELECT
 1 as t, (sum(status = 500 or status = 499)/sum(status = 200 or status = 201 or status = 401))*100 FROM $table
 WHERE $timeFilter GROUP BY t

Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Singlestat Ortalama Yanıt Süresi:

SELECT
 1, avg(request_time) FROM $table
 WHERE $timeFilter GROUP BY 1

Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Singlestat Maksimum Tepki Süresi:

SELECT
 1 as t, max(request_time) as c
 FROM $table
 WHERE $timeFilter GROUP BY t

Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Sayım Durumu:

$columns(status, count(*) as c) from $table

Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Pasta gibi veri çıktısı almak için eklentiyi kurmanız ve grafana'yı yeniden yüklemeniz gerekir.

grafana-cli plugins install grafana-piechart-panel
service grafana-server restart

Pastanın İlk 5 Durumu:

SELECT
    1, /* fake timestamp value */
    status,
    sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5

Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Ayrıca ekran görüntüleri olmadan isteklerde bulunacağım:

http_user_agent'ı sayın:

$columns(http_user_agent, count(*) c) FROM $table

İyi Oran/Kötü Oran:

$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FROM $table

yanıt zamanlaması:

$rate(avg(request_time) as request_time) FROM $table

Yukarı akış yanıt süresi (1. yukarı akışın yanıt süresi):

$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $table

Tüm vhost'lar için Tablo Sayımı Durumu:

$columns(status, count(*) as c) from $table

Kontrol panelinin genel görünümü

Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

avg() ve quantile()'ın karşılaştırılması

ort()
Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı
çeyreklik()
Avito'dan Nginx günlüklerini Clickhouse'a göndermek için Nginx-log-toplayıcı yardımcı programı

Sonuç:

Topluluğun nginx-log-collector'ı geliştirme/test etme ve kullanma sürecine dahil olacağını umuyoruz.
Birisi nginx-log-collector'ı uyguladığında size diskten, RAM'den ve CPU'dan ne kadar tasarruf ettiğini söyleyecektir.

Telgraf kanalları:

Milisaniye:

Milisaniye kimin umurunda, yazın ya da oy verin lütfen, buna konu.

Kaynak: habr.com

Yorum ekle