Alexey Lizunov, a leader in the Competence Center for Remote Service Channels of the IT Directorate at MKB

As an alternative to the ELK stack (ElasticSearch, Logstash, Kibana), we are conducting research on using ClickHouse DB as a data storage solution for logs.
In this article, we would like to share our experience with ClickHouse DB and the preliminary results from the pilot operation. It should be noted that the results are impressive.

Next, we will describe in detail how our system is configured and its components. But first, we would like to discuss this DB in general and why it deserves attention. ClickHouse DB is a high-performance analytical columnar database from Yandex. It is used in Yandex services and originally served as the primary data storage for Yandex.Metrica. It is open-source and free. As a developer, I have always been curious about how they implemented it, given the fantastically large amounts of data. The Yandex.Metrica user interface is very flexible and works quickly. Upon first acquaintance with this DB, the impression is: 'Finally! Done for the people!' Starting from the installation process to sending queries.
This DB has a very low entry threshold. Even a developer of average qualification can install it in a few minutes and start using it. Everything works smoothly. Even people who are not very familiar with Linux can quickly manage the installation and perform basic operations. Previously, when hearing about Big Data, Hadoop, Google BigTable, HDFS, an average developer might have thought it involved some terabytes or petabytes, believing that only superhumans could configure and develop for these systems. However, with the emergence of ClickHouse DB, we now have a simple and accessible tool with which we can solve previously unattainable tasks. All it takes is one fairly average machine and five minutes for installation. In other words, we have a database like MySQL, but designed for storing billions of records! A kind of super archiver with SQL language. Itâs as if people have been handed alien weaponry.
About our log collection system
Az informĂĄciĂłgyƱjtĂ©shez az IIS webalkalmazĂĄsok standard formĂĄtumĂș naplĂłfĂĄjljait hasznĂĄljuk (jelenleg a naplĂłk parsingjĂĄn is dolgozunk, de a pilot ĂŒzemeltetĂ©s fĂĄzisĂĄban a fĆ cĂ©lunk az IIS naplĂłk gyƱjtĂ©se).
Teljes mĂ©rtĂ©kben az ELK stacktĆl nem tudtunk megszabadulni kĂŒlönbözĆ okok miatt, Ă©s tovĂĄbbra is hasznĂĄljuk a LogStash Ă©s Filebeat komponenseit, amelyek jĂłl bevĂĄltak Ă©s megbĂzhatĂłan dolgoznak.
A naplózås åltalånos sémåja az alåbbi åbrån låtható.

A ClickHouse adatbĂĄzisba törtĂ©nĆ adatbejegyzĂ©sek sajĂĄtossĂĄga, hogy ritkĂĄn (mĂĄsodpercenkĂ©nt egyszer) nagy adagokban hajtjĂĄk vĂ©gre a bejegyzĂ©seket. Ez lĂĄthatĂłan a legproblĂ©mĂĄsabb rĂ©sz, amellyel a ClickHouse adatbĂĄzissal valĂł elsĆ tapasztalat sorĂĄn talĂĄlkozik az ember: a sĂ©ma kissĂ© bonyolultabbĂĄ vĂĄlik.
Ebben nagy segĂtsĂ©get nyĂșjtott a LogStash plugin, amely közvetlenĂŒl adatokat illeszt be a ClickHouse-ba. Ezt az összetevĆt ugyanazon a szerveren kell telepĂteni, mint az adatbĂĄzis. Ăgy, mondhatni, ezt nem ajĂĄnlott megtenni, de gyakorlati szempontbĂłl, hogy ne kelljen kĂŒlön szervereket lĂ©trehozni, addig is, amĂg ez ugyanazon a szerveren van telepĂtve. Nem tapasztaltunk leĂĄllĂĄsokat vagy erĆforrĂĄskonfliktusokat az adatbĂĄzissal. TovĂĄbbĂĄ fontos megjegyezni, hogy a plugin rendelkezik egy hibakezelĆ mechanizmussal, amely megprĂłbĂĄlja Ășjra a hibĂĄs bejegyzĂ©seket. HibĂĄk esetĂ©n a plugin egy adathalmazt Ăr a lemezre, amelyet nem sikerĂŒlt beilleszteni (a fĂĄjlformĂĄtum kĂ©nyelmes: javĂtĂĄs utĂĄn könnyen Ășjra beilleszthetĆ a korrigĂĄlt halmaz a clickhouse-client segĂtsĂ©gĂ©vel).
A hasznĂĄlt szoftverek teljes listĂĄjĂĄt az alĂĄbbi tĂĄblĂĄzat tartalmazza.
A hasznĂĄlt szoftverek listĂĄja
Név
LeĂrĂĄs
Link a disztribĂșciĂłhoz
NGINX
Reverse proxy a portkorlĂĄtozĂĄs Ă©s az azonosĂtĂĄs szervezĂ©sĂ©hez
Jelenleg nem alkalmazzåk a sémåban
FileBeat
FĂĄjlok naplĂłinak ĂĄtadĂĄsa.
(Windows 64bit disztribĂșciĂł).
LogStash
NaplĂłgyƱjtĆ.
Hasznåljåk a FileBeat naplók gyƱjtésére, valamint a RabbitMQ sorból szårmazó naplók gyƱjtésére (a DMZ-ben talålható szerverek szåmåra).
Logstash-output-clickhouse
A Logstash plugin a naplók nagyadagokban való åtvitelére a ClickHouse adatbåzisba.
/usr/share/logstash/bin/logstash-plugin install logstash-output-clickhouse
/usr/share/logstash/bin/logstash-plugin install logstash-filter-prune
/usr/share/logstash/bin/logstash-plugin install logstash-filter-multiline
clickhousedb_fdw
NaplĂłarchĂvum
MegjegyzĂ©s: 2018 augusztusĂĄtĂłl a Yandex repozitĂłriumĂĄban megjelentek a ânormĂĄlisâ rpm csomagok a RHEL-hez, Ăgy Ă©rdemes kiprĂłbĂĄlni Ćket. TelepĂtĂ©skor az Altinity ĂĄltal kĂ©szĂtett csomagokat hasznĂĄltuk.
GrafanĂĄba
A naplĂłk vizualizĂĄlĂĄsa. Dashbordok beĂĄllĂtĂĄsa
Redhat & Centos (64 bit) â legĂșjabb verziĂł
ClickHouse adatforrĂĄs a Grafana 4.6+ verziĂłhoz
Grafana plugin a ClickHouse adatforrĂĄssal
LogStash
A filebeat log router to RabbitMQ.
Note. Unfortunately, Filebeat does not have direct output to RabbitMQ, so an intermediate link in the form of Logstash is required.
RabbitMQ
Message queue. This is a buffer for log entries in the DMZ.
Erlang Runtime (Required for RabbitMQ)
Erlang Runtime. Required for RabbitMQ operation.
The server configuration with ClickHouse DB is presented in the following table:
Név
Value
Megjegyzés
KonfigurĂĄciĂł
HDD: 40GB
RAM: 8GB
Processor: Core 2 2Ghz
It is important to pay attention to the recommendations for using ClickHouse DB ()
System Software
OS: Red Hat Enterprise Linux Server (Maipo)
JRE (Java 8)
Â
As you can see, this is a regular workstation.
The structure of the table for storing logs is as follows:
log_web.sql
CREATE TABLE log_web (
logdate Date,
logdatetime DateTime CODEC(Delta, LZ4HC),
fld_log_file_name LowCardinality( String ),
fld_server_name LowCardinality( String ),
fld_app_name LowCardinality( String ),
fld_app_module LowCardinality( String ),
fld_website_name LowCardinality( String ),
serverIP LowCardinality( String ),
method LowCardinality( String ),
uriStem String,
uriQuery String,
port UInt32,
username LowCardinality( String ),
clientIP String,
clientRealIP String,
userAgent String,
referer String,
response String,
subresponse String,
win32response String,
timetaken UInt64
, uriQuery__utm_medium String
, uriQuery__utm_source String
, uriQuery__utm_campaign String
, uriQuery__utm_term String
, uriQuery__utm_content String
, uriQuery__yclid String
, uriQuery__region String
) Engine = MergeTree()
PARTITION BY toYYYYMM(logdate)
ORDER BY (fld_app_name, fld_app_module, logdatetime)
SETTINGS index_granularity = 8192;We use default values for partitioning (by months) and index granularity. All fields largely correspond to IIS log records for HTTP request logging. Notably, separate fields are designated for storing UTM tags (they are parsed during the insertion stage from the query string field).
Also, several system fields have been added to the table to store information about systems, components, and servers. Details of these fields are provided below in the table. In one table, we store logs for several systems.
Név
LeĂrĂĄs
tĂĄmadĂĄsra
fld_app_name
Application/System Name
Allowed values:
- site1.domain.com External site 1
- site2.domain.com External site 2
- internal-site1.domain.local Internal site 1
site1.domain.com
fld_app_module
System Module
Allowed values:
- web â Website
- svc â Website web service
- intgr â Integration web service
- bo â Admin panel (BackOffice)
szolgåltatås szeretne hozzåférni egy
fld_website_name
Website Name in IIS
Multiple systems, or even several instances of a single system module, can be deployed on one server.
web-main
fld_server_name
Server Name
web1.domain.com
fld_log_file_name
Path to the log file on the server
C:inetpublogsLogFiles
W3SVC1u_ex190711.log
Ez lehetĆvĂ© teszi a grafikonok hatĂ©kony felĂ©pĂtĂ©sĂ©t a GrafanĂĄban. PĂ©ldĂĄul a konkrĂ©t rendszer front-endjĂ©bĆl szĂĄrmazĂł lekĂ©rdezĂ©sek megtekintĂ©sĂ©t. Ez hasonlĂt a Yandex.Metrica weboldal-olvasĂłjĂĄhoz.
Itt van nĂ©hĂĄny statisztika az adatbĂĄzis hasznĂĄlatĂĄrĂłl az elmĂșlt kĂ©t hĂłnapban.
Rekordok szåma rendszerek és azok komponensei szerint
SELECT
fld_app_name,
fld_app_module,
count(fld_app_name) AS rows_count
FROM log_web
GROUP BY
fld_app_name,
fld_app_module
WITH TOTALS
ORDER BY
fld_app_name ASC,
rows_count DESC
ââfld_app_nameââââââŹâfld_app_moduleââŹârows_countââ
â site1.domain.hu â web â 131441 â
â site2.domain.hu â web â 1751081 â
â site3.domain.hu â web â 106887543 â
â site3.domain.hu â svc â 44908603 â
â site3.domain.hu â intgr â 9813911 â
â site4.domain.hu â web â 772095 â
â site5.domain.hu â web â 17037221 â
â site5.domain.hu â intgr â 838559 â
â site5.domain.hu â bo â 7404 â
â site6.domain.hu â web â 595877 â
â site7.domain.hu â web â 27778858 â
ââââââââââââââââââââŽâââââââââââââââââŽâââââââââââââ
Totals:
ââfld_app_nameââŹâfld_app_moduleââŹârows_countââ
â â â 210522593 â
ââââââââââââââââŽâââââââââââââââââŽâââââââââââââ
11 rows in set. Elapsed: 4.874 sec. Processed 210.52 million rows, 421.67 MB (43.19 million rows/s., 86.51 MB/s.)Az adatok mérete a lemezen
SELECT
formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed,
formatReadableSize(sum(data_compressed_bytes)) AS compressed,
sum(rows) AS total_rows
FROM system.parts
WHERE table = 'log_web'
ââuncompressedââŹâcompressedââŹâtotal_rowsââ
â 54.50 GiB â 4.86 GiB â 211427094 â
ââââââââââââââââŽâââââââââââââŽâââââââââââââ
1 rows in set. Elapsed: 0.035 sec.Az adatok tömörĂtĂ©si arĂĄnya az oszlopokban
VĂLASZ
név,
formĂĄzottOlvashatĂłMĂ©ret(data_uncompressed_bytes) AS kiNemTömörĂtett,
formĂĄzottOlvashatĂłMĂ©ret(data_compressed_bytes) AS tömörĂtett,
data_uncompressed_bytes / data_compressed_bytes AS tömörĂtĂ©si_arĂĄny
FROM system.columns
WHERE table = 'log_web'
âânĂ©vâââââââââââââââââââââŹâkiNemTömörĂtettââŹâtömörĂtettââŹâââââtömörĂtĂ©si_arĂĄnyââ
â logdate â 401.53 MiB â 1.80 MiB â 223.16665968777315 â
â logdatetime â 803.06 MiB â 35.91 MiB â 22.363966401202305 â
â fld_log_file_name â 220.66 MiB â 2.60 MiB â 84.99905736932571 â
â fld_server_name â 201.54 MiB â 50.63 MiB â 3.980924816977078 â
â fld_app_name â 201.17 MiB â 969.17 KiB â 212.55518183686877 â
â fld_app_module â 201.17 MiB â 968.60 KiB â 212.67805817411906 â
â fld_website_name â 201.54 MiB â 1.24 MiB â 162.7204926761546 â
â serverIP â 201.54 MiB â 50.25 MiB â 4.010824061219731 â
â method â 201.53 MiB â 43.64 MiB â 4.617721053304486 â
â uriStem â 5.13 GiB â 832.51 MiB â 6.311522291936919 â
â uriQuery â 2.58 GiB â 501.06 MiB â 5.269731450124478 â
â port â 803.06 MiB â 3.98 MiB â 201.91673864241824 â
â username â 318.08 MiB â 26.93 MiB â 11.812513794583598 â
â clientIP â 2.35 GiB â 82.59 MiB â 29.132328640073343 â
â clientRealIP â 2.49 GiB â 465.05 MiB â 5.478382297052563 â
â userAgent â 18.34 GiB â 764.08 MiB â 24.57905114484208 â
â referer â 14.71 GiB â 1.37 GiB â 10.736792723669906 â
â response â 803.06 MiB â 83.81 MiB â 9.582334090987247 â
â subresponse â 399.87 MiB â 1.83 MiB â 218.4831068635027 â
â win32response â 407.86 MiB â 7.41 MiB â 55.050315514606815 â
â timetaken â 1.57 GiB â 402.06 MiB â 3.9947395692010637 â
â uriQuery__utm_medium â 208.17 MiB â 12.29 MiB â 16.936148912472955 â
â uriQuery__utm_source â 215.18 MiB â 13.00 MiB â 16.548367623199912 â
â uriQuery__utm_campaign â 381.46 MiB â 37.94 MiB â 10.055156353418509 â
â uriQuery__utm_term â 231.82 MiB â 10.78 MiB â 21.502540454070672 â
â uriQuery__utm_content â 441.34 MiB â 87.60 MiB â 5.038260760449327 â
â uriQuery__yclid â 216.88 MiB â 16.58 MiB â 13.07721335008116 â
â uriQuery__region â 204.35 MiB â 9.49 MiB â 21.52661903446796 â
ââââââââââââââââââââââââââŽââââââââââââââââââŽâââââââââââââŽâââââââââââââââââââââ
28 sor talĂĄlhatĂł az eredmĂ©nyben. Elapsed: 0.005 sec.A felhasznĂĄlt összetevĆk leĂrĂĄsa
FileBeat. FĂĄjlnaplĂłk tovĂĄbbĂtĂĄsa
Ez az összetevĆ figyelemmel kĂsĂ©ri a lemeznaplĂłk fĂĄjljaiban bekövetkezĆ vĂĄltozĂĄsokat, Ă©s az informĂĄciĂłkat ĂĄtkonvertĂĄlja a LogStash-be. Minden olyan szerveren telepĂtve van, ahol naplĂłfĂĄjlok kĂ©szĂŒlnek (ĂĄltalĂĄban IIS). Tail mĂłdban mƱködik (azaz csak az Ășjonnan hozzĂĄadott bejegyzĂ©seket tovĂĄbbĂtja a fĂĄjlba). De kĂŒlön is beĂĄllĂthatĂł teljes fĂĄjlok tovĂĄbbĂtĂĄsĂĄra. Ez kĂ©nyelmes, ha az elĆzĆ hĂłnapok adatait kell betölteni. EgyszerƱen helyezze a naplĂłfĂĄjlt egy mappĂĄba, Ă©s az automatikusan teljes egĂ©szĂ©ben elolvassa.
A szolgĂĄltatĂĄs leĂĄllĂtĂĄsakor az adatok tovĂĄbbitĂĄsa leĂĄll a tĂĄrolĂłba.
A konfigurĂĄciĂł pĂ©ldĂĄul a következĆkĂ©ppen nĂ©z ki:
filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- C:/inetpub/logs/LogFiles/W3SVC1/*.log
exclude_files: ['.gz$','.zip$']
tail_files: true
ignore_older: 24h
fields:
fld_server_name: "site1.domain.hu"
fld_app_name: "site1.domain.hu"
fld_app_module: "web"
fld_website_name: "web-main"
- type: log
enabled: true
paths:
- C:/inetpub/logs/LogFiles/__Import/access_log-*
exclude_files: ['.gz$','.zip$']
tail_files: false
fields:
fld_server_name: "site2.domain.hu"
fld_app_name: "site2.domain.hu"
fld_app_module: "web"
fld_website_name: "web-main"
fld_logformat: "logformat__apache"
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
reload.period: 2s
output.logstash:
hosts: ["log.domain.com:5044"]
ssl.enabled: true
ssl.certificate_authorities: ["C:/filebeat/certs/ca.pem", "C:/filebeat/certs/ca-issuing.pem"]
ssl.certificate: "C:/filebeat/certs/site1.domain.hu.cer"
ssl.key: "C:/filebeat/certs/site1.domain.hu.key"
#================================ Processors =====================================
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~LogStash. NaplĂłgyƱjtĆ
Ez az összetevĆ a FileBeat-tĆl (vagy a RabbitMQ soron keresztĂŒl) Ă©rkezĆ naplĂłbejegyzĂ©sek fogadĂĄsĂĄra, elemzĂ©sĂ©re Ă©s tömeges adatbĂĄzisba törtĂ©nĆ beszĂșrĂĄsra szolgĂĄl ClickHouse-ba.
A ClickHouse-ba valĂł beszĂșrĂĄshoz a Logstash-output-clickhouse bĆvĂtmĂ©nyt hasznĂĄljuk. A Logstash bĆvĂtmĂ©ny rendelkezik kĂ©rĂ©sretry mechanizmussal, de normĂĄl leĂĄllĂtĂĄs esetĂ©n jobb, ha magĂĄt a szolgĂĄltatĂĄst is leĂĄllĂtjuk. LeĂĄllĂtĂĄskor ĂŒzenetek halmozĂłdnak fel a RabbitMQ sorban, ezĂ©rt ha a leĂĄllĂĄs hosszĂș ideig tart, akkor jobban teszi, ha leĂĄllĂtja a Filebeat-eket a szervereken. Abban a sĂ©mĂĄban, ahol nem hasznĂĄlunk RabbitMQ-t (a helyi hĂĄlĂłzaton a Filebeat közvetlenĂŒl kĂŒldi a naplĂłkat a Logstash-ba), a Filebeat-ek megfelelöen Ă©s biztonsĂĄgosan mƱködnek, ezĂ©rt szĂĄmukra a kimenet elĂ©rhetetlensĂ©ge következmĂ©nyek nĂ©lkĂŒl mĂșlik el.
A konfigurĂĄciĂł pĂ©ldĂĄul a következĆkĂ©ppen nĂ©z ki:
log_web__filebeat_clickhouse.conf
input {
beats {
port => 5044
type => 'iis'
ssl => true
ssl_certificate_authorities => ["/etc/logstash/certs/ca.cer", "/etc/logstash/certs/ca-issuing.cer"]
ssl_certificate => "/etc/logstash/certs/server.cer"
ssl_key => "/etc/logstash/certs/server-pkcs8.key"
ssl_verify_mode => "peer"
add_field => {
"fld_server_name" => "%{[fields][fld_server_name]}"
"fld_app_name" => "%{[fields][fld_app_name]}"
"fld_app_module" => "%{[fields][fld_app_module]}"
"fld_website_name" => "%{[fields][fld_website_name]}"
"fld_log_file_name" => "%{source}"
"fld_logformat" => "%{[fields][fld_logformat]}"
}
}
rabbitmq {
host => "queue.domain.com"
port => 5671
user => "q-reader"
password => "password"
queue => "web_log"
heartbeat => 30
durable => true
ssl => true
#ssl_certificate_path => "/etc/logstash/certs/server.p12"
#ssl_certificate_password => "password"
add_field => {
"fld_server_name" => "%{[fields][fld_server_name]}"
"fld_app_name" => "%{[fields][fld_app_name]}"
"fld_app_module" => "%{[fields][fld_app_module]}"
"fld_website_name" => "%{[fields][fld_website_name]}"
"fld_log_file_name" => "%{source}"
"fld_logformat" => "%{[fields][fld_logformat]}"
}
}
}
filter {
if [message] =~ "^#" {
drop {}
}
if [fld_logformat] == "logformat__iis_with_xrealip" {
grok {
match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{IP:serverIP} %{WORD:method} %{NOTSPACE:uriStem} %{NOTSPACE:uriQuery} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clientIP} %{NOTSPACE:userAgent} %{NOTSPACE:referer} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:win32response} %{NUMBER:timetaken} %{NOTSPACE:xrealIP} %{NOTSPACE:xforwarderfor}"]
}
} else {
grok {
match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{IP:serverIP} %{WORD:method} %{NOTSPACE:uriStem} %{NOTSPACE:uriQuery} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clientIP} %{NOTSPACE:userAgent} %{NOTSPACE:referer} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:win32response} %{NUMBER:timetaken}"]
}
}
date {
match => [ "log_timestamp", "YYYY-MM-dd HH:mm:ss" ]
timezone => "Etc/UTC"
remove_field => [ "log_timestamp", "@timestamp" ]
target => [ "log_timestamp2" ]
}
ruby {
code => "tstamp = event.get('log_timestamp2').to_i
event.set('logdatetime', Time.at(tstamp).strftime('%Y-%m-%d %H:%M:%S'))
event.set('logdate', Time.at(tstamp).strftime('%Y-%m-%d'))"
}
if [bytesSent] {
ruby {
code => "event['kilobytesSent'] = event['bytesSent'].to_i / 1024.0"
}
}
if [bytesReceived] {
ruby {
code => "event['kilobytesReceived'] = event['bytesReceived'].to_i / 1024.0"
}
}
ruby {
code => "event.set('clientRealIP', event.get('clientIP'))"
}
if [xrealIP] {
ruby {
code => "event.set('clientRealIP', event.get('xrealIP'))"
}
}
if [xforwarderfor] {
ruby {
code => "event.set('clientRealIP', event.get('xforwarderfor'))"
}
}
mutate {
convert => ["bytesSent", "integer"]
convert => ["bytesReceived", "integer"]
convert => ["timetaken", "integer"]
convert => ["port", "integer"]
add_field => {
"clientHostname" => "%{clientIP}"
}
}
useragent {
source => "useragent"
prefix => "browser"
}
kv {
source => "uriQuery"
prefix => "uriQuery__"
allow_duplicate_values => false
field_split => "&"
include_keys => [ "utm_medium", "utm_source", "utm_campaign", "utm_term", "utm_content", "yclid", "region" ]
}
mutate {
join => { "uriQuery__utm_source" => "," }
join => { "uriQuery__utm_medium" => "," }
join => { "uriQuery__utm_campaign" => "," }
join => { "uriQuery__utm_term" => "," }
join => { "uriQuery__utm_content" => "," }
join => { "uriQuery__yclid" => "," }
join => { "uriQuery__region" => "," }
}
}
output {
#stdout {codec => rubydebug}
clickhouse {
headers => ["Authorization", "Basic abcdsfks..."]
http_hosts => ["http://127.0.0.1:8123"]
save_dir => "/etc/logstash/tmp"
table => "log_web"
request_tolerance => 1
flush_size => 10000
idle_flush_time => 1
mutations => {
"fld_log_file_name" => "fld_log_file_name"
"fld_server_name" => "fld_server_name"
"fld_app_name" => "fld_app_name"
"fld_app_module" => "fld_app_module"
"fld_website_name" => "fld_website_name"
"logdatetime" => "logdatetime"
"logdate" => "logdate"
"serverIP" => "serverIP"
"method" => "method"
"uriStem" => "uriStem"
"uriQuery" => "uriQuery"
"port" => "port"
"username" => "username"
"clientIP" => "clientIP"
"clientRealIP" => "clientRealIP"
"userAgent" => "userAgent"
"referer" => "referer"
"response" => "response"
"subresponse" => "subresponse"
"win32response" => "win32response"
"timetaken" => "timetaken"
"uriQuery__utm_medium" => "uriQuery__utm_medium"
"uriQuery__utm_source" => "uriQuery__utm_source"
"uriQuery__utm_campaign" => "uriQuery__utm_campaign"
"uriQuery__utm_term" => "uriQuery__utm_term"
"uriQuery__utm_content" => "uriQuery__utm_content"
"uriQuery__yclid" => "uriQuery__yclid"
"uriQuery__region" => "uriQuery__region"
}
}
}pipelines.yml
# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
# https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
- pipeline.id: log_web__filebeat_clickhouse
path.config: "/etc/logstash/log_web__filebeat_clickhouse.conf"ClickHouse. NaplĂłzĂĄsi tĂĄrolĂł
Minden rendszer naplĂłja egy tĂĄblĂĄba kerĂŒl mentĂ©sre (lĂĄsd a cikk elejĂ©n). Ez a tĂĄblĂĄzat a kĂ©rĂ©sinformĂĄciĂłk tĂĄrolĂĄsĂĄra szolgĂĄl: minden paramĂ©ter hasonlĂł a kĂŒlönbözĆ formĂĄtumokhoz, pĂ©ldĂĄul IIS, Apache Ă©s Nginx naplĂłk esetĂ©ben. Az alkalmazĂĄsok naplĂłihoz, amelyek pĂ©ldĂĄul hibĂĄkat, informĂĄciĂłs ĂŒzeneteket, figyelmeztetĂ©seket rögzĂtenek, kĂŒlön tĂĄblĂĄzat lesz lĂ©trehozva a megfelelĆ struktĂșrĂĄval (jelenleg tervezĂ©s alatt ĂĄll).
A tĂĄblĂĄzat tervezĂ©se sorĂĄn nagyon fontos meghatĂĄrozni az elsĆdleges kulcsot (amely alapjĂĄn az adatok rendezĂ©sre kerĂŒlnek a tĂĄrolĂĄskor). Ez hatĂĄssal van az adatok tömörĂtĂ©sĂ©nek mĂ©rtĂ©kĂ©re Ă©s a lekĂ©rdezĂ©sek sebessĂ©gĂ©re. PĂ©ldĂĄnkban a kulcs a következĆ:
ORDER BY (fld_app_name, fld_app_module, logdatetime)
TehĂĄt a rendszer neve, a rendszer komponensĂ©nek neve Ă©s az esemĂ©ny idĆpontja szerint. Kezdetben az esemĂ©ny idĆpontja volt az elsĆ helyen. MiutĂĄn ezt az utolsĂł helyre költöztettĂŒk, a lekĂ©rdezĂ©sek körĂŒlbelĂŒl kĂ©tszer gyorsabban futottak. Az elsĆdleges kulcs mĂłdosĂtĂĄsa Ășjra kell lĂ©trehozni a tĂĄblĂĄt Ă©s Ășjra kell tölteni az adatokat, hogy a ClickHouse Ășjrarendezze az adatokat a lemezen. Ez egy nehĂ©z mƱvelet, ezĂ©rt Ă©rdemes elĆre gondolkodni arrĂłl, hogy mi tartozik a rendezĂ©si kulcsba.
Meg kell jegyezni, hogy a legĂșjabb verziĂłkban megjelent a LowCardinality adat tĂpusa. Ennek hasznĂĄlatĂĄval drĂĄmaian csökkenthetĆ a tömörĂtett adatok mĂ©rete az alacsony kardinalitĂĄsĂș (kevĂ©s opciĂłval rendelkezĆ) mezĆk esetĂ©ben.
Jelenleg a 19.6-os verziĂłt hasznĂĄljuk, Ă©s tervezzĂŒk, hogy frissĂtjĂŒk a legĂșjabb verziĂłra. Ezekben csodĂĄlatos funkciĂłk jelentek meg, mint pĂ©ldĂĄul az AdaptĂv GranularitĂĄs, a KihagyĂĄsos indexek Ă©s a DoubleDelta kĂłdolĂĄs.
AlapĂ©rtelmezĂ©s szerint a telepĂtĂ©s sorĂĄn a konfigurĂĄciĂłban a trace szint van beĂĄllĂtva. A naplĂłk forgatĂłdnak Ă©s archivĂĄlĂłdnak, de közben akĂĄr gigabĂĄjtokra is bĆvĂŒlhetnek. Ha nincs szĂŒksĂ©g rĂĄ, beĂĄllĂthatĂł a warning szint, amivel a naplĂł mĂ©rete jelentĆsen csökken. A naplĂłzĂĄs beĂĄllĂtĂĄsa a config.xml fĂĄjlban törtĂ©nik:
<!-- Lehetséges szintek: https://github.com/pocoproject/poco/blob/develop/Foundation/include/Poco/Logger.h#L105 -->
<level>warning</level>Néhåny hasznos parancs
Mivel az eredeti telepĂtĆcsomagok Debian alapjĂĄn kĂ©szĂŒlnek, mĂĄs Linux verziĂłkhoz az Altinity ĂĄltal kĂ©szĂŒlt csomagokat kell hasznĂĄlni.
Itt talĂĄlhatĂł egy ĂștmutatĂł a repĂłjukra mutatĂł linkekkel: https://www.altinity.com/blog/2017/12/18/logstash-with-clickhouse
sudo yum search clickhouse-server
sudo yum install clickhouse-server.noarch
1. az ĂĄllapot ellenĆrzĂ©se
sudo systemctl status clickhouse-server
2. a szerver leĂĄllĂtĂĄsa
sudo systemctl stop clickhouse-server
3. a szerver indĂtĂĄsa
sudo systemctl start clickhouse-server
Futtatås a lekérdezések végrehajtåsåra többsoros módban (a ";" utåni végrehajtås)
clickhouse-client --multiline
clickhouse-client --multiline --host 127.0.0.1 --password pa55w0rd
clickhouse-client --multiline --host 127.0.0.1 --port 9440 --secure --user default --password pa55w0rd
A Logstash ClickHouse pluginje hiba esetén az összes csomagot egy fåjlba menti: /tmp/log_web_failed.json
Ezt a fĂĄjlt manuĂĄlisan kijavĂthatjuk, Ă©s megprĂłbĂĄlhatjuk felölteni a DB-be:
clickhouse-client --host 127.0.0.1 --password password --query="INSERT INTO log_web FORMAT JSONEachRow" < /tmp/log_web_failed__fixed.json
sudo mv /etc/logstash/tmp/log_web_failed.json /etc/logstash/tmp/log_web_failed__fixed.json
sudo chown user_dev /etc/logstash/tmp/log_web_failed__fixed.json
sudo clickhouse-client --host 127.0.0.1 --password password --query="INSERT INTO log_web FORMAT JSONEachRow" < /etc/logstash/tmp/log_web_failed__fixed.json
sudo mv /etc/logstash/tmp/log_web_failed__fixed.json /etc/logstash/tmp/log_web_failed__fixed_.json
kilépés a parancssorból
quit;
## TLS beĂĄllĂtĂĄs
https://www.altinity.com/blog/2019/3/5/clickhouse-networking-part-2
openssl s_client -connect log.domain.com:9440 < /dev/nullLogStash. A FileBeat log routere RabbitMQ sorba
Ez az összetevĆ a FileBeat-tĆl Ă©rkezĆ logok RabbitMQ sorba törtĂ©nĆ irĂĄnyĂtĂĄsĂĄra szolgĂĄl. KĂ©t dolog van itt:
- Sajnos a FileBeat nem rendelkezik output plugin-nel az adatok közvetlen kiĂrĂĄsĂĄhoz RabbitMQ-ba. A Githubon talĂĄlhatĂł hibajegyek alapjĂĄn ez a funkciĂł nem tervezett. Van plugin Kafka-hoz, de bizonyos okok miatt ezt nem hasznĂĄlhatjuk.
- KövetelmĂ©nyek vannak a logok DMZ-ben törtĂ©nĆ gyƱjtĂ©sĂ©re. Ezek alapjĂĄn a logok elĆször egy sorba kerĂŒlnek, majd a LogStash kĂvĂŒlrĆl olvassa a sorbejegyzĂ©seket.
EzĂ©rt a DMZ-ben elhelyezett szerverek esetĂ©ben egy kicsit bonyolultabb rendszert kell alkalmazni. A konfigurĂĄciĂł pĂ©ldĂĄul Ăgy nĂ©z ki:
iis_w3c_logs__filebeat_rabbitmq.conf
input {
beats {
port => 5044
type => 'iis'
ssl => true
ssl_certificate_authorities => ["/etc/pki/tls/certs/app/ca.pem", "/etc/pki/tls/certs/app/ca-issuing.pem"]
ssl_certificate => "/etc/pki/tls/certs/app/queue.domain.com.cer"
ssl_key => "/etc/pki/tls/certs/app/queue.domain.com-pkcs8.key"
ssl_verify_mode => "peer"
}
}
output {
#stdout {codec => rubydebug}
rabbitmq {
host => "127.0.0.1"
port => 5672
exchange => "monitor.direct"
exchange_type => "direct"
key => "%{[fields][fld_app_name]}"
user => "q-writer"
password => "password"
ssl => false
}
}RabbitMQ. Ăzenetsor
Ez a komponens a DMZ-ben lĂ©vĆ naplĂłbejegyzĂ©sek pufferelĂ©sĂ©re szolgĂĄl. A bejegyzĂ©s a Filebeat â LogStash kapcsolaton keresztĂŒl törtĂ©nik. Az olvasĂĄs kĂvĂŒlrĆl, a DMZ-bĆl a LogStash ĂĄltal törtĂ©nik. A RabbitMQ-n keresztĂŒli hasznĂĄlat sorĂĄn körĂŒlbelĂŒl 4000 ĂŒzenetet dolgoz fel mĂĄsodpercenkĂ©nt.
Az ĂŒzenetek irĂĄnyĂtĂĄsa a rendszer neve alapjĂĄn van beĂĄllĂtva, azaz a FileBeat konfigurĂĄciĂłs adatainak alapjĂĄn. Minden ĂŒzenet egy sorba kerĂŒl. Ha bĂĄrmilyen okbĂłl leĂĄll a sorozatszolgĂĄltatĂĄs, az nem eredmĂ©nyez ĂŒzenetvesztĂ©st: a FileBeat hibĂĄt fog kapni a kapcsolatban, Ă©s ideiglenesen leĂĄllĂtja a kĂŒldĂ©st. A LogStash, ami a sorbĂłl olvas, szintĂ©n hĂĄlĂłzati hibĂĄkat fog kapni Ă©s vĂĄrni fog, amĂg a kapcsolat helyreĂĄll. Az adatok termĂ©szetesen nem fognak beĂrĂłdni az adatbĂĄzisba ebben az idĆszakban.
A következĆ utasĂtĂĄsok a sorok lĂ©trehozĂĄsĂĄra Ă©s beĂĄllĂtĂĄsĂĄra szolgĂĄlnak:
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin declare exchange --vhost=/ name=monitor.direct type=direct sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin declare queue --vhost=/ name=web_log durable=true
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin --vhost="/" declare binding source="monitor.direct" destination_type="queue" destination="web_log" routing_key="site1.domain.ru"
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin --vhost="/" declare binding source="monitor.direct" destination_type="queue" destination="web_log" routing_key="site2.domain.ru"Grafana. IrĂĄnyĂtĂłpultok
Ez a komponens a megfigyelĂ©si adatok vizualizĂĄlĂĄsĂĄra szolgĂĄl. Ehhez telepĂteni kell a ClickHouse datasource for Grafana 4.6+ plugint. Kicsit mĂłdosĂtanunk kellett rajta, hogy javĂtsuk az SQL-szƱrĆk feldolgozĂĄsĂĄnak hatĂ©konysĂĄgĂĄt az irĂĄnyĂtĂłpulton.
PĂ©ldĂĄul, a vĂĄltozĂłkat hasznĂĄljuk, Ă©s ha nincsenek megadva a szƱrĆmezĆben, akkor szeretnĂ©nk, ha nem generĂĄlna olyan feltĂ©telt a WHERE zĂĄradĂ©kban, mint ( uriStem = » AND uriStem != » ). Ebben az esetben a ClickHouse olvasni fogja az uriStem oszlopot. ĂsszessĂ©gĂ©ben kĂŒlönbözĆ lehetĆsĂ©geket prĂłbĂĄltunk ki, Ă©s vĂ©gĂŒl mĂłdosĂtottuk a plugint (makrĂł $valueIfEmpty), hogy ĂŒres Ă©rtĂ©k esetĂ©n 1-et adjon vissza, anĂ©lkĂŒl, hogy megemlĂtenĂ© magĂĄt az oszlopot.
Most pedig hasznålhatunk egy ilyen lekérdezést a grafikonhoz
$columns(response, count(*) c) from $table where $adhoc
and $valueIfEmpty($fld_app_name, 1, fld_app_name = '$fld_app_name')
and $valueIfEmpty($fld_app_module, 1, fld_app_module = '$fld_app_module') and $valueIfEmpty($fld_server_name, 1, fld_server_name = '$fld_server_name') and $valueIfEmpty($uriStem, 1, uriStem like '%$uriStem%')
and $valueIfEmpty($clientRealIP, 1, clientRealIP = '$clientRealIP')amely Ăgy SQL-re alakul (figyeljen, hogy az ĂŒres uriStem mezĆk egyszerƱen 1-re alakultak)
SELECT
t,
groupArray((response, c)) AS groupArr
FROM (
SELECT
(intDiv(toUInt32(logdatetime), 60) * 60) * 1000 AS t, response,
count(*) AS c FROM default.log_web
WHERE (logdate >= toDate(1565061982)) AND (logdatetime >= toDateTime(1565061982)) AND 1 AND (fld_app_name = 'site1.domain.ru') AND (fld_app_module = 'web') AND 1 AND 1 AND 1
GROUP BY
t, response
ORDER BY
t ASC,
response ASC
)
GROUP BY t ORDER BY t ASCZĂĄrĂĄs
A ClickHouse adatbĂĄzis megjelenĂ©se mĂ©rföldkĆnek szĂĄmĂt a piacon. Nehezen kĂ©pzelhetĆ el, hogy teljesen ingyen, egyik pillanatrĂłl a mĂĄsikra egy erĆteljes Ă©s gyakorlati eszközhöz jutottunk a nagy adatokkal valĂł munkĂĄhoz. TermĂ©szetesen a növekvĆ igĂ©nyekkel (pĂ©ldĂĄul több szerverre valĂł sharding Ă©s replikĂĄciĂł) a sĂ©ma bonyolultabbĂĄ vĂĄlik. Az elsĆ benyomĂĄsok alapjĂĄn azonban rendkĂvĂŒl kellemes dolgozni ezzel az adatbĂĄzissal. NyilvĂĄnvalĂł, hogy ez a termĂ©k az emberek szĂĄmĂĄra kĂ©szĂŒlt.
Az ElasticSearch-hoz kĂ©pest a logok tĂĄrolĂĄsĂĄnak Ă©s feldolgozĂĄsĂĄnak költsĂ©gei elĆzetes becslĂ©sek szerint öt-tĂzszeresĂ©re csökkennek. MĂĄs szavakkal, ha a jelenlegi adatmennyisĂ©ghez klaszterre lenne szĂŒksĂ©gĂŒnk több gĂ©pbĆl, akkor a ClickHouse hasznĂĄlatĂĄval elegendĆ lenne egy gyenge teljesĂtmĂ©nyƱ gĂ©p. Igen, az ElasticSearch-ben is vannak adatok tömörĂtĂ©sĂ©re vonatkozĂł mechanizmusok, Ă©s mĂĄs funkciĂłk, amelyek jelentĆsen csökkenthetik az erĆforrĂĄs-fogyasztĂĄst, de a ClickHouse-hoz kĂ©pest ez több költsĂ©get igĂ©nyel.
MindenfĂ©le kĂŒlönleges optimalizĂĄlĂĄs nĂ©lkĂŒl, alapbeĂĄllĂtĂĄssal, az adatok betöltĂ©se Ă©s a lekĂ©rdezĂ©sek az adatbĂĄzisbĂłl elkĂ©pesztĆ sebessĂ©ggel mƱködnek. Jelenleg nem sok adatunk van (körĂŒlbelĂŒl 200 milliĂł rekord), de a szerver gyenge. Ezt az eszközt a jövĆben mĂĄs cĂ©lokra is felhasznĂĄlhatjuk, amelyek nem kapcsolĂłdnak a logok tĂĄrolĂĄsĂĄhoz. PĂ©ldĂĄul ĂĄtfogĂł analitikĂĄra, biztonsĂĄgi terĂŒleten, gĂ©pi tanulĂĄsban.
Kicsit a hĂĄtrĂĄnyokrĂłl Ă©s elĆnyökrĆl.
HĂĄtrĂĄnyok
- Rekordok nagyobb csomagokban valĂł betöltĂ©se. Ez egyrĂ©szt egy funkciĂł, de mindenkĂ©ppen tovĂĄbbi komponenseket kell hasznĂĄlni a rekordok pufferezĂ©sĂ©hez. Ez a feladat nem mindig egyszerƱ, de mĂ©gis megoldhatĂł. SzeretnĂ©m egyszerƱsĂteni a sĂ©mĂĄt.
- NĂ©hĂĄny egzotikus funkciĂł vagy Ășj jellemzĆ gyakran megsĂ©rĂŒl az Ășj verziĂłkban. Ez aggodalmat kelt, csökkentve az Ășj verziĂłra valĂł frissĂtĂ©s irĂĄnti vĂĄgyat. PĂ©ldĂĄul a Kafka tĂĄblamotor â egy nagyon hasznos funkciĂł, amely lehetĆvĂ© teszi az esemĂ©nyek közvetlen olvasĂĄsĂĄt a KafkĂĄbĂłl, anĂ©lkĂŒl, hogy fogyasztĂłkat kellene megvalĂłsĂtani. De a GitHub-ra feltett problĂ©mĂĄk szĂĄma alapjĂĄn egyelĆre Ăłvatosak vagyunk e motor hasznĂĄlatĂĄval a termelĂ©sben. Azonban, ha nem teszĂŒnk hirtelen lĂ©pĂ©seket, Ă©s hasznĂĄljuk az alapvetĆ funkciĂłt, akkor stabilan mƱködik.
ElĆnyök
- Nem lassul.
- Alacsony belĂ©pĂ©si kĂŒszöb.
- NyĂlt forrĂĄskĂłdĂș.
- Ingyenes.
- Jól skålåzható (töredezés/replicålås "tartalmazva")
- A MinComSzvĂĄz ĂĄltal ajĂĄnlott orosz szoftverek nyilvĂĄntartĂĄsĂĄba tartozik.
- Hivatalos tĂĄmogatĂĄs elĂ©rhetĆsĂ©ge a Yandex-tĆl.
ForrĂĄs: habr.com
