Artikel ini akan membahas proyek nginx-log-collector , yang akan membaca log nginx dan mengirimkannya ke kluster Clickhouse. Biasanya untuk log gunakan ElasticSearch. Clickhouse membutuhkan lebih sedikit sumber daya (ruang disk, RAM, CPU). Clickhouse merekam data lebih cepat. Clickhouse memampatkan data, membuat data disk lebih padat. Manfaat Clickhouse terlihat dalam 2 slide dari laporan Bagaimana VK memasukkan data ke dalam ClickHouse dari puluhan ribu server.


Untuk melihat analitik log, buat dasbor untuk Grafana.
Siapa peduli, selamat datang ke kucing.
Instal nginx, grafana dengan cara standar.
Instal kluster clickhouse menggunakan playbook yang dimungkinkan oleh Denis Proskurin .
Membuat Database dan Tabel di Clickhouse
File ini menjelaskan kueri SQL untuk membuat database dan tabel untuk nginx-log-collector di Clickhouse.
Kami membuat setiap permintaan secara bergantian pada setiap server kluster Clickhouse.
Catatan penting. Pada baris ini, logs_cluster harus diganti dengan nama kluster Anda dari file clickhouse_remote_servers.xml antara "remote_servers" dan "shard".
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())
Menginstal dan Mengkonfigurasi nginx-log-collector-rpm
Nginx-log-collector tidak memiliki rpm. Di sini https://github.com/patsevanton/nginx-log-collector-rpm buat rpm untuk itu. Rpm akan dikumpulkan menggunakan Fedora Copr
Instal paket rpm nginx-log-collector-rpm
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
Edit config /etc/nginx-log-collector/config.yaml:
....... 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/
Pengaturan nginx
Konfigurasi nginx umum:
user nginx; worker_processes auto;
Tuan rumah virtual adalah satu:
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; } }
Tambahkan host virtual ke file / etc / hosts:
ip----nginx vhost1
Emulator server HTTP
Sebagai emulator server HTTP, kita akan menggunakan nodejs-stub-server dari Maxim Ignatenko
Nodejs-stub-server tidak memiliki rpm. Di sini https://github.com/patsevanton/nodejs-stub-server buat rpm untuk itu. Rpm akan dikumpulkan menggunakan Fedora Copr
Instal paket nodejs-stub-server pada upstream nginx rpm
yum -y install yum-plugin-copr yum copr enable antonpatsev/nodejs-stub-server yum -y install stub_http_server systemctl start stub_http_server
Uji beban
Pengujian dilakukan dengan menggunakan benchmark Apache.
Pasang itu:
yum install -y httpd-tools
Kami mulai menguji menggunakan tolok ukur Apache dari 5 server yang berbeda:
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
Pengaturan Grafana
Di situs web resmi Grafana Anda tidak akan menemukan dasbor.
Karena itu, kami akan menyerahkannya.
Anda dapat menemukan dasbor saya yang disimpan di sini .
Anda juga perlu membuat variabel tabel dengan isi nginx.access_log
.

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

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

Persen Gagal Singlestat:
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

Waktu Respons Rata-Rata Singlestat:
SELECT 1, avg(request_time) FROM $table WHERE $timeFilter GROUP BY 1

Singlestat Max Response Time:
SELECT 1 as t, max(request_time) as c FROM $table WHERE $timeFilter GROUP BY t

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

Untuk menampilkan data sebagai kue, Anda perlu menginstal plugin dan memulai kembali grafana.
grafana-cli plugins install grafana-piechart-panel service grafana-server restart
Pie TOP 5 Status:
SELECT 1, status, sum(status) AS Reqs FROM $table WHERE $timeFilter GROUP BY status ORDER BY Reqs desc LIMIT 5

Selanjutnya saya akan memberikan permintaan tanpa tangkapan layar:
Hitung http_user_agent:
$columns(http_user_agent, count(*) c) FROM $table
GoodRate / BadRate:
$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FROM $table
Waktu Tanggapan:
$rate(avg(request_time) as request_time) FROM $table
Waktu respons hulu (waktu respons hulu ke-1):
$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $table
Tabel Tabel Status untuk semua vhost:
$columns(status, count(*) as c) from $table
Tampilan umum dasbor



Membandingkan avg () dan quantile ()
rata-rata ()

quantile ()

Kesimpulan:
Semoga komunitas terlibat dalam pengembangan / pengujian dan penggunaan nginx-log-collector.
Dan seseorang, ketika dia mengimplementasikan nginx-log-collector, akan memberi tahu Anda seberapa banyak ia menyelamatkan disk, RAM, CPU.
Saluran telegram:
Milidetik:
Kepada siapa milidetik itu penting, tulis atau pilih, dalam edisi ini.