ClickHouse Database para sa mga Tawo, o Alien Technologies

Aleksey Lizunov, Ulo sa Competence Center alang sa Remote Service Channels sa Directorate of Information Technologies sa MKB

ClickHouse Database para sa mga Tawo, o Alien Technologies

Isip alternatibo sa ELK stack (ElasticSearch, Logstash, Kibana), naghimo kami og panukiduki sa paggamit sa ClickHouse database isip usa ka data store alang sa mga troso.

Niini nga artikulo, gusto namong hisgutan ang among kasinatian sa paggamit sa database sa ClickHouse ug ang pasiunang resulta sa operasyon sa piloto. Kinahanglang hinumdoman dayon nga ang mga resulta impresibo.


ClickHouse Database para sa mga Tawo, o Alien Technologies

Sunod, among ihulagway sa mas detalyado kung giunsa ang among sistema gi-configure, ug kung unsang mga sangkap ang gilangkuban niini. Apan karon gusto ko nga maghisgot og gamay bahin sa kini nga database sa kinatibuk-an, ug ngano nga kini angay nga hatagan pagtagad. Ang ClickHouse database usa ka high-performance analytical columnar database gikan sa Yandex. Gigamit kini sa mga serbisyo sa Yandex, sa sinugdan kini ang nag-unang pagtipig sa datos alang sa Yandex.Metrica. Open-source nga sistema, libre. Gikan sa punto sa panglantaw sa usa ka developer, kanunay kong naghunahuna kung giunsa nila kini gipatuman, tungod kay adunay dako nga datos. Ug ang user interface mismo ni Metrica kay flexible ug paspas. Sa una nga pagkilala sa kini nga database, ang impresyon mao: "Aw, sa katapusan! Gihimo para sa katawhan! Sugod gikan sa proseso sa pag-instalar ug pagtapos sa pagpadala sa mga hangyo.

Kini nga database adunay ubos kaayo nga entry threshold. Bisan ang usa ka kasagaran nga hanas nga developer maka-install niini nga database sa pipila ka minuto ug magsugod sa paggamit niini. Ang tanan molihok nga klaro. Bisan ang mga tawo nga bag-o sa Linux dali nga makadumala sa pag-install ug mahimo ang labing yano nga mga operasyon. Kung sa sayo pa, sa mga pulong nga Big Data, Hadoop, Google BigTable, HDFS, usa ka ordinaryo nga developer adunay mga ideya nga kini mahitungod sa pipila ka terabytes, petabytes, nga ang pipila ka mga superhumans nalambigit sa mga setting ug kalamboan alang niini nga mga sistema, unya sa pag-abot sa ClickHouse database, nakakuha kami usa ka yano, masabtan nga himan diin mahimo nimong masulbad ang usa ka kaniadto dili maabut nga lainlaing mga buluhaton. Nagkinahanglan lamang kini og usa ka medyo kasagaran nga makina ug lima ka minuto aron ma-install. Kana mao, nakuha namo ang ingon nga database sama sa, pananglitan, MySql, apan alang lamang sa pagtipig sa binilyon nga mga rekord! Usa ka piho nga super-archiver nga adunay SQL nga sinultian. Kini sama sa mga tawo nga gitunol sa mga hinagiban sa mga langyaw.

Mahitungod sa among logging system

Sa pagkolekta sa impormasyon, IIS log files sa standard format web applications gigamit (kami usab karon parsing application logs, apan ang nag-unang tumong sa pilot stage mao ang pagkolekta IIS logs).

Alang sa lainlaing mga hinungdan, dili namon hingpit nga biyaan ang ELK stack, ug padayon namon nga gigamit ang mga sangkap sa LogStash ug Filebeat, nga napamatud-an nga maayo ang ilang kaugalingon ug nagtrabaho nga kasaligan ug matag-an.

Ang kinatibuk-ang logging scheme gipakita sa hulagway sa ubos:

ClickHouse Database para sa mga Tawo, o Alien Technologies

Ang usa ka bahin sa pagsulat sa datos sa ClickHouse database kay panagsa ra (kausa matag segundo) pagsal-ot sa mga rekord sa dagkong mga batch. Kini, dayag, mao ang labing "problema" nga bahin nga imong masugatan sa diha nga ikaw unang makasinati sa pagtrabaho uban sa ClickHouse database: ang laraw mahimong usa ka gamay nga mas komplikado.
Ang plugin alang sa LogStash, nga direkta nga nagsal-ot sa datos sa ClickHouse, nakatabang kaayo dinhi. Ang kini nga sangkap gi-deploy sa parehas nga server sama sa database mismo. Busa, sa kasagaran nga pagsulti, wala kini girekomendar nga buhaton kini, apan gikan sa praktikal nga punto sa panglantaw, aron dili makahimo og lain nga mga server samtang kini gi-deploy sa samang server. Wala kami nakamatikod sa bisan unsang mga kapakyasan o panagsumpaki sa kapanguhaan sa database. Dugang pa, kinahanglan nga matikdan nga ang plugin adunay mekanismo sa pagsulay pag-usab kung adunay mga sayup. Ug sa kaso sa mga kasaypanan, ang plugin nagsulat sa disk sa usa ka batch sa data nga dili masulod (ang file format mao ang sayon: human sa pag-edit, kamo sa dali rang isal-ot ang gitul-id nga batch sa paggamit clickhouse-kliyente).

Ang usa ka kompleto nga lista sa software nga gigamit sa laraw gipresentar sa lamesa:

Listahan sa software nga gigamit

Titulo

paghulagway

Link sa distribusyon

NGINX

Reverse-proxy aron pugngan ang pag-access sa mga pantalan ug pag-organisar sa pagtugot

Sa pagkakaron wala gigamit sa laraw

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

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

FileBeat

Pagbalhin sa mga file log.

https://www.elastic.co/downloads/beats/filebeat (distribusyon kit alang sa Windows 64bit).

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

logstash

Tigkolekta sa log.

Gigamit sa pagkolekta og mga troso gikan sa FileBeat, ingon man sa pagkolekta og mga troso gikan sa RabbitMQ queue (alang sa mga server nga anaa sa DMZ.)

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

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

Logstash-output-clickhouse

Loagstash plugin para sa pagbalhin sa mga troso ngadto sa ClickHouse database sa mga batch

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

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

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

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

clickhouse

Pagtipig sa 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

Nota. Sugod sa Agosto 2018, ang "normal" nga rpm nga pagtukod alang sa RHEL nagpakita sa Yandex repository, aron mahimo nimong sulayan nga gamiton kini. Sa panahon sa pag-instalar, naggamit kami og mga pakete nga gitukod sa Altinity.

grafana

Log visualization. Pag-set up sa mga dashboard

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos(64 Bit) - pinakabag-o nga bersyon

Ang tinubdan sa datos sa ClickHouse alang sa Grafana 4.6+

Plugin alang sa Grafana nga adunay gigikanan sa datos sa ClickHouse

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

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

logstash

Log router gikan sa FileBeat ngadto sa RabbitMQ queue.

Nota. Ikasubo, ang FileBeat walay output direkta sa RabbitMQ, mao nga gikinahanglan ang intermediate link sa porma sa Logstash

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

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

RabbitMQ

linya sa mensahe. Kini ang log buffer sa 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 (Gikinahanglan alang sa RabbitMQ)

Erlang runtime. Gikinahanglan aron magtrabaho ang RabbitMQ

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

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

Ang configuration sa server uban sa ClickHouse database gipresentar sa mosunod nga lamesa:

Titulo

bili

Примечание

Pagsalig

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

Kinahanglan nga hatagan pagtagad ang mga tip sa pag-operate sa database sa ClickHouse (https://clickhouse.yandex/docs/ru/operations/tips/)

Kinatibuk-ang sistema sa software

OS: Red Hat Enterprise Linux Server (Maipo)

JRE (Java 8)

 

Sama sa imong nakita, kini usa ka ordinaryo nga workstation.

Ang istruktura sa lamesa alang sa pagtipig sa mga troso mao ang mosunod:

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;

Gigamit namo ang default partitioning (sa bulan) ug index granularity. Ang tanan nga mga natad halos katumbas sa mga entry sa log sa IIS alang sa pag-log sa mga hangyo sa http. Tagsa-tagsa, among namatikdan nga adunay lain nga mga natad alang sa pagtipig sa mga utm-tags (kini gi-parse sa yugto sa pagsulod sa lamesa gikan sa query string field).

Usab, daghang mga natad sa sistema ang gidugang sa lamesa aron magtipig kasayuran bahin sa mga sistema, sangkap, server. Tan-awa ang lamesa sa ubos alang sa usa ka paghulagway niini nga mga natad. Sa usa ka lamesa, among gitipigan ang mga troso alang sa daghang mga sistema.

Titulo

paghulagway

Pananglitan:

fld_app_name

Ngalan sa aplikasyon/sistema
Mga balido nga kantidad:

  • site1.domain.com Pangawas nga site 1
  • site2.domain.com Pangawas nga site 2
  • internal-site1.domain.local Internal nga site 1

site1.domain.com

fld_app_module

Module sa sistema
Mga balido nga kantidad:

  • web - Website
  • svc - Serbisyo sa web site
  • intgr - Integration Web Service
  • bo - Admin (BackOffice)

web

fld_website_name

Ngalan sa site sa IIS

Daghang mga sistema ang mahimong i-deploy sa usa ka server, o bisan daghang mga higayon sa usa ka module sa sistema

web main

fld_server_name

Ngalan sa server

web1.domain.com

fld_log_file_name

Path sa log file sa server

C:inetpublogsLogFiles
W3SVC1u_ex190711.log

Gitugotan ka niini nga maayo ang paghimo og mga graph sa Grafana. Pananglitan, tan-awa ang mga hangyo gikan sa frontend sa usa ka partikular nga sistema. Kini susama sa site counter sa Yandex.Metrica.

Ania ang pipila ka estadistika sa paggamit sa database sulod sa duha ka bulan.

Gidaghanon sa mga rekord nga gibungkag sa mga sistema ug sa ilang mga sangkap

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

Ang gidaghanon sa datos sa disk

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.

Degree sa data compression sa mga kolum

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.

Deskripsyon sa gigamit nga mga sangkap

FileBeat. Pagbalhin sa mga file log

Kini nga sangkap nagsubay sa mga pagbag-o sa pag-log sa mga file sa disk ug gipasa ang kasayuran sa LogStash. Gi-install sa tanan nga mga server diin gisulat ang mga file sa log (kasagaran IIS). Nagtrabaho sa tail mode (pananglitan, gibalhin lamang ang dugang nga mga rekord sa file). Apan gilain kini mahimong ma-configure aron mabalhin ang tibuuk nga mga file. Mapuslanon kini kung kinahanglan nimo nga i-download ang datos gikan sa miaging mga bulan. Ibutang lang ang log file sa usa ka folder ug basahon kini sa kinatibuk-an.

Kung gihunong ang serbisyo, ang datos dili na ibalhin sa pagtipig.

Ang usa ka pananglitan nga pag-configure ingon niini:

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. Kolektor sa Log

Kini nga component gidisenyo aron makadawat og log entries gikan sa FileBeat (o pinaagi sa RabbitMQ queue), pag-parse ug pagsal-ot sa mga batch ngadto sa ClickHouse database.

Alang sa pagsulod sa ClickHouse, gigamit ang Logstash-output-clickhouse plugin. Ang Logstash plugin adunay usa ka mekanismo sa pagsulay pag-usab, apan sa usa ka regular nga pagsira, mas maayo nga ihunong ang serbisyo mismo. Kung gihunong, ang mga mensahe matipon sa RabbitMQ queue, busa kung ang paghunong dugay, nan mas maayo nga hunongon ang Filebeats sa mga server. Sa usa ka laraw diin ang RabbitMQ wala gigamit (sa lokal nga network, ang Filebeat direkta nga nagpadala sa mga troso sa Logstash), ang Filebeats nagtrabaho nga madawat ug luwas, mao nga alang kanila ang dili magamit nga mga pag-agi sa output nga wala’y mga sangputanan.

Ang usa ka pananglitan nga pag-configure ingon niini:

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. Pagtipig sa log

Ang mga log para sa tanang sistema gitipigan sa usa ka lamesa (tan-awa sa sinugdanan sa artikulo). Gituyo kini sa pagtipig og impormasyon mahitungod sa mga hangyo: ang tanan nga mga parameter parehas alang sa lain-laing mga format, sama sa IIS logs, apache ug nginx logs. Alang sa mga log sa aplikasyon, diin, pananglitan, mga sayup, mga mensahe sa impormasyon, mga pasidaan ang natala, usa ka bulag nga lamesa ang ihatag sa angay nga istruktura (karon sa yugto sa disenyo).

Kung nagdesinyo sa usa ka lamesa, hinungdanon kaayo ang pagdesisyon sa panguna nga yawe (nga diin ang mga datos masunud sa panahon sa pagtipig). Ang lebel sa data compression ug ang katulin sa pangutana nagdepende niini. Sa atong pananglitan, ang yawe mao
PAG-ORDER NI (fld_app_name, fld_app_module, logdatetime)
Kana mao, pinaagi sa ngalan sa sistema, ang ngalan sa sangkap sa sistema ug ang petsa sa panghitabo. Sa sinugdan, ang petsa sa panghitabo maoy nag-una. Human sa pagbalhin niini ngadto sa kataposang dapit, ang mga pangutana misugod sa pagtrabaho mga doble nga mas paspas. Ang pagbag-o sa panguna nga yawe magkinahanglan pag-usab sa lamesa ug pag-reload sa datos aron ang ClickHouse mag-sort pag-usab sa datos sa disk. Kini usa ka bug-at nga operasyon, mao nga maayong ideya nga hunahunaon pag-ayo kung unsa ang kinahanglan iapil sa yawe sa pagsunud.

Kinahanglan usab nga hinumdoman nga ang tipo sa datos nga LowCardinality nagpakita sa bag-o nga mga bersyon. Kung gigamit kini, ang gidak-on sa mga naka-compress nga datos maminusan pag-ayo alang sa mga natad nga adunay gamay nga kardinal (pipila ka kapilian).

Ang Bersyon 19.6 gigamit karon ug nagplano kami nga sulayan ang pag-update sa labing bag-ong bersyon. Naa silay nindot nga mga bahin sama sa Adaptive Granularity, Skipping index ug DoubleDelta codec, pananglitan.

Sa kasagaran, sa panahon sa pag-instalar, ang lebel sa pag-log gitakda sa pagsubay. Ang mga troso gipatuyok ug gi-archive, apan sa samang higayon sila nagpalapad hangtod sa usa ka gigabyte. Kung wala'y kinahanglan, nan mahimo nimong itakda ang lebel sa pasidaan, unya ang gidak-on sa troso mikunhod pag-ayo. Ang logging setting gibutang sa config.xml file:

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

Pipila ka mapuslanon nga mga sugo

Поскольку оригинальные пакеты установки собираются по 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 router gikan sa FileBeat ngadto sa RabbitMQ queue

Kini nga component kay gigamit sa rota logs gikan sa FileBeat ngadto sa RabbitMQ queue. Adunay duha ka punto dinhi:

  1. Ikasubo, ang FileBeat walay output plugin nga direktang isulat sa RabbitMQ. Ug ang ingon nga pagpaandar, nga gihukman sa isyu sa ilang github, wala giplano alang sa pagpatuman. Adunay usa ka plugin alang sa Kafka, apan sa pipila ka rason dili namo kini magamit sa balay.
  2. Adunay mga kinahanglanon alang sa pagkolekta sa mga troso sa DMZ. Base sa kanila, ang mga log kinahanglan una nga idugang sa pila ug dayon basahon sa LogStash ang mga entri gikan sa pila gikan sa gawas.

Busa, kini alang sa kaso diin ang mga server nahimutang sa DMZ nga ang usa kinahanglan nga mogamit sa usa ka gamay nga komplikado nga laraw. Ang usa ka pananglitan nga pag-configure ingon niini:

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. linya sa mensahe

Kini nga component gigamit sa buffer log entries sa DMZ. Ang pagrekord gihimo pinaagi sa usa ka hugpong sa Filebeat → LogStash. Ang pagbasa gihimo gikan sa gawas sa DMZ pinaagi sa LogStash. Kung naglihok pinaagi sa RabboitMQ, mga 4 ka libo nga mga mensahe matag segundo ang giproseso.

Ang pag-routing sa mensahe gi-configure sa ngalan sa sistema, ie base sa data sa pagsumpo sa FileBeat. Ang tanan nga mga mensahe moadto sa usa ka pila. Kung sa usa ka hinungdan ang serbisyo sa pagpila nahunong, nan dili kini hinungdan sa pagkawala sa mga mensahe: Ang FileBeats makadawat mga sayup sa koneksyon ug temporaryo nga gisuspinde ang pagpadala. Ug ang LogStash nga nagbasa gikan sa pila makadawat usab mga sayup sa network ug maghulat nga mabalik ang koneksyon. Sa kini nga kaso, ang datos, siyempre, dili na isulat sa database.

Ang mosunod nga mga instruksyon gigamit sa paghimo ug pag-configure sa mga pila:

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. Mga dashboard

Kini nga sangkap gigamit sa paghanduraw sa datos sa pag-monitor. Sa kini nga kaso, kinahanglan nimo nga i-install ang ClickHouse datasource para sa Grafana 4.6+ plugin. Kinahanglan namon nga i-tweak kini aron mapauswag ang kahusayan sa pagproseso sa mga filter sa SQL sa dashboard.

Pananglitan, naggamit kami og mga variable, ug kung wala kini gibutang sa filter field, nan gusto namo nga dili kini makamugna og kondisyon sa WHERE sa porma ( uriStem = » AND uriStem != » ). Sa kini nga kaso, ang ClickHouse magbasa sa kolum sa uriStem. Sa kinatibuk-an, gisulayan namo ang lain-laing mga kapilian ug sa katapusan gitul-id ang plugin (ang $ valueIfEmpty macro) aron sa kaso sa usa ka walay sulod nga bili kini mobalik 1, nga walay paghisgot sa column mismo.

Ug karon mahimo nimong gamiton kini nga pangutana alang sa graph

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

nga naghubad niini nga SQL (timan-i nga ang walay sulod nga mga field sa uriStem nakabig ngadto sa 1 lang)

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

konklusyon

Ang dagway sa ClickHouse database nahimo nga usa ka landmark nga panghitabo sa merkado. Lisud mahanduraw nga, hingpit nga wala’y bayad, sa usa ka kalit kami armado sa usa ka kusgan ug praktikal nga himan alang sa pagtrabaho sa dagkong datos. Siyempre, uban sa nagkadaghang mga panginahanglan (pananglitan, sharding ug replication sa daghang mga server), ang laraw mahimong mas komplikado. Apan sa unang mga impresyon, ang pagtrabaho uban niini nga database mao ang kaayo makapahimuot. Makita nga ang produkto gihimo "para sa mga tawo."

Kung itandi sa ElasticSearch, ang gasto sa pagtipig ug pagproseso sa mga troso gibanabana nga makunhuran sa lima hangtod napulo ka beses. Sa laing pagkasulti, kung alang sa karon nga kantidad sa datos kinahanglan namon nga magbutang usa ka kumpol sa daghang mga makina, nan kung gigamit ang ClickHouse, usa ka gamay nga makina nga makina igo na alang kanamo. Oo, siyempre, ang ElasticSearch usab adunay on-disk data compression nga mga mekanismo ug uban pang mga bahin nga makapakunhod pag-ayo sa konsumo sa kapanguhaan, apan kon itandi sa ClickHouse, kini mas mahal.

Kung wala’y bisan unsang espesyal nga pag-optimize sa among bahin, sa mga default nga setting, pagkarga sa datos ug pagpili gikan sa database molihok sa usa ka katingalahang katulin. Wala pa kami daghang datos (mga 200 milyon nga mga rekord), apan ang server mismo huyang. Mahimo natong gamiton kini nga himan sa umaabot alang sa ubang mga katuyoan nga wala'y kalabutan sa pagtipig sa mga troso. Pananglitan, alang sa end-to-end analytics, sa natad sa seguridad, pagkat-on sa makina.

Sa katapusan, usa ka gamay bahin sa mga bentaha ug disbentaha.

Минусы

  1. Pag-load sa mga rekord sa daghang mga batch. Sa usa ka bahin, kini usa ka bahin, apan kinahanglan nimo nga mogamit dugang nga mga sangkap alang sa mga rekord sa buffering. Kini nga buluhaton dili kanunay sayon, apan masulbad gihapon. Ug gusto nako nga pasimplehon ang laraw.
  2. Ang ubang mga exotic functionality o bag-ong mga feature kasagarang maguba sa mga bag-ong bersyon. Kini ang hinungdan sa kabalaka, pagkunhod sa tinguha sa pag-upgrade sa usa ka bag-ong bersyon. Pananglitan, ang makina sa lamesa sa Kafka usa ka mapuslanon kaayo nga bahin nga nagtugot kanimo sa direkta nga pagbasa sa mga panghitabo gikan sa Kafka, nga wala ipatuman ang mga konsumedor. Apan kung hukman ang gidaghanon sa mga Isyu sa github, nag-amping gihapon kami nga dili gamiton kini nga makina sa produksiyon. Bisan pa, kung dili ka maghimo kalit nga mga lihok sa kilid ug gamiton ang panguna nga pag-andar, nan kini molihok nga lig-on.

Плюсы

  1. Dili mohinay.
  2. Ubos nga entry threshold.
  3. Bukas nga tinubdan.
  4. Libre.
  5. Maayo ang mga timbangan (sharding/replikasyon sa gawas sa kahon)
  6. Nalakip sa rehistro sa software sa Russia nga girekomenda sa Ministry of Communications.
  7. Ang presensya sa opisyal nga suporta gikan sa Yandex.

Source: www.habr.com

Idugang sa usa ka comment