ClickHouse Database for Humans, na Alien Technologies

Aleksey Lizunov, Lehiben'ny Foiben'ny fahaiza-manao ho an'ny fantsona serivisy lavitra an'ny Direction of Information Technologies an'ny MKB

ClickHouse Database for Humans, na Alien Technologies

Ho solon'ny ELK stack (ElasticSearch, Logstash, Kibana), dia manao fikarohana momba ny fampiasana ny angona ClickHouse ho toy ny fivarotana data ho an'ny logs.

Ato amin'ity lahatsoratra ity, te hiresaka momba ny traikefanay tamin'ny fampiasana ny angon-drakitra ClickHouse sy ny vokatra vonjimaika tamin'ny asa mpanamory izahay. Marihina avy hatrany fa nahavariana ny vokatra azo.


ClickHouse Database for Humans, na Alien Technologies

Manaraka izany dia holazainay amin'ny antsipiriany kokoa ny fomba nandrafetana ny rafitra misy anay, ary inona ny singa ao anatiny. Fa ankehitriny aho dia te hiresaka kely momba an'io tahiry io amin'ny ankapobeny, ary nahoana no tokony hojerena. Ny angon-drakitra ClickHouse dia angona tsanganana famakafakana avo lenta avy amin'ny Yandex. Ampiasaina amin'ny serivisy Yandex izy io, amin'ny voalohany dia io no fitahirizana angon-drakitra lehibe ho an'ny Yandex.Metrica. Rafitra loharano misokatra, maimaim-poana. Avy amin'ny fomba fijerin'ny mpamorona, nanontany tena foana aho hoe ahoana no nampiharan'izy ireo izany, satria misy angona goavana be. Ary ny interface interface an'ny Metrica mihitsy dia tena mora sy haingana. Amin'ny fahafantarana voalohany an'io tahiry io, ny fahatsapana dia: "Eny, farany! Natao ho an'ny vahoaka! Manomboka amin'ny dingana fametrahana ary mifarana amin'ny fandefasana fangatahana.

Ity tahiry ity dia manana tokonam-pidirana ambany dia ambany. Na dia mpandrindra mahay salantsalany aza dia afaka mametraka ity angon-drakitra ity ao anatin'ny minitra vitsy ary manomboka mampiasa izany. Miasa mazava ny zava-drehetra. Na ny olona vaovao amin'ny Linux aza dia afaka mitantana haingana ny fametrahana ary manao ny asa tsotra indrindra. Raha teo aloha, miaraka amin'ny teny hoe Big Data, Hadoop, Google BigTable, HDFS, mpandrindra tsotra dia nanana hevitra fa momba ny terabytes sasany, petabytes, fa misy olona ambony sasany mirotsaka amin'ny sehatra sy fampandrosoana ho an'ireo rafitra ireo, avy eo amin'ny fahatongavan'ny ClickHouse. database, nahazo fitaovana tsotra sy azo takarina izay ahafahanao mamaha ireo asa maro tsy tratra teo aloha. Mila milina iray salantsalany fotsiny ary dimy minitra ny fametrahana azy. Izany hoe, nahazo angon-drakitra toy ny MySql, ohatra, fa mba hitehirizana rakitra an'arivony tapitrisa fotsiny! Super-archiver sasany miaraka amin'ny fiteny SQL. Toy ny hoe nomena ny fitaovam-piadian'ny vahiny ny olona.

Momba ny rafitra fanoratana anay

Mba hanangonana vaovao dia ampiasaina ny rakitra log IIS amin'ny rindranasan-tranonkala amin'ny endrika manara-penitra (eo am-pamakiana ny diarin'ny rindranasa ihany koa izahay amin'izao fotoana izao, fa ny tena tanjona amin'ny dingan'ny mpanamory dia ny fanangonana ny logs IIS).

Noho ny antony samihafa dia tsy afaka nandao tanteraka ny stack ELK izahay, ary manohy mampiasa ny singa LogStash sy Filebeat izahay, izay nanaporofo tsara ny tenany ary miasa azo antoka sy azo antoka.

Ny rafitra fanoratana ankapobe dia aseho amin'ny sary etsy ambany:

ClickHouse Database for Humans, na Alien Technologies

Ny endri-panoratana data amin'ny angon-drakitra ClickHouse dia tsy dia matetika (indray mandeha isan-tsegondra) ny fampidirana rakitsoratra amina andiany lehibe. Ity, raha ny fahitana azy, no ampahany "olana" indrindra hitanao rehefa niaina niasa tamin'ny angon-drakitra ClickHouse ianao: lasa sarotra kokoa ny tetika.
Ny plugin ho an'ny LogStash, izay mampiditra mivantana ny angona ao amin'ny ClickHouse, dia nanampy betsaka teto. Ity singa ity dia apetraka amin'ny lohamilina mitovy amin'ny angon-drakitra. Noho izany, amin'ny ankapobeny dia tsy soso-kevitra ny hanao izany, fa amin'ny fomba fijery azo ampiharina, mba tsy hamokatra mpizara misaraka raha apetraka amin'ny mpizara iray ihany. Tsy nahita tsy fahombiazana na fifandirana momba ny loharanon-karena tamin'ny angon-drakitra izahay. Ankoatr'izay, tokony ho marihina fa ny plugin dia manana mekanika andrana indray raha misy hadisoana. Ary raha misy lesoka, ny plugin dia manoratra amin'ny kapila misy angon-drakitra tsy azo ampidirina (mety ny format file: aorian'ny fanitsiana dia azonao atao mora foana ny mampiditra ny ampahany voahitsy amin'ny fampiasana clickhouse-client).

Ny lisitra feno amin'ny rindrambaiko ampiasaina amin'ny drafitra dia aseho amin'ny tabilao:

Lisitry ny rindrambaiko ampiasaina

anarana

famaritana

Rohy fanapariahana

NGINX

Reverse-proxy mba hamerana ny fidirana amin'ny seranana sy handamina ny fanomezan-dàlana

Tsy ampiasaina amin'ny drafitra amin'izao fotoana izao

https://nginx.org/ru/download.html

https://nginx.org/download/nginx-1.16.0.tar.gz

FileBeat

Famindrana ny diarin'ny rakitra.

https://www.elastic.co/downloads/beats/filebeat (kitapo fizarana ho an'ny Windows 64bit).

https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.0-windows-x86_64.zip

logstash

mpanangona log.

Ampiasaina hanangonana logs avy amin'ny FileBeat, ary koa hanangonana logs avy amin'ny filaharana RabbitMQ (ho an'ireo mpizara ao amin'ny DMZ.)

https://www.elastic.co/products/logstash

https://artifacts.elastic.co/downloads/logstash/logstash-7.0.1.rpm

Logstash-output-clickhouse

Loagstash plugin amin'ny famindrana logs amin'ny angon-drakitra ClickHouse amin'ny andiany

https://github.com/mikechris/logstash-output-clickhouse

/usr/share/logstash/bin/logstash-plugin mametraka logstash-output-clickhouse

/usr/share/logstash/bin/logstash-plugin mametraka logstash-filter-prune

/usr/share/logstash/bin/logstash-plugin mametraka logstash-filter-multiline

clickhouse

fitahirizana log https://clickhouse.yandex/docs/ru/

https://packagecloud.io/Altinity/clickhouse/packages/el/7/clickhouse-server-19.5.3.8-1.el7.x86_64.rpm

https://packagecloud.io/Altinity/clickhouse/packages/el/7/clickhouse-client-19.5.3.8-1.el7.x86_64.rpm

Fanamarihana. Nanomboka tamin'ny Aogositra 2018, ny fananganana rpm "ara-dalàna" ho an'ny RHEL dia niseho tao amin'ny tahiry Yandex, mba hahafahanao manandrana mampiasa azy ireo. Tamin'ny fotoana fametrahana dia nampiasa fonosana namboarin'i Altinity izahay.

grafana

Log visualization. Fametrahana dashboards

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos(64 Bit) - kinova farany

Angon-drakitra ClickHouse ho an'ny Grafana 4.6+

Plugin ho an'ny Grafana miaraka amin'ny loharano angona ClickHouse

https://grafana.com/plugins/vertamedia-clickhouse-datasource

https://grafana.com/api/plugins/vertamedia-clickhouse-datasource/versions/1.8.1/download

logstash

Log ny router avy amin'ny FileBeat mankany amin'ny filaharana RabbitMQ.

Fanamarihana. Indrisy anefa fa tsy mivoaka mivantana amin'ny RabbitMQ ny FileBeat, noho izany dia ilaina ny rohy manelanelana amin'ny endrika Logstash

https://www.elastic.co/products/logstash

https://artifacts.elastic.co/downloads/logstash/logstash-7.0.1.rpm

Ny bitro MQ

filaharana hafatra. Ity no log buffer ao amin'ny DMZ

https://www.rabbitmq.com/download.html

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14-1.el7.noarch.rpm

Erlang Runtime (Ilaina amin'ny RabbitMQ)

Erlang runtime. Ilaina ny RabbitMQ mba hiasa

http://www.erlang.org/download.html

https://www.rabbitmq.com/install-rpm.html#install-erlang http://www.erlang.org/downloads/21.3

Ny fandrindrana ny mpizara miaraka amin'ny angon-drakitra ClickHouse dia aseho amin'ity tabilao manaraka ity:

anarana

zava-dehibe

fanamarihana

fanahafana

HDD: 40 GB
RAM: 8GB
Processeur: Core 2 2Ghz

Ilaina ny mandinika ny toro-hevitra amin'ny fampandehanana ny angona ClickHouse (https://clickhouse.yandex/docs/ru/operations/tips/)

Software rafitra ankapobeny

OS: Red Hat Enterprise Linux Server (Maipo)

JRE (Java 8)

 

Araka ny hitanao dia toeram-piasana mahazatra ity.

Ny firafitry ny latabatra fitehirizana dia toy izao manaraka izao:

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;

Mampiasa fizarazarana default izahay (amin'ny isam-bolana) sy ny index granularity. Ny saha rehetra dia mifanandrify amin'ny fidirana amin'ny log IIS ho an'ny fangatahana http. Marihina manokana fa misy saha misaraka amin'ny fitehirizana utm-tags (fampidirana ao amin'ny tabilao avy amin'ny sahan'ny string query izy ireo).

Ary koa, sahan'ny rafitra maromaro no nampiana teo amin'ny latabatra mba hitahiry vaovao momba ny rafitra, singa, mpizara. Jereo ny tabilao etsy ambany raha mila fanazavana momba ireo saha ireo. Ao amin'ny latabatra iray, dia mitahiry logs ho an'ny rafitra maromaro izahay.

anarana

famaritana

ohatra

fld_app_name

Anaran'ny fampiharana/rafitra
Sanda manankery:

  • site1.domain.com Site ivelany 1
  • site2.domain.com Site ivelany 2
  • internal-site1.domain.local Site anatiny 1

site1.domain.com

fld_app_module

Module rafitra
Sanda manankery:

  • tranonkala - Tranonkala
  • svc - serivisy tranonkala
  • intgr - Fampidirana Web Service
  • bo - Admin (BackOffice)

Malagasy

fld_website_name

Anaran'ny tranokala amin'ny IIS

Rafitra maromaro no azo apetraka amin'ny mpizara iray, na ohatra maromaro amin'ny maody rafitra iray

web main

fld_server_name

Anaran'ny mpizara

web1.domain.com

fld_log_file_name

Lalana mankany amin'ny rakitra log amin'ny mpizara

C:inetpublogsLogFiles
W3SVC1u_ex190711.log

Izany dia ahafahanao manangana sary amin'ny fomba mahomby amin'ny Grafana. Ohatra, jereo ny fangatahana avy any amin'ny faran'ny rafitra iray manokana. Mitovy amin'ny kaontera tranokala ao amin'ny Yandex.Metrica izany.

Ireto misy antontan'isa momba ny fampiasana ny angon-drakitra nandritra ny roa volana.

Isan'ny firaketana rava araka ny rafitra sy ny singany

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.ru  │ web            │     131441 │
│ site2.domain.ru  │ web            │    1751081 │
│ site3.domain.ru  │ web            │  106887543 │
│ site3.domain.ru  │ svc            │   44908603 │
│ site3.domain.ru  │ intgr          │    9813911 │
│ site4.domain.ru  │ web            │     772095 │
│ site5.domain.ru  │ web            │   17037221 │
│ site5.domain.ru  │ intgr          │     838559 │
│ site5.domain.ru  │ bo             │       7404 │
│ site6.domain.ru  │ web            │     595877 │
│ site7.domain.ru  │ 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.)

Ny habetsaky ny angona ao amin'ny kapila

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.

Ny haavon'ny fanerena angona amin'ny tsanganana

SELECT
    name,
    formatReadableSize(data_uncompressed_bytes) AS uncompressed,
    formatReadableSize(data_compressed_bytes) AS compressed,
    data_uncompressed_bytes / data_compressed_bytes AS compress_ratio
FROM system.columns
WHERE table = 'log_web'
 
┌─name───────────────────┬─uncompressed─┬─compressed─┬─────compress_ratio─┐
│ 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 rows in set. Elapsed: 0.005 sec.

Famaritana ny singa ampiasaina

FileBeat. Mamindra ny diarin'ny rakitra

Ity singa ity dia manara-maso ny fanovana amin'ny firaketana rakitra amin'ny kapila ary mampita ny fampahalalana amin'ny LogStash. Apetraka amin'ny lohamilina rehetra misy ny rakitra log (matetika IIS). Miasa amin'ny fomba rambony (izany hoe mamindra ireo rakitsoratra fanampiny amin'ny rakitra ihany). Saingy misaraka dia azo amboarina mba hamindra rakitra manontolo. Tena ilaina izany rehefa mila misintona angona tamin'ny volana lasa ianao. Apetraho ao anaty lahatahiry fotsiny ny rakitra log dia hovakiny manontolo.

Rehefa mijanona ny serivisy dia tsy afindra any amin'ny fitahirizana intsony ny angona.

Ohatra config dia toy izao:

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.ru"
    fld_app_name: "site1.domain.ru"
    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.ru"
    fld_app_name: "site2.domain.ru"
    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.ru.cer"
  ssl.key: "C:/filebeat/certs/site1.domain.ru.key"
 
#================================ Processors =====================================
 
processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

logstash. Log collector

Ity singa ity dia natao handraisana ny fidirana amin'ny log avy amin'ny FileBeat (na amin'ny alàlan'ny filaharana RabbitMQ), manara-maso sy mampiditra batch ao amin'ny tahiry ClickHouse.

Ho an'ny fampidirana ao amin'ny ClickHouse dia ampiasaina ny plugin Logstash-output-clickhouse. Ny plugin Logstash dia manana mekanika andrana indray, saingy amin'ny fanakatonana tsy tapaka dia tsara kokoa ny manajanona ny serivisy. Rehefa mijanona dia miangona ao amin'ny filaharana RabbitMQ ny hafatra, ka raha maharitra ny fijanonana dia tsara kokoa ny manajanona ny Filebeats amin'ny mpizara. Ao amin'ny rafitra iray izay tsy ampiasaina ny RabbitMQ (amin'ny tambajotra eo an-toerana, Filebeat dia mandefa logstash mivantana amin'ny Logstash), ny Filebeats dia miasa azo ekena sy azo antoka, ka ho azy ireo ny tsy fisian'ny vokatra dia mandalo tsy misy vokany.

Ohatra config dia toy izao:

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. fitahirizana log

Ny logs ho an'ny rafitra rehetra dia voatahiry ao anaty latabatra iray (jereo eo am-piandohan'ny lahatsoratra). Natao hitahiry vaovao momba ny fangatahana izany: mitovy amin'ny endrika samihafa ny paramètre rehetra, toy ny logs IIS, apache ary log nginx. Ho an'ny lozisialy fampiharana, izay, ohatra, ny hadisoana, ny hafatra momba ny fampahalalana, ny fampitandremana dia voarakitra an-tsoratra, ny latabatra mitokana dia homena ny rafitra mety (amin'izao fotoana izao eo amin'ny sehatry ny famolavolana).

Rehefa mamolavola latabatra dia tena zava-dehibe ny manapa-kevitra amin'ny fanalahidy fototra (izay handaminana ny angona mandritra ny fitahirizana). Miankina amin'izany ny haavon'ny fanerena ny angona sy ny hafainganan'ny fangatahana. Ao amin'ny ohatra asehontsika, ny fanalahidy dia
ORDER BY (fld_app_name, fld_app_module, logdatetime)
Izany hoe, amin'ny anaran'ny rafitra, ny anaran'ny singa rafitra ary ny datin'ny hetsika. Tamin'ny voalohany, ny datin'ny hetsika no voalohany. Rehefa avy namindra azy tany amin'ny toerana farany, dia nanomboka niasa indroa haingana kokoa ny fanontaniana. Ny fanovana ny fanalahidy fototra dia mitaky ny famerenana ny latabatra sy ny famerenana indray ny angon-drakitra mba handaminana indray ny angona amin'ny kapila ny ClickHouse. Hetsika mavesa-danja izany, ka tsara ny mieritreritra be momba izay tokony hampidirina ao amin'ny fanalahidin'ny sort.

Tsara homarihina koa fa ny karazana data LowCardinality dia niseho tamin'ny dikan-teny vao haingana. Rehefa mampiasa azy io, dia mihena be ny haben'ny angon-drakitra voaporitra ho an'ireo saha izay manana kardinaly ambany (safidy vitsivitsy).

Ny version 19.6 dia ampiasaina amin'izao fotoana izao ary mikasa ny hanandrana ny fanavaozana ny kinova farany izahay. Izy ireo dia manana endri-javatra mahafinaritra toy ny Adaptive Granularity, Skipping indices ary ny codec DoubleDelta, ohatra.

Amin'ny alàlan'ny default, mandritra ny fametrahana, ny haavon'ny logging dia napetraka ho trace. Ny logs dia mihodina sy mitahiry, fa miaraka amin'izay koa, miitatra hatramin'ny gigabyte. Raha tsy ilaina dia azonao atao ny mametraka ny haavon'ny fampitandremana, dia mihena be ny haben'ny log. Apetraka ao amin'ny rakitra config.xml ny fandrafetana log:

<!-- Possible levels: https://github.com/pocoproject/poco/blob/develop/Foundation/include/Poco/Logger. h#L105 -->
<level>warning</level>

Didy mahasoa sasany

Поскольку оригинальные пакеты установки собираются по Debian, то для других версий Linux необходимо использовать пакеты собранные компанией Altinity.
 
Вот по этой ссылке есть инструкции с ссылками на их репозиторий: https://www.altinity.com/blog/2017/12/18/logstash-with-clickhouse
sudo yum search clickhouse-server
sudo yum install clickhouse-server.noarch
  
1. проверка статуса
sudo systemctl status clickhouse-server
 
2. остановка сервера
sudo systemctl stop clickhouse-server
 
3. запуск сервера
sudo systemctl start clickhouse-server
 
Запуск для выполнения запросов в многострочном режиме (выполнение после знака ";")
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
 
Плагин кликлауза для логстеш в случае ошибки в одной строке сохраняет всю пачку в файл /tmp/log_web_failed.json
Можно вручную исправить этот файл и попробовать залить его в БД вручную:
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
 
выход из командной строки
quit;
## Настройка TLS
https://www.altinity.com/blog/2019/3/5/clickhouse-networking-part-2
 
openssl s_client -connect log.domain.com:9440 < /dev/null

logstash. Log ny router avy amin'ny FileBeat mankany amin'ny filaharana RabbitMQ

Ity singa ity dia ampiasaina hampandehanana ny log avy amin'ny FileBeat mankany amin'ny filaharana RabbitMQ. Misy teboka roa eto:

  1. Mampalahelo fa tsy manana plugin output hanoratana mivantana amin'ny RabbitMQ ny FileBeat. Ary ny fiasa toy izany, raha jerena ny olana ao amin'ny github, dia tsy nomanina ho fampiharana. Misy plugin ho an'ny Kafka, saingy noho ny antony tsy ahafahantsika mampiasa azy ao an-trano.
  2. Misy fepetra takiana amin'ny fanangonana logs ao amin'ny DMZ. Miorina amin'izy ireo dia tsy maintsy ampidirina amin'ny filaharana aloha ny logs ary avy eo ny LogStash dia mamaky ny fidirana avy amin'ny filaharana avy any ivelany.

Noho izany, ho an'ny tranga misy ny mpizara ao amin'ny DMZ dia tsy maintsy mampiasa tetika somary sarotra toy izany ny olona iray. Ohatra config dia toy izao:

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. filaharana hafatra

Ity singa ity dia ampiasaina hanesorana ny fidirana amin'ny log ao amin'ny DMZ. Ny fandraketana dia atao amin'ny alàlan'ny andiana Filebeat → LogStash. Ny famakiana dia atao any ivelan'ny DMZ amin'ny alàlan'ny LogStash. Rehefa miasa amin'ny RabboitMQ dia hafatra 4 arivo isan-tsegondra no voahodina.

Ny fampitaovana hafatra dia amboarina amin'ny anaran'ny rafitra, izany hoe mifototra amin'ny angon-drakitra fikirakirana FileBeat. Mandeha amin'ny filaharana iray ny hafatra rehetra. Raha noho ny antony iray dia mijanona ny serivisy milahatra, dia tsy hitarika amin'ny fahaverezan'ny hafatra izany: Ny FileBeats dia hahazo hadisoana amin'ny fifandraisana ary hampiato vetivety ny fandefasana. Ary ny LogStash izay mamaky avy amin'ny filaharana dia hahazo hadisoana amin'ny tambajotra ary miandry ny famerenana ny fifandraisana. Amin'ity tranga ity, ny angon-drakitra, mazava ho azy, dia tsy hosoratana amin'ny angon-drakitra intsony.

Ireto toromarika manaraka ireto dia ampiasaina amin'ny famoronana sy fanamboarana filaharana:

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. Dashboards

Ity singa ity dia ampiasaina hanehoana ny angona fanaraha-maso. Amin'ity tranga ity, mila mametraka ny loharano angon-drakitra ClickHouse ho an'ny Grafana 4.6+ plugin ianao. Tsy maintsy nanova kely izany izahay mba hanatsarana ny fahombiazan'ny fanodinana ny sivana SQL eo amin'ny dashboard.

Ohatra, mampiasa variables izahay, ary raha tsy napetraka ao amin'ny saha sivana izy ireo, dia tiantsika ny tsy hamorona fepetra ao amin'ny WHERE ny endrika ( uriStem = » AND uriStem != » ). Amin'ity tranga ity, ny ClickHouse dia hamaky ny tsanganana uriStem. Amin'ny ankapobeny, nanandrana safidy isan-karazany izahay ary nanitsy ny plugin (ny macro $valueIfEmpty) tamin'ny farany ka raha misy sanda poakaty dia miverina 1 izy io, tsy lazaina intsony ny tsanganana.

Ary izao dia azonao ampiasaina ity fangatahana ity ho an'ny grafika

$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')

izay adika amin'ity SQL ity (mariho fa niova ho 1 fotsiny ny saha uriStem banga)

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 ASC

famaranana

Ny fisehoan'ny tranokala ClickHouse dia lasa hetsika manan-danja eo amin'ny tsena. Sarotra ny nieritreritra fa, maimaim-poana tanteraka, tao anatin'ny indray mipi-maso dia nirongo fitaovana mahery vaika sy azo ampiharina izahay mba hiasa miaraka amin'ny angon-drakitra lehibe. Mazava ho azy, miaraka amin'ny fitomboan'ny filàna (ohatra, sharding sy replication amin'ny server maro), dia ho sarotra kokoa ny drafitra. Saingy amin'ny fahatsapana voalohany, ny miasa miaraka amin'ity tahiry ity dia tena mahafinaritra. Hita fa natao "ho an'ny olona" ny vokatra.

Raha ampitahaina amin'ny ElasticSearch, ny vidin'ny fitehirizana sy fanodinana dia tombanana hidina dimy ka hatramin'ny folo heny. Raha lazaina amin'ny teny hafa, raha ny habetsaky ny angona ankehitriny dia tsy maintsy manangana andiana milina maromaro isika, dia rehefa mampiasa ClickHouse, dia ampy ho antsika ny milina iray manana hery ambany. Eny, mazava ho azy, ny ElasticSearch dia manana rafitra fanerena angon-drakitra ao anaty kapila sy ireo endri-javatra hafa izay mety hampihena be ny fanjifana loharanon-karena, fa raha oharina amin'ny ClickHouse, dia ho lafo kokoa izany.

Raha tsy misy fanatsarana manokana amin'ny anjarantsika, amin'ny fikandrana default, ny fametrahana angon-drakitra ary ny fisafidianana avy amin'ny angon-drakitra dia miasa amin'ny hafainganam-pandeha mahagaga. Mbola tsy manana angon-drakitra betsaka izahay (eo amin'ny 200 tapitrisa eo ho eo), fa ny server mihitsy no malemy. Azontsika ampiasaina amin'ny ho avy io fitaovana io ho an'ny tanjona hafa tsy mifandraika amin'ny fitehirizana logs. Ohatra, ho an'ny fanadihadiana farany, eo amin'ny sehatry ny fiarovana, fianarana milina.

Amin'ny farany, kely momba ny mahatsara sy maharatsy azy.

Минусы

  1. Mametraka rakitsoratra amin'ny andiany lehibe. Amin'ny lafiny iray, endri-javatra ity, saingy mbola mila mampiasa singa fanampiny ianao amin'ny firaketana an-tsoratra. Ity asa ity dia tsy tsotra foana, fa mbola azo vahana. Ary tiako ny hanatsotra ny tetika.
  2. Ny fiasa hafahafa na endri-javatra vaovao dia matetika tapaka amin'ny dikan-teny vaovao. Miteraka ahiahy izany, mampihena ny faniriana hanavao ny dikan-teny vaovao. Ohatra, ny motera latabatra Kafka dia endri-javatra tena ilaina izay ahafahanao mamaky mivantana ny hetsika avy amin'ny Kafka, tsy misy fampiharana mpanjifa. Saingy raha jerena ny isan'ny olana ao amin'ny github, dia mbola mitandrina izahay mba tsy hampiasa ity motera ity amin'ny famokarana. Na izany aza, raha tsy manao fihetsika tampoka amin'ny sisiny ianao ary mampiasa ny fiasa fototra, dia miasa tsara izy io.

Плюсы

  1. Tsy miadana.
  2. Fehezana fidirana ambany.
  3. loharano misokatra.
  4. maimaim-poana.
  5. Mizana tsara (sharding/replication ivelan'ny boaty)
  6. Tafiditra ao amin'ny rejisitry ny rindrambaiko Rosiana natolotry ny Minisiteran'ny Serasera.
  7. Ny fisian'ny fanohanana ofisialy avy amin'ny Yandex.

Source: www.habr.com

Add a comment